2008-09-02 98 views
13

我已经听过很多次了,我们不应该将业务逻辑与其他代码混合在一起,或者像这样的语句。我认为我写的每一个代码(我的意思是处理步骤)由与业务需求相关的逻辑组成。应用程序中的“业务逻辑”究竟由什么组成?

任何人都可以告诉我究竟是什么组成的业务逻辑?它如何与其他代码区分开来?是否有一些简单的测试来确定什么是业务逻辑,哪些不是?

回答

42

用简单的英语简单定义你在做什么。当你在商业上说事情时,比如说“让那些受苦”,“偷那些钱”,“摧毁这部分地球”,你谈论的是商业层面。要说清楚,让你兴奋的事情就在这里。

当你说“在此显示”,“不要显示”,“使它更美丽”时,你正在谈论表示层。这些让你的设计师兴奋的事情。

当你说“保存这个”,“从数据库中获取”,“更新”,“删除”等事情时,你正在谈论数据层。这些是告诉你永远不惜一切代价保留的东西。

+0

这不像塞尔哈特imho解释的那么容易。有些东西可以从数据库中获取,并在业务层的内存中执行,或者在数据访问层完全执行。 – Elisabeth 2012-11-04 12:09:10

0

对于我来说,“业务逻辑”弥补了所有代表适用的问题域,以及上“什么做的数据”决定的逻辑数据实体..

所以它应该真正由“数据传输”(不是访问)和“数据操作”组成。实际上,数据访问(数据库中的东西)应该位于不同的层中,应该与表示代码一样。

0

如果它包含任何有关窗体,按钮等等的东西,它不是业务逻辑,它是表示层。如果它包含文件或数据库的持久性,则为DAL。两者之间的任何事情都是商业逻辑。事实上,任何非UI有时会被称为“业务逻辑”,但它应该涉及问题领域,而不是管家。

1

我不喜欢图层的BLL + DAL名称,它们比澄清更令人困惑。
称之为DataServices和DataPersistence。这将使它更容易。

服务操作,持久层CRUDs(创建,读取,更新,删除)

0

业务逻辑是纯粹的抽象,它存在独立于用户面前的数据的物化/可视化,以及独立的基础数据的持久性。

例如,在税收准备软件中,业务逻辑类的一个职责是计算所欠的税额。他们不负责显示报告或保存和检索报税表。


@Lars,“服务”意味着某种架构。

8

说起什么不是业务逻辑可能比较容易。数据库或磁盘访问不是业务逻辑。 UI不是业务逻辑。网络通信不是业务逻辑。

对我来说,业务逻辑是描述企业如何运作的规则,而不是软件架构如何运作。业务逻辑也有改变的趋势。例如,这可能是一项业务要求,即每个客户都有一个与其账户相关联的信用卡。此要求可能会更改,以便客户可以拥有多张信用卡。从理论上讲,这应该只是对业务逻辑的改变,软件的其他部分不会受到影响。

这就是理论。在现实世界中(正如您找到的那样),业务逻辑往往会在整个软件中传播。在上面的例子中,您可能需要将另一个表添加到数据库以保存额外的信用卡数据。你一定需要改变UI。

纯粹主义者认为业务逻辑应该总是完全独立,因此甚至会反对在数据库中具有名为“Customers”或“Accounts”的表。 如果采取极端行动,你最终会得到一个令人难以置信的通用的,不可能维护的系统。

支持将大部分业务逻辑保持在一起而不是将其拖拽到整个系统中是绝对有力的论据,但是(与大多数理论一样),您需要在现实世界中务实。

4

为了简化的东西单行...
业务逻辑将是代码,并不依赖于/不与特定的UI /实现细节改变.. 它的一个代码表示规则,流程等,这些定义或反映了正在建模的业务。

5

我认为你会混淆业务逻辑与你的应用程序需求。这不是一回事。当某人解释他/她的业务的逻辑时,它是这样的:

“当用户购买物品时,他必须提供送货信息,信息用xyz规则进行验证,之后他将收到发票并赚取点,这给y的折扣优惠x%“(对不起的例子)

当你实施这个业务规则,你必须考虑在二级要求,如信息如何呈现,它将如何以持久方式存储,与应用程序服务器通信,用户将如何收到发票等等。所有这些要求都不是业务逻辑的一部分,应该与其分离。这样,当业务规则发生变化时,您可以更轻松地调整代码。这是事实。

有时演示文稿会复制一些业务逻辑,主要是验证用户输入。但它也必须存在于业务逻辑层中。在其他情况下,为了解决性能问题,有必要将某些业务逻辑移至数据库。这由Martin Fowler here进行了讨论。

+0

我会补充说,业务逻辑必须在数据库级别多次出于数据完整性原因而不仅仅是性能。现实情况是,许多来源可能会影响数据库中的数据,如果必须应用业务规则,则它属于数据库。 – HLGEM 2009-09-17 20:57:10