这是有关类定义的问题。 当然,我已经在互联网上阅读了无休止的例子,所谓的课。我读过,构成事物的是所有动词和名词。我了解具有大小,颜色和驾驶等方法的汽车类的概念
我也理解这样的想法,即班级应该只承担一个责任,并遵守其他SOLID原则
我的问题与我开发的程序有关。
该程序的责任是从文档中提取所有相似的单词。因此,它不是像汽车或动物那样的“名词”,而是我认为的动词类型类。
为了执行此操作,程序将遍历一个文本文件文件夹,提取所有文本,先按行将文本拆分,然后再拆分20个字符,然后按相似性将一个文件中的每个块与其他所有块进行比较,仅保留两个文件之间相似的单词,清除单词以去除各种字符,然后将单词添加到文本文件,并对文件夹中的所有文件重复此操作。
因此,我对班级负有责任,并且为逗号之间的每个短语编写了方法。
阅读了有关类设计的更多信息之后,对我来说,其中某些方法本身就是类。如果一个类是由一个职责定义的,那么大概我可以定义更多的类来代替这些方法。例如。为什么我没有一个只用一种方法来查找单词相似性的类。...
因此,我的问题是,如果方法也具有单一职责,并且该类未定义事物而是更多的动作,那么如何在单个责任基础上定义类。定义类的边界是什么?
请不要...'您读过'...因为我已经阅读了所有内容。简单说明,并举例说明(概念示例很好)
答案 0 :(得分:4)
“单一责任”一词非常含糊。我发现根据 cohesion 和 coupling 来考虑它要容易得多。简而言之,我们必须将趋于一起改变(即具有高度凝聚力)的事物归为一类,而将不趋于(即是松散耦合的)事物归为单独的类。
在实践中,这意味着倾向于使用相同“数据”的事物属于同一类。如果数据没有离开对象,则可以很容易地强制执行。更实际的是,这意味着避免使用“ getter”方法从对象返回数据。
关于您的问题。您说的不是名词,而是因为您不这样认为。您的“业务逻辑”是什么?从SimilarWords
收集Document
。两者都是名词。您的短语都是关于应采取的步骤。根据所涉及的事物以及这些事物将为您做什么 action 重新考虑您的应用程序。
这里是您所描述事物的简短/不完整设计:
public interface Folder {
public SimilarWords extract();
}
含义:我想从文件夹 提取 类似单词。
public interface TextFile {
public void chunk(Consumer<Chunk> chunkConsumer);
}
含义: TextFile 分块文本。
public class Comparison {
public Comparison(TextFile file1, TextFile file2);
public SimilarWords extract();
}
含义:比较两个 TextFiles 来自 SimilarWords 的来源。您没有明确使用“比较”一词,我弥补了这一点。
当然,需要为所有文件对(?)将 SimilarWords 添加到一起,然后写入某些输出:
public interface SimilarWords {
public SimilarWords add(SimilarWords other);
public void writeTo(OutputStream output);
}
所以这将是一个适当的OO设计。我没有了解您域的所有详细信息,因此该模型可能并非您想要的,但我想您已经明白了。
答案 1 :(得分:1)
让我们考虑一下您的问题,一般问题和SRP。
SRP指出,一类应该关注一件事。这并不完全意味着只有一个方法只做一件事。
实际上,这也可以在OOP之外应用:函数只能做一件事。
现在想象您的程序必须实现200个功能。想象它们是如此简单,以至于单个功能足以实现任何功能。并假设您仅使用函数。按照相同的原理,您必须编写(至少)200个函数。现在,它看起来并不那么好。首先,您的程序结构看起来像是无尽的微型代码清单。其次,如果它们是微型尺寸的,它们自己就不能做很多事情(每次看都不错)。正如您怀疑的那样,功能通常在现实世界中不会映射到单个功能。第三,如果他们什么都不做,他们就必须向别人询问一切。或有人在其他地方这样做。因此,在某个地方,函数或类正在调用所有其他地方。那个地方集中了很多关于系统的知识。它必须了解所有内容,才能呼叫所有人。这对架构不利。
替代方法是分发知识。 如果您允许这些函数或类做更多的事情,它们向其他人询问的事情就会减少,其中一些事情将在本地解决。让我猜猜。由于所有这些类都在同一应用程序中,因此其中一些彼此相关。他们可以组成一个小组并进行协作。也许它们可以是同一个类,或者可以从其他类继承。这减少了通信路径。交流变得更加本地化。
通信路径很重要。想象一下,您的公司中有125个人,并且公司需要做出集体决策。您是要召开125人会议,还是将您的小组讨论分成5组,每组由5人组成的5人小组,而举行小型会议,然后团队和小组负责人见面?这是一种可以帮助事情的层次结构或结构形式。
您能想象新结构中的扇入和扇出吗? 5/5/5比1/125好很多。
所以这是一个权衡。您正在按职责交换通信路径。您最终想要的是一个合理的架构,并且知识分布均匀。