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
Oop 在选择可链接性和语言结构时,我应该考虑什么?_Oop_Chaining - Fatal编程技术网

Oop 在选择可链接性和语言结构时,我应该考虑什么?

Oop 在选择可链接性和语言结构时,我应该考虑什么?,oop,chaining,Oop,Chaining,我很难做出这个设计决定 我可以使用传统的新语言构造来初始化对象,并通过变量使用它们,例如: $o = new Object('arg'); $o->method(); $o->property = 'value'; $o->save(); 或者我可以选择工厂模式和积极的链接能力,如 Object::new('arg')->method()->setProperty('value')->save(); 这将导致 少到 阅读 维持 重构, 不需要命名变量。 然

我很难做出这个设计决定

我可以使用传统的新语言构造来初始化对象,并通过变量使用它们,例如:

$o = new Object('arg');
$o->method();
$o->property = 'value';
$o->save();
或者我可以选择工厂模式和积极的链接能力,如

Object::new('arg')->method()->setProperty('value')->save();
这将导致

少到 阅读 维持 重构, 不需要命名变量。 然而,我不确定这是否是一个可接受的方法,也不确定我是否忘记考虑一些事情


请表达您的担忧或同意,并指导我如何做出决定。

为什么不让多个构造函数接受初始化值。所以你会:

Object::new()
Object::new('arg1')
Object::new('arg1','arg2')

等等。

为什么不让多个构造函数接受初始化值呢。所以你会:

Object::new()
Object::new('arg1')
Object::new('arg1','arg2')

等等。

我非常喜欢你的“可链接”设计。这种设计有时被称为“可链接”设计。

我非常喜欢你的“可链接”设计。这种设计有时被称为a。

我对最近流行的流畅界面有着复杂的感觉

对我来说,当整个方法链从头到尾表达单个概念时,流畅的接口是有意义的。例如:

var SuperLate = (new Coffee()).AddMocha().AddCream().Invert().Blend();
每个步骤都需要链的上下文来理解,链中方法的执行顺序也很重要。若在反转之前调用Blend,则会出现混乱

在您的示例中,接口的方法之间几乎没有时间耦合。设置属性和执行方法不应依赖于顺序。我相信,为常规方法调用和属性操作引入一个流畅的接口只会增加接口的复杂性,同时提供时间耦合的感觉

此外,添加fluent接口会增加每个方法之间的耦合,因为它们现在依赖于彼此的返回值。当每个方法只表达整体概念的一部分(如煮咖啡的步骤)时,这种耦合是有意义的,但当每个方法单独存在时,可能会阻碍未来的重构


虽然它可能更为冗长,但我不建议为常规方法调用和属性设置引入fluent接口。

我对最近的fluent接口时尚有着复杂的感觉

对我来说,当整个方法链从头到尾表达单个概念时,流畅的接口是有意义的。例如:

var SuperLate = (new Coffee()).AddMocha().AddCream().Invert().Blend();
每个步骤都需要链的上下文来理解,链中方法的执行顺序也很重要。若在反转之前调用Blend,则会出现混乱

在您的示例中,接口的方法之间几乎没有时间耦合。设置属性和执行方法不应依赖于顺序。我相信,为常规方法调用和属性操作引入一个流畅的接口只会增加接口的复杂性,同时提供时间耦合的感觉

此外,添加fluent接口会增加每个方法之间的耦合,因为它们现在依赖于彼此的返回值。当每个方法只表达整体概念的一部分(如煮咖啡的步骤)时,这种耦合是有意义的,但当每个方法单独存在时,可能会阻碍未来的重构


虽然它可能更详细,但我不建议为常规方法调用和属性设置引入fluent接口。

fluent接口的好处在于,代码的精华不会在额外的语法管道中丢失,从而更易于阅读。然而,与逐行程序方法相比,它是一种不太熟悉的习惯用法,并且没有那么普遍;例如,并非所有的代码结构都适合这种风格

if (something) $o->method();
不会翻译得那么干净。因此,如果这些事情是典型的,它可能不是一个很好的适合

还考虑环绕它的其他代码的上下文。如果代码主要是这些类似样板的片段

$o = new Object('arg');
$o->method();
$o->property = 'value';
$o->save();
那么,让它们更简洁肯定是一种进步。但如果这样的代码会以不同的风格在其他代码中丢失,也许不会


如果这看起来可能是个好主意,我会说去做。如果效果不好,切换回来的小小努力将值得学习体验。

流畅界面的好处在于,代码的精华不会在额外的语法管道中丢失,从而更易于阅读。然而,与逐行程序方法相比,它是一种不太熟悉的习惯用法,并且没有那么普遍;例如,并非所有的代码结构都适合这种风格

if (something) $o->method();
不会翻译得那么干净。因此,如果这些事情是典型的,它可能不是一个很好的适合

还考虑环绕它的其他代码的上下文。如果代码主要是这些类似样板的片段

$o = new Object('arg');
$o->method();
$o->property = 'value';
$o->save();
那么,让它们更简洁肯定会b 这是一个进步。但如果这样的代码会以不同的风格在其他代码中丢失,也许不会


如果这看起来可能是个好主意,我会说去做。如果效果不好,那么花一点力气切换回去是值得的。

请记住,虽然我假设你在寻找语言不可知论的答案,但有些语言的风格表明了一种或另一种选择。我猜这是Perl还是PHP?是的,我希望会有特定于PHP的答案,但是独立于语言的建议也会很有帮助。请注意,虽然我假设您正在寻找与语言无关的答案,但有些语言的风格会建议一种或另一种选择。我猜这是Perl还是PHP?是的,我希望会有特定于PHP的答案,但是独立于语言的建议也会非常有用。我很高兴你喜欢它。尽管如此,除了fanatism,还有什么可以提及的吗?我想你已经很好地总结了它的好处:由于缺乏明确的局部状态和一般的缺点,更易于阅读/维护/重构。我很高兴你喜欢它。尽管如此,除了fanatism,还有什么可以提及的吗?我想你已经很好地总结了它的好处:由于缺乏明确的局部状态和一般的简短性,更易于阅读/维护/重构。我可能没有为这个例子选择最佳的例程名称,但我更喜欢配置对象,而不是多个setter调用。如您所见,该示例还引导对象从初始化到保存。秩序独立性是唯一困扰你的问题吗?我更担心的是结构的规模。我见过的最流畅的接口都是将小组件映射成大型构件的nHibernate映射。小部件并不是真正独立存在的。配置和保存对象不是单个构造。这是一系列谨慎的步骤。这就是为什么我觉得流畅的界面不合适的原因。然而,这只是我的观点。太糟糕了,新的OO语言不支持原始Smalltalk所做的交互。在Smalltalk中,通过分号将多条消息分隔开来,将多条消息发送到一个对象是一件简单的事情。矩形新颜色:红色;addToCanvas:mainCanvas。我同意大型构造在某些边缘情况下使代码难以维护,但我主要计划在ORM和其他基本对象集中实现流畅的接口,因此它可能会加快开发速度。不过,谢谢你的反对意见+1I可能没有为本例选择最佳的例程名称,但我更喜欢配置对象而不是多个setter调用。如您所见,该示例还引导对象从初始化到保存。秩序独立性是唯一困扰你的问题吗?我更担心的是结构的规模。我见过的最流畅的接口都是将小组件映射成大型构件的nHibernate映射。小部件并不是真正独立存在的。配置和保存对象不是单个构造。这是一系列谨慎的步骤。这就是为什么我觉得流畅的界面不合适的原因。然而,这只是我的观点。太糟糕了,新的OO语言不支持原始Smalltalk所做的交互。在Smalltalk中,通过分号将多条消息分隔开来,将多条消息发送到一个对象是一件简单的事情。矩形新颜色:红色;addToCanvas:mainCanvas。我同意大型构造在某些边缘情况下使代码难以维护,但我主要计划在ORM和其他基本对象集中实现流畅的接口,因此它可能会加快开发速度。不过,谢谢你的反对意见+1.