【发布时间】:2014-03-14 16:29:22
【问题描述】:
问题:使用多种方法实现流畅的接口会导致类复杂度指标增长得非常快 快。
实现流畅接口的类如何保持低复杂度?
关于特定类的一些信息:
- 类已经有 25 个方法,而且还会再增加 15 个。
- 类中的所有方法都以一种或另一种方式转换
$this->wrapped对象。 - 几个 (5-7) 方法重用了现有的方法(可以提取到类中并通过继承添加,这里没有问题)。
已经考虑过的选项:
- 特性 - 我想支持 PHP 5.3 及更高版本。
- 每个方法一个类 - 大量扩展链,不好。
- 'Plugins' - 帮助类以某种方式注入“主类”,通过魔术方法调用,并通过
@method注释添加自动完成支持。
反馈(关于设计、性能、可维护性等)备受期待。
检查示例:
Lodash:170 种方法,1 类,8400 行
Doctrine2 QueryBuilder:40+40-ish 方法,2 个类,1400+600 行代码; 通过
ExpressionBuilder类分隔Symfony2 FormBuilder:10 种公开方法,1 类,300 行
可以将问题视为与语言无关 - 从 PHP 实现和设计的角度回答同样受欢迎。
编辑:
目标是为函数式编程(map、reduce 等)提供漂亮(易于使用和易于维护)的工具
【问题讨论】:
-
如果流畅的界面增加了那么多复杂性,不围绕流畅的界面进行设计怎么样?
-
你到底在想什么?
-
抱歉,我不明白fluent interfaces 是如何增加类的复杂性的。具有和不具有流畅接口的类之间的区别在于在方法中返回对同一对象实例(
$this)的引用,该引用不返回其他值,最多增加 1 个 LOC pro 方法(并且没有额外的圈复杂度)。还是您的意思是流畅界面和/或复杂性的另一种定义? @Im0rtality -
理论上你是对的。然而实际上这些方法将有超过 1 个 LOC/方法(它必须在
return $this之前做一些事情)。复杂性很快就会增加。
标签: php language-agnostic chaining fluent-interface