何时使用链接
函数链接在带有自动完成功能的IDE较为普遍的语言中很普遍。例如,几乎所有的C#开发人员都使用Visual Studio。因此,如果您使用C#进行开发,则将链接添加到方法中可以为该类用户节省时间,因为Visual Studio将帮助您构建链接。
另一方面,本质上具有高度动态性且通常在IDE中通常不具有自动完成支持的语言(如PHP)将看到较少支持链接的类。仅当采用正确的phpDocs公开可链接方法时,链接才适用。
什么是连锁?
给定一个名为Foo
的类,以下两个方法均可链接。
function what() { return this; }
function when() { return new Foo(this); }
一个是对当前实例的引用,而一个创建了一个新实例,这一事实并不能改变它们是可链接的方法。
没有黄金规则,可链接方法必须仅引用当前对象。实际上,可链接方法可以跨越两个不同的类。例如;
class B { function When() { return true; } };
class A { function What() { return new B(); } };
var a = new A();
var x = a.What().When();
this
在以上任何示例中均未引用。该代码a.What().When()
是链接的示例。有趣的是,类类型B
从未分配给变量。
当方法的返回值用作表达式的下一个组成部分时,该方法将被链接。
这是更多示例
// return value never assigned.
myFile.Open("something.txt").Write("stuff").Close();
// two chains used in expression
int x = a.X().Y() * b.X().Y();
// a chain that creates new strings
string name = str.Substring(1,10).Trim().ToUpperCase();
何时使用this
和new(this)
大多数语言中的字符串都是不可变的。因此,链接方法调用始终会导致创建新的字符串。其中可以修改StringBuilder之类的对象。
一致性是最佳实践。
如果您有修改对象状态并返回的this
方法,请不要混入返回新实例的方法。而是创建一个特定的方法Clone()
,该方法将显式地执行此操作。
var x = a.Foo().Boo().Clone().Foo();
关于内部发生的事情,这要清楚得多a
。
外面的一步和向后把戏
我将其称为“ 逐步退出”技巧,因为它解决了许多与链接有关的常见问题。从根本上讲,这意味着您从原始类中退出,进入新的临时类,然后返回原始类。
临时类的存在仅是为了向原始类提供特殊功能,而仅在特殊条件下才存在。
很多时候,一条链需要更改状态,但是类A
不能代表所有这些可能的状态。因此,在链接过程中,引入了一个新类,其中包含对的引用A
。这使程序员可以进入状态并返回A
。
这是我的示例,将特殊状态称为B
。
class A {
function Foo() { return this; }
function Boo() { return this; }
function Change() return new B(this); }
}
class B {
var _a;
function (A) { _a = A; }
function What() { return this; }
function When() { return this; }
function End() { return _a; }
}
var a = new A();
a.Foo().Change().What().When().End().Boo();
现在,这是一个非常简单的示例。如果您想拥有更多控制权,则B
可以返回A
具有不同方法的新超类型。