在可链接性和语言结构之间进行选择时应该考虑什么?

时间:2009-11-09 17:05:59

标签: oop chaining

我很难做出这个设计决定。

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

$o = new Object('arg');
$o->method();
$o->property = 'value';
$o->save();

或者我可以像

那样选择工厂模式和积极的可链接性
Object::new('arg')->method()->setProperty('value')->save();

会导致

  • 减去LOC
    • 读取
    • 保持,
    • 重构,
  • 无需命名变量。

但是,我不确定这是否是一种可以接受的方法,如果我忘了考虑一些事情。

请表达您的担忧或协议,以及如何做出决定的指导。

4 个答案:

答案 0 :(得分:3)

我对最近的Fluent Interface时尚感到好奇。

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

var SuperLate = (new Coffee()).AddMocha().AddCream().Invert().Blend();

每个步骤都需要链的上下文有意义,并且链中的方法执行的顺序很重要。如果在Invert()之前调用Blend(),则会出现混乱。

在您的示例中,接口方法之间几乎没有时间耦合。设置属性和执行方法不应该依赖于顺序。我认为为常规方法调用和属性操作引入流畅的接口只会增加界面的复杂性,同时给出时间耦合的感知。

此外,添加流畅的界面会增加每种方法之间的耦合,因为它们现在依赖于彼此的返回值。当每种方法仅表达整体概念的一部分(如制作咖啡时的步骤)时,这种耦合是有意义的,但当每种方法独立时,可能会阻碍未来的重构。

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

答案 1 :(得分:1)

我是你'可链式'设计的忠实粉丝。这种设计有时称为Fluent Interface

答案 2 :(得分:1)

流畅的界面有什么好处,代码的内容不会在额外的语法管道中丢失,使其更容易阅读。然而,这是一种比逐行程序方法更不熟悉的习语,而不是一般的;并非所有代码结构都适合这种风格,例如

if (something) $o->method();

不会干净利落地翻译。因此,如果这些事情是典型的,那可能不太适合。

还要考虑围绕它的其他代码的上下文。如果代码主要是这些样板文件,如

$o = new Object('arg');
$o->method();
$o->property = 'value';
$o->save();
然后让它们更简洁肯定会有所改善。但是,如果这些代码会以不同的风格丢失在许多其他代码中,也许不会。

如果看起来这可能是一个好主意,我会说去吧。如果它不能很好地发挥作用,那么转回的微小努力将值得学习。

答案 3 :(得分:0)

为什么不具有多个构造函数来获取初始化值。所以你会:

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