筛选(标准)设计模式的正确实现
Correct implementation of the Filter (Criteria) Design Pattern
设计模式解释如下:http://www.tutorialspoint.com/design_pattern/filter_pattern.htm
我正在开发一款与Adobe Lightroom或ACDSee非常相似的软件,但用途不同。用户(摄影师)可以从他的硬盘上导入数千张图片(如果有超过100k/200k的图片也不会很奇怪)。
我们有一个侧面板,用户可以创建自定义的"过滤器",它是表达式,如:
Does contain the keyword: "car"
AND
Does not contain the keyword "woods"
AND
(
Camera model is "Nikon D300s"
OR
Camera model is "Canon 7D Mark II"
)
AND
NOT
Directory is "C:today_pictures"
你可以从上面的例子中得到大意。
我们有一个存储所有图像信息的SQLite数据库。问题是,我们是否应该在第一次加载程序时将所有照片对象从数据库加载到内存中,并像上面引用的网站中解释的那样实现标准/过滤器设计模式,以便我们的标准类过滤对象,或者更好地让标准类实际生成一个SQL查询,最终执行,以便从数据库中检索所需的内容?
我们正在用c++ (QT)开发程序。
TL;DR:它已经在SQLITE3中正确实现了,看看这花了多长时间。你将面临同样的负担。
从数据库中读取数据并将其再次存储在另一个数据结构中,这将是一个可怕的数据重复情况。使用数据库查询实现用户给您的查询。让数据库执行查询。这就是数据库的作用。
通过重新实现约500k条记录的搜索/查询系统,您将自己重写大量的bog标准数据库。这基本上是毫无意义的练习。SQLITE3经过了非常良好的测试,基本上是万无一失的。即使重新实现其功能和可靠性/弹性的一小部分,也需要花费数千小时的工作。如果这还不能让人觉得是在"重新发明轮子",我不知道还有什么能。
数据库还允许您非常容易地实现向前看/下拉,以帮助用户编写查询。例如,当你输入"相机型号是"时,用户可以有一个自动完成选项或下拉选项来选择一个或多个型号。
你为一个数据库付出了"代价",如果这一切都被浪费了,那就太遗憾了。所以,使用它。它会给你很多的杠杆作用,并允许你实现功能的速度比其他方式快两个数量级。
你链接到的模式只是一个模式。这并不意味着它是如何设计应用程序以执行实际数据的精确蓝图。最终,您将与诸如并发性(运行一个文件扫描线程来更新元数据)、索引、面对崩溃时的弹性等问题作斗争。最后,您将为您的特定应用程序重新实现大量SQLITE。50万元数据记录没什么大不了的,如果你设计好你的查询翻译器,并且用合适的索引支持它,它会工作得很好。
- 下面抽象工厂设计模式的实现是正确的吗
- 实现通用工厂设计模式
- 在任何编译语言中实现以下语法(用于工厂设计模式)? 最好是 Kotlin,C++
- 在C 中实现HAL的设计模式
- 与访问者设计模式的实现相关的问题
- 如何更好地实现我的C++设计模式
- 实现流水线模式、设计和函数指针问题
- 设计模式(GoF模式)在c++中的实现
- GOF复合设计模式CompositeObject::删除C++中的递归实现
- STL实现的MVP设计模式
- 命令设计模式的实现存在一些错误
- 实现适配器设计模式时链接器错误
- 筛选(标准)设计模式的正确实现
- 使用策略设计模式实现输入类
- 设计模式-如何在c++中实现realloc
- 在这种情况下,哪种设计模式有利于实现运行 tiime 多态性
- c++设计模式问题.单接口多实现
- 具有默认实现的抽象工厂设计模式
- 在遵循pimpl设计模式的类中实现move语义的正确方法是什么?
- 设计模式——在c++中,当实现(一组单例)直接从它们的编译单元在某个注册表中自注册时,它被称为什么?