文章和评论类:谁负责什么?

时间:2014-04-05 18:35:04

标签: oop separation-of-concerns

考虑Law of DemeterSingle Responsibility PrincipleTell, Don't Ask原则; Article Comment 类之间的正确关系是什么?

答: 评论 Article 类的关注点。它可以读取创建更新删除注释。 Comment 类本身只是 Comment 概念的只读表示。

B: 评论 HandleComments 类的关注点。它可以创建新评论并将其分配给相应的文章。它还可以读取更新删除注释。 Comment 类本身只是 Comment 概念的只读表示。

C: 评论不是 Article HandleComments 类的关注点。它本身具有所有CRUD功能。它也可以本身分配给文章。

D: 评论可能是 Article HandleComments 类的关注点;但是,他们只能读取创建删除评论。 更新功能是 Comment 类本身的一个问题。

更新#1

以下是我对此的看法,但无法找到答案,因为我的所有阅读都归结为非实用或非常简单的概念验证示例:

  • 我是否必须拥有 readComment createCommnet updateComment deleteComment 类?根据带有 Verbal PerformSomething Bertrand Meyer 类,名称是危险的迹象,因为它们可能是方法而不是类。那么只有 Article Comment 类可以自己拥有所有各自的功能吗?
  • 文章评论没有is-a关系,所以这里显然没有继承,但是他们有一个has-a关系。那我是去作文,但是谁对什么负责?如果我是评论那么这是我对更新的关注,对吗?但文章的关注删除我?因此,我附属于它。
  • 文章是否需要加载评论?或者应该有一个中间人来处理 Article Comment 之间的关系?如果评论已由文章加载,则文章的一个问题是对所有评论<100%负责/ em>行动?

更新#2

更多地考虑它,我真正想要的是尽可能松散耦合类。在任何情况下, Article 类都应该有一个 Comments 列表,以便在它们之间进行迭代。为了将评论分配给文章,我应该将文章引用传递给评论构造函数 - - 最下层的方式,或者我应该将注释引用传递给 Article 类的 AddComment 方法 - 这是最上层的方式。

我更喜欢 Bottom-Top-Way ,即使它在第一眼看上去很尴尬,因为那样我也可以在中拥有所有其他 Comment 动作em>评论类本身,因此 Article 类将完全不知道 Comments 类。 Article 类应该具有的唯一内容是用于保存 Comments 实例的内部数组。无需将 AddComment RemoveComment 方法添加到 Article 类。

这是否有意义?

2 个答案:

答案 0 :(得分:1)

在不了解系统的情况下,很难回答您的问题(更新2中的具体内容)。例如,可以考虑引用文章的评论或引用评论的文章。随着更多细节,特别是用例,可能会有一个设计出现在前面。

毫无疑问,在没有进一步信息的情况下,这是你的第二个要点,即构图,这对我来说是最自然的。也就是说,文章有一个评论列表,一个标题,一个正文等。你可能有也可能没有一个CommentsList中间类。在任何情况下,您都可以创建,删除和获取对注释对象的引用。评论包含文字,链接,格式等。

重新更新2,我同意松耦合是可取的。但是我不同意将一个文章的引用传递给Comment构造函数是有道理的,所有其他条件都是相同的。这引入了一个循环依赖 - 因为文章有一个注释列表 - 因此,如果你采用替代的“上下”方法将Comment传递给AddComment方法,那么耦合度也会更高。文章类。

使用这种“自上而下”的方法,文章可以使用NewComment方法,在这种情况下,文章本身会创建Comment对象,或者它可以按照您的建议使用AddComment方法。哪个更好取决于要求的细节:例如,要求有不同类型的评论(甚至在文章之间共享评论)将建议使用AddComment方法。

答案 1 :(得分:0)

感谢Bart条评论,我决定选择Repository Design Pattern,这似乎是处理此类案件的经过实战考验的模式之一。

一般的想法是拥有存储库,它负责处理注释。因此,从更广泛的角度来看, Blog 应该至少有一个 postRepository commentRepository 来处理博客帖子评论功能。

当需要一种中央功能时,还建议使用存储库模式处理所有 List 类似的数据。在 Blog 示例中,为类别标记用户等创建存储库也是有意义的。