2014-01-09 166 views
0

我为研究目的编写代码,其中我搜索大量文件并根据它们的相关性对它们进行排名。我将整个过程称为快速搜索,它由两个连续的阶段组成 - 首先搜索文件并检索候选文件列表,然后对这些候选项进行评分并对它们进行排名。设计OOP解决方案

因此,快速搜索只是搜索方法和分数方法的串行组合。我打算实施各种搜索和评分方法,并且我想测试所有可能的组合并评估它们,以查看哪些是获胜的组合。

由于组合的数量会增长得非常快,因此在良好的结构和设计中编写代码非常重要。我考虑以下设计(我写在python的代码):

  1. 将接收指针给搜索和射手功能
  2. 甲quickSearcher类,将接收一个搜索器对象和射手对象A quickSearcher类
  3. 一个quickSearcher CALSS将从一个搜索类和一个得分手类继承

因为即时通讯基本上是EE工程师,林不知道如何与选项之间,如果这是一个常见的问题在CS琐碎模式选择设计我'米将寻找希望:

  1. 要非常代码体积效率的,因为一些搜索和评分方法在一个或两个参数的简单地不同的值不同。

  2. 很容易出现模块化和逻辑错误。

  3. 简便易用,可以

  4. 其他考虑我应该来导航?

这是我的第一个设计问题,所以它可能无效或缺少重要信息,如果是的话请通知我。

+0

您的评分​​方法是根据自己的信息将分数分配给一个文件,还是对多个文件做一些更复杂的工作? – utdemir

+0

它可以在一个文件上工作,但它确实做了复杂的工作,并将其分解为若干辅助功能。当score()函数适合时,它并不够简单。搜索方法也一样。 – idoda

+0

搜索引擎没有在公园散步。你有什么理由在自由开放源代码工作解决方案的时候自己写一个自己的理由? –

回答

1

类经常过度使用,特别是来自像Java和C#等语言的程序员,他们是强制性的。我建议观看演示文稿Stop Writing Classes

在决定是否要创建一个类是问自己以下几个问题有用:

1)请问类需要有多个方法?

如果这个类只有一个方法(除了__init__),那么你可以改为它的一个函数。如果需要在呼叫之间保持状态,则使用发电机。如果需要在一个地方创建一些参数,然后在别处调用,则可以使用闭包(返回另一个函数的函数)或functools.partial

2)它需要在方法之间共享状态吗?

如果类不需要在方法之间共享状态,那么可以用一组独立函数或更小类(或某种组合)来更好地替换它。

如果对这两个问题的答案是肯定的,那就继续创建一个班级。

对于您的示例,我认为选项1是要走的路。搜索者和记分员的对象听起来像他们,如果他们是类,他们只会有一种方法,可能被称为像executerun。改为使用它们的功能。

根据您的使用情况,quickSorter本身可能更适合作为函数或生成器,因此完全不需要任何类。

顺便说一句,在函数和指向函数的指针之间,Python没有区别。

+0

如果通过“保持状态”之间的调用你的意思是该函数需要它的本地变量之间相同的调用,然后不,它没有。搜索器和记分器方法都有4-5个辅助方法,因为它们都使用了大量离线收集的信息,所以它不仅是run()。关于国家共享,那么是的,我想初始化环境一次(加载大量信息和统计数据),然后评估不同的分数和搜索组合。不过,状态本身不会在通话之间改变。 – idoda

+0

即时充分利用你的答案是,我不够了解,并且我的Q已经到位。你能否向我推荐一篇更全面的文章,解释你所提出的所有考虑事项? – idoda