我经常遇到代码,应该在业务对象中的逻辑在任何地方重复:
if ( !string.IsNullOrEmpty( Employee.Name ) ) Display( Employee.Name );
应该是这样的:
if ( Employee.IsNameSpecified ) Display( Employee.Name );
并且Employee.IsNameSpecified
具有指定值的逻辑。
这只是一个例子,许多其他人想到的是与OOP相反的过程,程序代码用于做出关于业务对象的逻辑决策。
当Logic被封装在BusinessObject中时,它只是普通的OOP实践(或者有不同名称的doeas?),相反的是什么?解封?
答案 0 :(得分:2)
你可以看到TDA的一种风味(告诉,不要问)。
您在这里做的是:客户端代码检索"属性"由另一个类拥有,然后根据该值做出决定。
TDA完全暗示了您的问题:其他类应该为您做出决定 - 您的客户端代码不应该知道做出该决定的规则。
但请注意"递归"这里:建议的"解决方案"仍违反TDA。您仍然从另一个类中获取值,以便客户端代码可以对其做出决定。
唯一的区别:在第一种情况下,你获取一个字符串,客户端检查该字符串是否为空/空;在第二种情况下,您获取一个布尔值,告诉您该怎么做。
所以,"理想" OO解决方案更像是:
employee.display();
员工完全靠自己做正确的事。但可以肯定的是,这种实现很快就会变成违反SRP的行为 - 如果员工类真的知道"显示"本身?!
答案 1 :(得分:1)
您的示例不是反模式(并且违反了MVC模式):
1 + 2 + 3:您的方法必须在您的视图类中实现。 不在模型中。
因此遵循您的逻辑(以及其他开发人员编写的字符串!string.IsNullOrEmpty),此方法现在位于View类中: IsNameSpecific(Employee e)。它的实现只包含一条指令。人们显然会选择不写这种方法。
@GhostCat:employee.display();显然是错误 ...想象一下,对于这个应用程序的特定客户,员工只是一个数字。对于其他客户,它是一个名称和一个角色......等等......
模型的作用是仅构建信息。不显示自己。