체인 사용시기
함수 체인은 자동 완성 기능이있는 IDE가 일반적인 언어에서 주로 사용됩니다. 예를 들어, 거의 모든 C # 개발자는 Visual Studio를 사용합니다. 따라서 C #으로 개발하는 경우 Visual Studio가 체인 구축을 지원하므로 메서드에 체인을 추가하면 해당 클래스의 사용자가 시간을 절약 할 수 있습니다.
다른 한편으로, 본질적으로 매우 역동적이고 IDE에서 자동 완성 기능을 지원하지 않는 PHP와 같은 언어는 체인을 지원하는 클래스가 적습니다. 연결은 올바른 phpDoc을 사용하여 연결 가능한 메소드를 노출 할 때만 적절합니다.
체인이란 무엇입니까?
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
있습니다.