【问题标题】:Are there times when combining business logic and data structures is a good idea? [closed]有时结合业务逻辑和数据结构是个好主意吗? [关闭]
【发布时间】:2014-01-30 19:37:48
【问题描述】:

最近有人告诉我,如果编写一个数据结构——暂时——只需要一种业务逻辑,我应该将所有逻辑直接构建到类中,只担心将其移动到当结构需要不同的逻辑时,一个单独的类。

我的问题是:这是一种好的做法,还是如果业务逻辑有可能发生改变的合理可能性,最好从一开始就将逻辑和结构分开?

我的直觉是保持逻辑分离,因为这似乎遵循开放/封闭原则,将结构和逻辑结合起来似乎违反了 SRP。

【问题讨论】:

  • 另一方面,您是否可能构建包含自己的 no 逻辑的数据结构?另外,请参阅YAGNI
  • @Damien_The_Unbeliever 数据结构需要(并且应该)包含的唯一逻辑是关于如何存储和查询通用数据。
  • @delnan - 好吧,这是对整个面向对象方法的拒绝。我并不是说它是错误的,只是它还不一定是主流。
  • @Damien_The_Unbeliever 不,这是关注点分离。您是说“整个面向对象的方法”包括混合关注点,例如组织对象和这些对象的行为?那会是新闻。这个原则非常主流,基本上每种语言的标准库容器都遵循它。看看Java的集合,C++的标准容器,C#的System.Collections等。
  • @Damien_The_Unbeliever,很多很多数据结构都不包含自己的逻辑。例如,查看匿名类型的所有用法。

标签: c# data-structures business-logic


【解决方案1】:

这是一个相当主观的问题,本质上触及了面向对象编程的核心,其中结合数据和逻辑是常态。如果数据结构用于与另一个系统通信(基本上遵循接口定义语言方法),或者如果存在逻辑特定于非常特定上下文的情况,我通常更喜欢将数据结构与相关逻辑分开。

在面向对象语言中的列表、队列和字典等情况下,数据和逻辑结合起来形成一个有凝聚力的对象,并且相互依赖。在这些情况下,在像 C# 这样的面向对象语言中,将逻辑和数据分开是没有意义的。

但是,在其他特定情况下,将数据和逻辑分开是有意义的。例如,如果您正在创建一个 Invoice 对象,并且它需要由任意数量的下游系统处理,那么您不希望将这些下游系统的逻辑放在您的 Invoice 中。相反,该逻辑应该被分离出来。

所以,我想简短的回答是:这真的取决于你在做什么。

希望这会有所帮助, 内特

【讨论】:

  • 同意列表等。我想我想问的是……如果我需要从 Foo 类型转换为 List 类型,我不会将 List 扩展到将 Foo 用作新的 List(Foo) 或 List.Add(Foo)。我会创建一个处理翻译并返回列表的方法或接口。类似地,对于数据库,我可能有一个允许添加、删除、创建等的类,但是使用数据库的 Add() 方法获取原始数据并将其放入数据库的逻辑将是分开的。那正确吗?是否有时将两者结合起来是正确的?
  • @Josh,这又取决于。在数据库的情况下,我通常同意你的看法,不要将数据结构与数据库代码结合起来,因为它确实代表了非常强的关注点分离。但是,有一种非常流行的模式称为 ActiveRecord(有关详细信息,请参阅 en.wikipedia.org/wiki/Active_recordcastleproject.org/projects/activerecord),它确实将您的数据库 .Add() 方法与数据结构相结合。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-14
  • 1970-01-01
  • 1970-01-01
  • 2012-08-26
  • 1970-01-01
  • 2015-01-05
  • 2021-08-29
相关资源
最近更新 更多