Đừng làm điều đó; nó sẽ làm quá nhiều thứ và bạn không cần nó
... Là câu trả lời tôi đã viết ở đây 2 năm trước. Bây giờ, mặc dù, tôi không chắc chắn lắm; thực tế, trong những tháng gần đây tôi đã bắt đầu chuyển mã cũ sang định dạng này, không phải vì tôi không có gì để làm mà vì tôi thực sự cần nó để triển khai các tính năng mới hoặc thay đổi các tính năng hiện có. Tôi hiểu những ác cảm tự động mà những người khác ở đây đã nhìn thấy mã đó, nhưng tôi nghĩ đây là điều đáng được suy nghĩ nghiêm túc.
Những lợi ích
Trưởng trong số các lợi ích là khả năng sửa đổi và mở rộng mã. Nếu bạn dùng
class Point {
int x,y;
// other point operations
}
thay vì chỉ truyền một vài số nguyên xung quanh - đó là điều mà thật không may, nhiều giao diện thực hiện - sau đó việc thêm một chiều khác trở nên dễ dàng hơn nhiều. Hoặc thay đổi loại thành double
. Nếu bạn sử dụng List<Author> authors
hoặc List<Person> authors
thay vào List<String> authors
đó, việc bổ sung thêm thông tin vào những gì tác giả thể hiện sẽ trở nên dễ dàng hơn nhiều. Viết nó ra như thế này có cảm giác như tôi đang nói rõ ràng, nhưng trong thực tế, tôi đã phạm tội khi sử dụng chuỗi theo cách này nhiều lần, đặc biệt là trong trường hợp không rõ ràng khi bắt đầu thì tôi cần nhiều hơn một chuỗi.
Tôi hiện đang cố gắng cấu trúc lại một số danh sách chuỗi được đan xen trong toàn bộ mã của mình vì tôi cần thêm thông tin ở đó và tôi cảm thấy đau: \
Ngoài ra, tôi đồng ý với tác giả của blog rằng nó mang nhiều thông tin ngữ nghĩa hơn , giúp người đọc dễ hiểu hơn. Mặc dù các tham số thường được đặt tên có ý nghĩa và nhận được một dòng tài liệu chuyên dụng, nhưng điều này thường không xảy ra với các trường hoặc địa phương.
Lợi ích cuối cùng là an toàn loại , vì những lý do rõ ràng, nhưng trong mắt tôi, đó là một điều nhỏ ở đây.
Hạn chế
Phải mất nhiều thời gian để viết . Viết một lớp học nhỏ là nhanh chóng và dễ dàng nhưng không dễ dàng, đặc biệt nếu bạn cần rất nhiều các lớp học này. Nếu bạn thấy mình dừng lại cứ sau 3 phút để viết một số lớp bao bọc mới, nó cũng có thể gây bất lợi cho sự tập trung của bạn. Tuy nhiên, tôi muốn nghĩ rằng trạng thái nỗ lực này thường sẽ chỉ xảy ra ở giai đoạn đầu tiên viết bất kỳ đoạn mã nào; Tôi thường có thể có được một ý tưởng khá tốt một cách nhanh chóng về những gì các thực thể sẽ cần phải tham gia.
Nó có thể liên quan đến rất nhiều setters (hoặc công trình) và getters dự phòng . Tác giả blog đưa ra ví dụ thực sự xấu xí new Point(x(10), y(10))
thay vì new Point(10, 10)
, và tôi muốn thêm rằng việc sử dụng cũng có thể liên quan đến những thứ như Math.max(p.x.get(), p.y.get())
thay vì Math.max(p.x, p.y)
. Và mã dài thường được coi là khó đọc hơn, và công bằng như vậy. Nhưng thành thật mà nói, tôi có cảm giác rất nhiều mã di chuyển các đối tượng xung quanh và chỉ chọn các phương thức tạo ra nó, và thậm chí ít cần truy cập vào các chi tiết nghiệt ngã của nó (dù sao đó không phải là OOPy).
Tranh cãi
Tôi muốn nói liệu điều này có giúp ích cho tính dễ đọc của mã hay không . Có, thông tin ngữ nghĩa nhiều hơn, nhưng mã dài hơn. Vâng, dễ hiểu hơn về vai trò của từng địa phương, nhưng khó hiểu hơn những gì bạn có thể làm với nó trừ khi bạn đi và đọc tài liệu của nó.
Như với hầu hết các trường phái lập trình khác, tôi nghĩ thật không lành mạnh khi đưa cái này đến mức cực đoan. Tôi không thấy mình tách biệt tọa độ x và y thành mỗi loại khác nhau. Tôi không nghĩ Count
là cần thiết khi int
đủ. Tôi không thích unsigned int
cách sử dụng trong C - mặc dù về mặt lý thuyết là tốt, nhưng nó không cung cấp cho bạn đủ thông tin và việc cấm mở rộng mã của bạn sau này để hỗ trợ phép thuật -1 đó. Đôi khi bạn cần sự đơn giản.
Tôi nghĩ rằng bài viết trên blog là một chút về phía cực đoan. Nhưng nhìn chung, tôi đã học được từ kinh nghiệm đau đớn rằng ý tưởng cơ bản đằng sau nó được tạo ra từ những thứ phù hợp.
Tôi có ác cảm sâu sắc với mã quá kỹ thuật. Tôi thực sự làm. Nhưng được sử dụng đúng, tôi không nghĩ rằng kỹ thuật quá mức này.