Những lợi thế của một phương pháp riêng biệt kết hợp giữa Gett / Setter VS là gì?


12

Đây là cái mà tôi gọi là phương thức getter / setter "kết hợp" (từ jQuery):

var foo = $("<div>This is my HTML</div>"),
    myText;

myText = foo.text(); // myHTML now equals "This is my HTML" (Getter)
foo.text("This is a new value"); // The text now equals "This is a new value")

Đây là logic tương tự với các phương pháp (lý thuyết) riêng biệt:

var foo = $("<div>This is my HTML</div>"),
    myText;

myText = foo.getText(); // myHTML now equals "This is my HTML" (Getter)
foo.setText("This is a new value"); // The text now equals "This is a new value")

Câu hỏi của tôi:

Khi thiết kế một thư viện như jQuery, tại sao bạn lại quyết định đi tuyến đầu tiên chứ không phải tuyến thứ hai? Không phải cách tiếp cận thứ hai rõ ràng và dễ hiểu hơn trong nháy mắt sao?


6
Martin Fowler không phải là người hâm mộ của cái mà anh gọi là "setters getter quá tải": martinfowler.com/bliki/OverloadedGetterSetter.html
vaughandroid

1
Tôi đã từng thích phương thức phân tách get / set (nghĩ rằng nó làm cho mã trở nên "rõ ràng" hơn), nhưng tôi thấy mô hình getter / setter quá tải ngày càng hấp dẫn hơn. Nó có thể làm cho mã sạch hơn. Tôi chưa bao giờ thấy mình thích sự thỏa hiệp của ông Fowler. Dường như với tôi rằng đó là điều tồi tệ nhất của cả hai thế giới.
Brian Knoblauch

Cuộc tranh luận thực sự duy nhất của Martin Fowler chống lại điều đó là khi 'getter' đi qua một cuộc tranh luận, trong trường hợp đó, nó gây nhầm lẫn cho người đọc ở chỗ nó không giống như một kẻ mắc kẹt. Đến bây giờ, tôi đã kết luận rằng nếu bạn tuân theo quy ước rằng getter không có đối số và setter lấy một, thì cùng với các nhận xét API rõ ràng, cách tiếp cận jQuery / Angular sẽ ổn. Để bây giờ.
bảo vệ zumalififard

Câu trả lời:


13

Hoàn toàn suy đoán ở đây, nhưng tôi sẽ có xu hướng tin rằng các nhà phát triển jQuery đã sử dụng rất nhiều kiểu dáng chức năng trong cấu trúc jQuery rõ ràng có khuynh hướng về mô hình chức năng.

Cho rằng, trong mô hình chức năng có một văn hóa mạnh mẽ về giảm sự dư thừa, và có thể lập luận rằng cách tiếp cận thứ hai có sự dư thừa không cần thiết. Cách tiếp cận đầu tiên có thể không rõ ràng đối với ai đó được sử dụng cho tất cả các ngôn ngữ mệnh lệnh phổ biến, nhưng nó đặc biệt làm được nhiều hơn với ít hơn bằng cách chỉ có một phương pháp thay vì hai phương pháp. Điều này có thể nguy hiểm, nhưng nó là một công cụ phổ biến trong mô hình chức năng và một cái gì đó nhanh chóng được sử dụng.

Thực hành trong mô hình chức năng và bạn nhanh chóng vượt qua mong muốn đó để làm lễ và học cách đánh giá cao khả năng làm được nhiều hơn với ít hơn. Mặc dù điều này rõ ràng là một lựa chọn chủ quan dựa trên sở thích giống như cách nhiều người có sở thích về quản lý khoảng trắng. Theo cách này, tôi không nói một cách là tốt hơn, thay vào đó là những thứ mọi người đã quen, đó có thể là lý do tại sao jQuery có cách tiếp cận như vậy.

Đây sẽ là lý do tại sao tôi tin rằng các nhà phát triển jQuery đã làm điều này và nói chung là tại sao ai đó có thể thực hiện phương pháp này.


2
Đồng ý, cộng với tôi muốn thêm mong muốn giảm kích thước JS càng nhiều càng tốt.
Matt S

-1 cho các điểm bắt buộc / dài dòng và các chức năng / ẩn.

3
@MattFenwick Tôi không có ý xúc phạm, bạn có nói rằng sự thật là mô hình chức năng có một sự nghiêng về phía nhân chứng trong đó mô hình mệnh lệnh có khuynh hướng về nhân chứng? Tôi không nói là tốt hơn, chỉ là người ta có thể quen với người này hoặc người kia sẽ khiến bạn tự động làm mọi thứ theo cách đó trái ngược với người kia (điều này cũng tương tự)
Jimmy Hoffa

@Jimmy không có vấn đề gì; Quan điểm của tôi chỉ là theo kinh nghiệm của tôi, tôi đã tìm thấy nhân chứng / nhà thám hiểm là trực giao với FP / mệnh lệnh.

@MattFenwick có thể là, nhưng tôi sẽ nói ngoài suy luận kiểu cho phép rất nhiều nhân chứng và phổ biến đối với hệ thống loại HM, những thứ khác phổ biến đối với các ngôn ngữ FP nghiêng về nhân chứng cũng như tất cả các hàm của toán tử trong đó Hàm không có tên rõ ràng, chỉ là một biểu tượng mà bạn dự kiến ​​sẽ học và biết ngầm hoặc sử dụng chung các danh sách hoặc bộ dữ liệu đòi hỏi kiến ​​thức ngầm về ý nghĩa thành viên và vị trí thay vì DU (nghĩ về cách hoạt động của nhà văn). Tôi cũng có xu hướng nhìn thấy sự phổ biến của các tên tham số chữ cái đơn, nhưng bạn có thể đúng
Jimmy Hoffa

2

Hình thức

foo.text("This is a new value"); 

có thể ngụ ý một số điều. Thông thường nhất, nó gợi ý một foođối tượng, với một phương thức gọi là textchấp nhận một chuỗi, thực hiện một cái gì đó . Không có hàm ý rằng đây là một tài sản.

Trong nhiều ngôn ngữ, đây có thể được coi là một dạng viết tắt của

var result = foo.text("This is a new value"); 

trong đó kết quả bị loại bỏ. Vì vậy, cách tiếp cận này quá mơ hồ là một cách hiệu quả để đặt thuộc tính (theo quan điểm dễ đọc mã).


Đây là một điểm tuyệt vời! Tôi đã đeo kính bảo hộ FP khi tôi đọc javascript và mọi thứ trông khác đi nên tôi thậm chí không nghĩ về điều này, nhưng nếu tôi thấy mã như thế này trong C # tôi sẽ có phản ứng chính xác mà bạn đề cập đến "Phương pháp này có làm không ?? ".
Jimmy Hoffa

1

Đó là một chút suy đoán, nhưng đây là cú đánh của tôi vào nó.

jQuery nắm bắt đầy đủ bản chất chức năng của javascript. Đó là những gì làm cho nó trở nên tuyệt vời, nhưng nó có thể khiến nhiều nhà phát triển gãi đầu khi họ đến từ ngôn ngữ OO thuần túy hơn như java. Nó dường như phá vỡ tất cả các quy ước và thực hành tốt.

Langage chức năng có xu hướng đặt sự nhấn mạnh vào một cú pháp khai báo. Nó có xu hướng đọc như tuyên bố của một thực tế chứ không phải như các lệnh. Thí dụ

var eligible = customers.where(c => c.age > 30);

có thể được đọc là "khách hàng đủ điều kiện là khách hàng có tuổi trên 30". Theo cách hiểu, ngôn ngữ bắt buộc đọc như một chuỗi lệnh

for (customer in customers)
    if (customer.age > 30)
        eligible.add(customer)

Điều đó có thể được đọc là "Kiểm tra từng khách hàng và nếu tuổi của họ trên 30, hãy thêm họ vào bộ sưu tập đủ điều kiện"

Thêm aa setvà một gethoạt động sẽ làm cho jQuery cảm thấy như một thư viện bắt buộc. Bạn có thể hiểu cách đọc các tuyên bố sau

// The element tag have an html of <p>hello</p>
$("#element").html("<p>hello</p>"); 

// content represent the html of the element tag
var content = $("#element").html();


//Imperative style

// Set the element tag to an inner html of <p>hello</p>
$("#element").setHtml("<p>hello</p>");

//Get the html of #element, and put it in the content variable
var content = $("#element").getHtml();

Bằng cách giữ các động từ hành động ra khỏi api jQuery, họ đã làm cho nó cảm thấy giống như một API khai báo. Nó mang lại một cảm giác nhất quán, chức năng cho thư viện. Đó là lý do tại sao tôi nghĩ rằng họ quá tải các từ khóa.


1

Nó làm cho nó hoạt động gần giống với các thuộc tính , mới chỉ được giới thiệu gần đây với JavaScript và do đó chưa được sử dụng rộng rãi, đặc biệt là trong các thư viện như jQuery nhằm giúp loại bỏ sự không tương thích của trình duyệt.

Nếu bạn đã từng xem một định nghĩa lớp có đầy đủ các thuộc tính như vậy, các tiền tố "set" và "get" trông có vẻ thừa, bởi vì việc thêm tham số giá trị đã cho bạn biết đó là một setter. Martin Fowler đưa ra một quan điểm tốt về các getters yêu cầu một tham số, nhưng ngay cả trong bối cảnh đó, tham số giá trị bổ sung biểu thị rõ ràng một setter, cũng như thực tế là một setter hiếm khi xuất hiện ở phía bên phải của một bài tập. Và khi bạn đang viết mã, bạn phải xem tài liệu cho thư viện.

Vì bạn chỉ yêu cầu lợi thế, tôi sẽ không bao gồm những nhược điểm.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.