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

时间:2016-09-08 03:20:56

标签: oop design-patterns code-standards

我经常遇到代码,应该在业务对象中的逻辑在任何地方重复:

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

应该是这样的:

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

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

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

当Logic被封装在BusinessObject中时,它只是普通的OOP实践(或者有不同名称的doeas?),相反的是什么?解封?

2 个答案:

答案 0 :(得分:2)

你可以看到TDA的一种风味(告诉,不要问)。

您在这里做的是:客户端代码检索"属性"由另一个类拥有,然后根据该值做出决定。

TDA完全暗示了您的问题:其他类应该为您做出决定 - 您的客户端代码不应该知道做出该决定的规则。

但请注意"递归"这里:建议的"解决方案"仍违反TDA。您仍然从另一个类中获取值,以便客户端代码可以对其做出决定。

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

所以,"理想" OO解决方案更像是:

employee.display();

员工完全靠自己做正确的事。但可以肯定的是,这种实现很快就会变成违反SRP的行为 - 如果员工类真的知道"显示"本身?!

答案 1 :(得分:1)

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

  1. 您的员工类是您的模型的一部分。
  2. 您的if必须在View类中。这是View类的作用,用于显示Model层的(a)元素。
  3. 此处使用您的方法IsNameSpecified来确定是否必须显示您的员工姓名。
  4. 1 + 2 + 3:您的方法必须在您的视图类中实现。 不在模型中

    因此遵循您的逻辑(以及其他开发人员编写的字符串!string.IsNullOrEmpty),此方法现在位于View类中: IsNameSpecific(Employee e)。它的实现只包含一条指令。人们显然会选择不写这种方法。

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

    模型的作用是仅构建信息。不显示自己。