Nếu bạn cảm thấy bắt buộc phải mở rộng một lớp lót như
a = F(G1(H1(b1), H2(b2)), G2(c1));
Tôi sẽ không trách bạn Điều đó không chỉ khó đọc, mà còn khó gỡ lỗi.
Tại sao?
- Nó dày đặc
- Một số trình gỡ lỗi sẽ chỉ làm nổi bật toàn bộ sự việc cùng một lúc
- Nó không có tên mô tả
Nếu bạn mở rộng nó với kết quả trung gian, bạn nhận được
var result_h1 = H1(b1);
var result_h2 = H2(b2);
var result_g1 = G1(result_h1, result_h2);
var result_g2 = G2(c1);
var a = F(result_g1, result_g2);
và nó vẫn khó đọc. Tại sao? Nó giải quyết hai trong số các vấn đề và giới thiệu thứ tư:
Nó dày đặc
Một số trình gỡ lỗi sẽ chỉ làm nổi bật toàn bộ sự việc cùng một lúc
- Nó không có tên mô tả
- Nó lộn xộn với những cái tên không mô tả
Nếu bạn mở rộng nó với các tên thêm ý nghĩa mới, tốt, ngữ nghĩa, thậm chí tốt hơn! Một cái tên hay giúp tôi hiểu.
var temperature = H1(b1);
var humidity = H2(b2);
var precipitation = G1(temperature, humidity);
var dewPoint = G2(c1);
var forecast = F(precipitation, dewPoint);
Bây giờ ít nhất điều này kể một câu chuyện. Nó sửa chữa các vấn đề và rõ ràng tốt hơn bất cứ điều gì khác được cung cấp ở đây nhưng nó đòi hỏi bạn phải đưa ra các tên.
Nếu bạn làm điều đó với những cái tên vô nghĩa như result_this
và result_that
vì đơn giản là bạn không thể nghĩ ra những cái tên hay thì tôi thực sự muốn bạn dành cho chúng tôi sự lộn xộn của cái tên vô nghĩa và mở rộng nó bằng cách sử dụng một khoảng trắng cũ tốt:
int a =
F(
G1(
H1(b1),
H2(b2)
),
G2(c1)
)
;
Nó chỉ có thể đọc được, nếu không phải như vậy, so với tên có kết quả vô nghĩa (không phải các tên hàm này là tuyệt vời).
Nó dày đặc
Một số trình gỡ lỗi sẽ chỉ làm nổi bật toàn bộ sự việc cùng một lúc
- Nó không có tên mô tả
Nó lộn xộn với những cái tên không mô tả
Khi bạn không thể nghĩ ra những cái tên hay, điều đó cũng tốt như vậy.
Vì một số lý do, trình gỡ lỗi yêu thích các dòng mới, vì vậy bạn nên thấy rằng việc gỡ lỗi này không khó:
Nếu điều đó là không đủ, hãy tưởng tượng G2()
được gọi ở nhiều nơi và sau đó điều này đã xảy ra:
Exception in thread "main" java.lang.NullPointerException
at composition.Example.G2(Example.java:34)
at composition.Example.main(Example.java:18)
Tôi nghĩ thật tuyệt vì mỗi G2()
cuộc gọi sẽ nằm trên đường dây riêng, nên phong cách này sẽ đưa bạn trực tiếp đến cuộc gọi vi phạm chính.
Vì vậy, vui lòng không sử dụng các vấn đề 1 và 2 như một cái cớ để gắn bó với chúng tôi với vấn đề 4. Sử dụng tên hay khi bạn có thể nghĩ về chúng. Tránh những cái tên vô nghĩa khi bạn không thể.
Lightness Races trong bình luận của Orbit chỉ ra một cách chính xác rằng các chức năng này là nhân tạo và đã có những cái tên đáng thương. Vì vậy, đây là một ví dụ về việc áp dụng phong cách này cho một số mã từ tự nhiên:
var user = db.t_ST_User.Where(_user => string.Compare(domain,
_user.domainName.Trim(), StringComparison.OrdinalIgnoreCase) == 0)
.Where(_user => string.Compare(samAccountName, _user.samAccountName.Trim(),
StringComparison.OrdinalIgnoreCase) == 0).Where(_user => _user.deleted == false)
.FirstOrDefault();
Tôi ghét nhìn vào dòng tiếng ồn đó, ngay cả khi không cần gói từ. Đây là cách nó trông theo phong cách này:
var user = db
.t_ST_User
.Where(
_user => string.Compare(
domain,
_user.domainName.Trim(),
StringComparison.OrdinalIgnoreCase
) == 0
)
.Where(
_user => string.Compare(
samAccountName,
_user.samAccountName.Trim(),
StringComparison.OrdinalIgnoreCase
) == 0
)
.Where(_user => _user.deleted == false)
.FirstOrDefault()
;
Như bạn có thể thấy, tôi đã thấy phong cách này hoạt động tốt với mã chức năng di chuyển vào không gian hướng đối tượng. Nếu bạn có thể đưa ra những cái tên hay để làm điều đó theo phong cách trung gian thì sẽ tiếp thêm sức mạnh cho bạn. Cho đến lúc đó tôi đang sử dụng cái này. Nhưng trong mọi trường hợp, xin vui lòng, tìm cách nào đó để tránh tên kết quả vô nghĩa. Chúng làm mắt tôi đau.