反模式的名称是什么 !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 模式):
- 您的员工 class 是您模型的一部分。
- 您的 if 必须在视图中 class。这就是视图 class 显示模型层元素的作用。
- 此处使用您的方法 IsNameSpecified 来确定是否必须显示您的员工姓名。
1+2+3 : 您的方法必须在您的视图中实现 class。 不在模型中。
因此,按照您的逻辑(以及其他开发人员编写的逻辑!string.IsNullOrEmpty),此方法现在位于视图 class 中:IsNameSpecific(Employee e)。而它的实现只会包含一条指令。人家明明会选择不写这种方法的
@GhostCat : employee.display();显然是 错误 ... 想象一下,对于此应用程序的特定客户,员工只是一个数字。对于其他客户,它是一个名称和一个角色...等等...
您的模型的作用只是构造信息。不显示自己。
我经常 运行 编写代码,这样应该在业务对象中的逻辑到处重复:
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 模式):
- 您的员工 class 是您模型的一部分。
- 您的 if 必须在视图中 class。这就是视图 class 显示模型层元素的作用。
- 此处使用您的方法 IsNameSpecified 来确定是否必须显示您的员工姓名。
1+2+3 : 您的方法必须在您的视图中实现 class。 不在模型中。
因此,按照您的逻辑(以及其他开发人员编写的逻辑!string.IsNullOrEmpty),此方法现在位于视图 class 中:IsNameSpecific(Employee e)。而它的实现只会包含一条指令。人家明明会选择不写这种方法的
@GhostCat : employee.display();显然是 错误 ... 想象一下,对于此应用程序的特定客户,员工只是一个数字。对于其他客户,它是一个名称和一个角色...等等...
您的模型的作用只是构造信息。不显示自己。