Tôi tìm thấy trích dẫn này trong " Niềm vui của Clojure " trên trang. 32, nhưng ai đó đã nói điều tương tự với tôi trong bữa tối tuần trước và tôi cũng đã nghe thấy nó ở những nơi khác:
Nhược điểm của lập trình hướng đối tượng là sự kết hợp chặt chẽ giữa chức năng và dữ liệu.
Tôi hiểu tại sao khớp nối không cần thiết là xấu trong một ứng dụng. Ngoài ra, tôi rất thoải mái khi nói rằng nên tránh trạng thái đột biến và kế thừa, ngay cả trong Lập trình hướng đối tượng. Nhưng tôi không thấy lý do tại sao việc dán các chức năng trên các lớp vốn đã xấu.
Ý tôi là, việc thêm một chức năng vào một lớp có vẻ như gắn thẻ thư trong Gmail hoặc dán tệp vào thư mục. Đây là một kỹ thuật tổ chức giúp bạn tìm lại. Bạn chọn một số tiêu chí, sau đó đặt những thứ như nhau. Trước OOP, các chương trình của chúng tôi có khá nhiều phương thức trong tệp. Ý tôi là, bạn phải đặt các chức năng ở đâu đó. Tại sao không tổ chức chúng?
Nếu đây là một cuộc tấn công che giấu các loại, tại sao họ không nói rằng việc hạn chế loại đầu vào và đầu ra cho một chức năng là sai? Tôi không chắc liệu tôi có thể đồng ý với điều đó không, nhưng ít nhất tôi đã quen thuộc với các đối số an toàn và loại đối số. Điều này nghe với tôi như một mối quan tâm chủ yếu riêng biệt.
Chắc chắn, đôi khi mọi người hiểu sai và đưa chức năng vào lớp sai. Nhưng so với những sai lầm khác, điều này có vẻ như là một bất tiện rất nhỏ.
Vì vậy, Clojure có không gian tên. Việc gắn một hàm trên một lớp trong OOP khác với việc gắn một hàm trong một không gian tên trong Clojure như thế nào và tại sao nó lại tệ đến vậy? Hãy nhớ rằng, các chức năng trong một lớp không nhất thiết chỉ hoạt động đối với các thành viên của lớp đó. Nhìn vào java.lang.StringBuilder - nó hoạt động trên bất kỳ loại tham chiếu nào, hoặc thông qua tự động đấm bốc, trên bất kỳ loại nào.
PS Trích dẫn này tham khảo một cuốn sách mà tôi chưa đọc: Lập trình đa hướng trong Leda: Timothy Budd, 1995 .