Khi nào nên sử dụng xích
Chức năng xâu chuỗi hầu hết là phổ biến với các ngôn ngữ trong đó IDE có tự động hoàn thành là phổ biến. Ví dụ: hầu hết tất cả các nhà phát triển C # đều sử dụng Visual Studio. Do đó, nếu bạn đang phát triển với C # thêm chuỗi vào phương thức của bạn có thể tiết kiệm thời gian cho người dùng của lớp đó vì Visual Studio sẽ hỗ trợ bạn xây dựng chuỗi.
Mặt khác, các ngôn ngữ như PHP có tính năng động cao và thường không có hỗ trợ tự động hoàn thành trong các IDE sẽ thấy ít lớp hỗ trợ chuỗi hơn. Chaining sẽ chỉ phù hợp khi phpDocs chính xác được sử dụng để hiển thị các phương thức có thể tạo chuỗi.
Xâu chuỗi là gì?
Cho một lớp có tên Foo
hai phương thức sau đây đều có thể kết nối được.
function what() { return this; }
function when() { return new Foo(this); }
Thực tế là một tham chiếu đến thể hiện hiện tại và một tạo một thể hiện mới không thay đổi rằng đây là các phương thức có thể xâu chuỗi.
Không có quy tắc vàng rằng một phương pháp chuỗi có thể chỉ tham chiếu đối tượng hiện tại. Các phương thức nguyên vẹn, có thể chuỗi có thể qua hai lớp khác nhau. Ví dụ;
class B { function When() { return true; } };
class A { function What() { return new B(); } };
var a = new A();
var x = a.What().When();
Không có tài liệu tham khảo this
trong bất kỳ ví dụ trên. Mã a.What().When()
này là một ví dụ về một chuỗi. Điều thú vị là loại lớp B
không bao giờ được gán cho một biến.
Một phương thức được nối kết khi giá trị trả về của nó được sử dụng làm thành phần tiếp theo của biểu thức.
Dưới đây là một số ví dụ
// 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();
Khi nào nên sử dụng this
vànew(this)
Chuỗi trong hầu hết các ngôn ngữ là bất biến. Vì vậy, các cuộc gọi phương thức chuỗi luôn dẫn đến các chuỗi mới được tạo. Trường hợp như một đối tượng như StringBuilder có thể được sửa đổi.
Kiên định là thực hành tốt nhất.
Nếu bạn có các phương thức sửa đổi trạng thái của một đối tượng và trả về this
, thì không trộn lẫn trong các phương thức trả về các thể hiện mới. Thay vào đó, tạo một phương thức cụ thể được gọi là Clone()
sẽ làm điều này một cách rõ ràng.
var x = a.Foo().Boo().Clone().Foo();
Điều đó rõ ràng hơn nhiều so với những gì đang diễn ra bên trong a
.
Bước ra ngoài và trở lại
Tôi gọi đây là thủ thuật bước ra và quay lại , bởi vì nó giải quyết được rất nhiều vấn đề phổ biến liên quan đến xích. Về cơ bản, điều đó có nghĩa là bạn bước ra khỏi lớp ban đầu thành một lớp tạm thời mới và sau đó quay lại lớp ban đầu.
Lớp tạm thời tồn tại chỉ để cung cấp các tính năng đặc biệt cho lớp gốc, nhưng chỉ trong các điều kiện đặc biệt.
Đôi khi một chuỗi cần thay đổi trạng thái , nhưng lớp A
không thể đại diện cho tất cả các trạng thái có thể đó . Vì vậy, trong một chuỗi, một lớp mới được giới thiệu có chứa một tham chiếu trở lại A
. Điều này cho phép lập trình viên bước vào trạng thái và quay lại A
.
Dưới đây là ví dụ của tôi, hãy để trạng thái đặc biệt được gọi là 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ây giờ đó là một ví dụ rất đơn giản. Nếu bạn muốn có nhiều quyền kiểm soát hơn, thì B
có thể quay lại một loại siêu mới A
có các phương thức khác nhau.