筛选(标准)设计模式的正确实现

Correct implementation of the Filter (Criteria) Design Pattern

本文关键字:实现 设计模式 标准 筛选      更新时间:2023-10-16

设计模式解释如下: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万元数据记录没什么大不了的,如果你设计好你的查询翻译器,并且用合适的索引支持它,它会工作得很好。