Cẩn thận với việc hy sinh độ rõ ràng trong khi theo đuổi khả năng đọc .
Mặc dù if (user.ExistsInDatabase(db))
đọc đẹp hơn if (user.CheckExistsInDatabase(db))
, hãy xem xét trường hợp của một lớp có mẫu trình tạo, (hoặc bất kỳ lớp nào bạn có thể đặt trạng thái trên đó):
user.WithName("Mike").ExistsInDatabase(db).ExistsInDatabase(db2).Build();
Không rõ liệu ExistsInDatabase
đang kiểm tra xem nó có tồn tại hay không hay đặt ra sự thật rằng nó có tồn tại hay không. Bạn sẽ không viết if (user.Age())
hoặc if (user.Name())
không có bất kỳ giá trị so sánh nào, vậy tại sao lại là if (user.Exists())
một ý kiến hay vì thuộc tính / hàm đó thuộc kiểu boolean và bạn có thể đổi tên hàm / thuộc tính để đọc giống tiếng Anh tự nhiên hơn? Làm theo cùng một mẫu mà chúng ta sử dụng cho các kiểu khác ngoài boolean có tệ đến vậy không?
Với các kiểu khác, một if
câu lệnh so sánh giá trị trả về của một hàm với một giá trị trong mã, vì vậy mã trông giống như sau:
if (user.GetAge() >= 18) ...
Câu nào đọc là "if user dot get age lớn hơn hoặc bằng 18 ..." đúng - đó không phải là "tiếng Anh tự nhiên", nhưng tôi sẽ tranh luận rằng object.verb
không bao giờ giống tiếng Anh tự nhiên và đây chỉ đơn giản là một khía cạnh cơ bản của lập trình hiện đại (đối với nhiều ngôn ngữ chính thống). Các lập trình viên thường không gặp khó khăn khi hiểu câu lệnh trên, vậy câu lệnh sau có tệ hơn không?
if (user.CheckExists() == true)
Thường được rút ngắn thành
if (user.CheckExists())
Tiếp theo là bước quan trọng
if (user.Exists())
Mặc dù người ta đã nói rằng "mã được đọc thường xuyên hơn 10 lần so với được viết", điều rất quan trọng là các lỗi rất dễ phát hiện. Giả sử bạn có một hàm gọi là Exists () làm cho đối tượng tồn tại và trả về true / false dựa trên thành công. Bạn có thể dễ dàng nhìn thấy mã if (user.Exists())
và không phát hiện ra lỗi - if (user.SetExists())
ví dụ như lỗi sẽ rõ ràng hơn nhiều nếu đọc mã .
Ngoài ra, user.Exists () có thể dễ dàng chứa mã phức tạp hoặc không hiệu quả, di chuyển đến cơ sở dữ liệu để kiểm tra một cái gì đó. user.CheckExists () làm rõ rằng hàm thực hiện một điều gì đó.
Xem thêm tất cả các câu trả lời ở đây: Quy ước đặt tên : Đặt tên gì cho một phương thức trả về boolean?
Lưu ý cuối cùng - sau "Tell Don't Ask", rất nhiều hàm trả về true / false sẽ biến mất và thay vì hỏi một đối tượng về trạng thái của nó, bạn yêu cầu đối tượng làm điều gì đó, điều này có thể làm theo cách khác cách dựa trên trạng thái của nó.
isBabbyFormed