2010-03-19 29 views
7

Tôi có một lớp Permissions trong Java với các phương pháp trong phong cách thành thạo như thế này:tên phương pháp với giao diện thông thạo

somePermissions.setRead(true).setWrite(false).setExecute(true) 

Câu hỏi đặt ra là, liệu tôi có nên đặt tên các phương pháp set{Property} hoặc chỉ {property}. Sau này sẽ giống như thế này:

somePermissions.read(true).write(false).execute(true) 

Nếu tôi nhìn vào những phương pháp riêng tôi hy vọng rằng read đọc một cái gì đó, nhưng mặt khác nó là gần gũi hơn với ý định để có một cái gì đó giống như paramaters tên như trong Scala:

Permission(read=true, write=false, execute=true) 
+2

Câu hỏi ngớ ngẩn, nhưng tại sao không chỉ sử dụng các thông số được đặt tên và mặc định? Đó là cả hai tersest và dễ đọc nhất, ít nhất là cho các ví dụ bạn đã đưa ra. –

+1

Tôi nên nói rằng tôi sử dụng Java, không hỗ trợ các tham số có tên và mặc định. – deamon

Trả lời

7

set{Property} là tốt hơn so với chỉ { property} để truyền đạt ý định. Tuy nhiên, vì các ví dụ của bạn là các thuộc tính boolean đơn giản, một giao thoa thông thạo hơn nữa có thể là:

somePermissions.AllowRead().DenyWrite().AllowExecute(); 
+0

Điều đó tốt, nhưng bạn nên suy nghĩ về việc xử lý trường hợp một chuỗi người vô nghĩa: 'AllowRead(). DenyRead()' –

+0

@oxbow_lakes Tại sao? Sẽ là (ví dụ:) hút thuốc lá OK cho bạn nếu bạn lần đầu tiên cho phép nó và * sau đó * cấm? IMHO hoàn toàn rõ ràng (mặc dù bạn có thể muốn ngăn chặn các trường hợp như vậy bởi vì chúng có thể do nhầm lẫn). – maaartinus

5

set{Property} chắc chắn. Nó cho biết phương thức đang làm. Hãy tưởng tượng tài sản của bạn được gọi là visible hoặc encoding hoặc algorithm. Không sử dụng set sẽ không có ý nghĩa gì cả.

Bạn có thể sử dụng nhiều tên hành động mô tả khác với tên của thuộc tính. Ví dụ:

visible ->show(..)
encoding ->encode(..)
read>makeReadable(..)
name ->giveName(..) ("tên" là một động từ, nhưng là mơ hồ)

+0

Tôi hoàn toàn đồng ý ... – pgras

6

Đây là vấn đề kinh điển với giao diện thông thạo. Trong khi tôi đồng ý với @Bozho rằng setRead() tự giải thích hơn, mục tiêu trong giao diện thông thạo là làm cho toàn bộ "câu" có thể đọc được như trái ngược với việc thực hiện các cuộc gọi phương thức riêng lẻ có thể đọc được.

Vì vậy, tôi sẽ tiến thêm một bước. Cách thực hiện:

somePermissions.readable().nonWritable().executable() 

Xem thêm Martin Fowler post về chủ đề này. Anh ấy nói: "Xây dựng API thông thạo như thế này dẫn đến một số thói quen API bất thường"

1

set rõ ràng gây trở ngại rõ ràng. Họ không thực sự giống như phương pháp, vì vậy tôi nói thả nó.

Tôi cũng khuyên bạn nên tách người xây dựng khỏi sản phẩm. Ưu tiên bất biến trong sản phẩm.

Nếu bạn có cờ, tôi nghĩ tốt hơn nên sử dụng các boolean thay vì các cặp phương thức. Thư viện Java đã thực hiện thay đổi này từ 1,0 đến 1,1. Tuy nhiên, tôi vẫn không thích boolean. Không có ý nghĩa mức cao hơn nhiều trong số truefalse. enum s là tốt hơn. Tốt hơn, nếu bạn đang nói về một cái gì đó có thể được coi là một bộ (như trong ví dụ), sau đó sử dụng Set (có thể được thực hiện như EnumSet).

Các vấn đề liên quan