Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 反模式的名称是什么!string.IsnullOrEmpty(Employee.Name),(解除封装?)_Oop_Design Patterns_Code Standards - Fatal编程技术网

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

Oop 反模式的名称是什么!string.IsnullOrEmpty(Employee.Name),(解除封装?),oop,design-patterns,code-standards,Oop,Design Patterns,Code Standards,我经常遇到这样的代码,即应该在业务对象中的逻辑到处重复: if ( !string.IsNullOrEmpty( Employee.Name ) ) Display( Employee.Name ); 应该是这样的: if ( Employee.IsNameSpecified ) Display( Employee.Name ); 并且Employee.isnamesspecified具有指定值的逻辑 这只是一个例子,其他许多例子与OOP相反,OOP是用于对业务对象做出逻辑决策的过程代码 当

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

if ( !string.IsNullOrEmpty( Employee.Name ) ) Display( Employee.Name );
应该是这样的:

if ( Employee.IsNameSpecified ) Display( Employee.Name );
并且
Employee.isnamesspecified
具有指定值的逻辑

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


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

你可以把它看作是(告诉,不要问)的一种味道

这里要做的是:客户机代码检索另一个类拥有的“属性”,然后根据该值做出决定

TDA确切地暗示了您的问题是关于什么的:其他类应该为您做出该决定——您的客户机代码不应该知道做出该决定的规则

但请注意这里的“递归”:提议的“解决方案”仍然违反TDA。您仍然在从另一个类获取一个值,以便客户机代码可以对此作出决定

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

因此,“理想的”OO解决方案更像:

employee.display();

而员工完全靠自己做正确的事情。但是可以肯定的是,这个实现很快就会变成对SRP的违反——例如,Employee类真的应该知道“显示”自己吗

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

  • Employee类是模型的一部分
  • 您的if必须在视图类中。这就是视图类显示模型层元素的角色
  • 您的方法是IsNameSpecified,此处使用该方法确定是否必须显示员工的姓名
  • 1+2+3:您的方法必须在视图类中实现不在模型中

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

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


    模型的作用是仅构造信息。我从来没有听说过它的名字。我只是说它“违反了封装”或“违反了关注点的分离”。你可以称它为“意大利面代码”或“copypasta”。@4castle:copypasta是新的!以前从没听说过,谢谢!是否应在该业务对象的ViewModel中显示?valod显示值的规则可以集中,我想这取决于实际的上下文。如果您的业务对象有一个视图模型,那么可能是的。我认为附加的问题实际上取决于您的总体设计和模型。我真的很喜欢“您的模型的作用只是构造信息,而不是显示自己”非常有洞察力,谢谢