反模式的名称是什么 !string.IsnullOrEmpty(Employee.Name), (Decapsulation ?)

What is name of anti pattern !string.IsnullOrEmpty(Employee.Name), (Decapsulation ?)

我经常 运行 编写代码,这样应该在业务对象中的逻辑到处重复:

if ( !string.IsNullOrEmpty( Employee.Name ) ) Display( Employee.Name );

应该是这样的:

if ( Employee.IsNameSpecified ) Display( Employee.Name );

并且Employee.IsNameSpecified具有指定值的逻辑。

这只是一个示例,许多其他示例与 OOP 相反,过程代码用于对业务对象做出逻辑决策。

Logic封装在BusinessObject中就是正常的OOP实践(或者名字不同的doeas?),相反的叫什么?解封装 ?

您可以将其视为 TDA 的一种风味(告诉,不要问)。

您在这里做什么:客户端代码检索另一个 class 拥有的 "property",然后根据该值做出决定。

TDA 准确地暗示了你的问题是什么:other class 应该为你做出决定 - 你的客户端代码不应该知道做出决定的规则.

但请注意这里的"recursion":提议的"solution"仍然违反了TDA。您 仍在 从另一个 class 获取值,以便客户端代码可以对其做出决定。

唯一的区别:在第一种情况下,您获取一个字符串,客户端检查该字符串是否为 null/empty;在第二种情况下,您获取一个布尔值来告诉您要做什么。

因此,"ideal" OO 解决方案更像是:

employee.display();

并且员工完全靠自己做正确的事情。但是可以肯定的是,这种实施很快就会变成违反 SRP 的例子——员工 class 真的应该了解 "displaying" 本身吗?!

您的示例不是反模式(并且违反了 MVC 模式):

  1. 您的员工 class 是您模型的一部分。
  2. 您的 if 必须在视图中 class。这就是视图 class 显示模型层元素的作用。
  3. 此处使用您的方法 IsNameSpecified 来确定是否必须显示您的员工姓名。

1+2+3 : 您的方法必须在您的视图中实现 class。 不在模型中

因此,按照您的逻辑(以及其他开发人员编写的逻辑!string.IsNullOrEmpty),此方法现在位于视图 class 中:IsNameSpecific(Employee e)。而它的实现只会包含一条指令。人家明明会选择不写这种方法的

@GhostCat : employee.display();显然是 错误 ... 想象一下,对于此应用程序的特定客户,员工只是一个数字。对于其他客户,它是一个名称和一个角色...等等...

您的模型的作用只是构造信息。不显示自己。