2013-02-04 6 views
8

Tôi sử dụng một cái gì đó khá giống với mẫu thiết kế custom objects trong mã của tôi bình thường.Tại sao lại sử dụng các tác dụng phụ xấu trong các nhà xây dựng JavaScript?

Nhưng JSLint cau mày khi cấu trúc như thế này:

function MyClass() { this.init(); } 
new MyClass(data); 

Bởi vì đối tượng đang được loại bỏ ngay lập tức sau khi tạo - nó không được sử dụng cho bất cứ điều gì. Chúng ta có thể đánh lừa JSLint bỏ qua điều này bằng cách gán nó cho một biến, nhưng nó không thay đổi JSLint đó (và tôi đoán nhiều người thích JavaScript) không khuyến khích mẫu.

Vậy tại sao lại sử dụng các hiệu ứng phụ trong một hàm tạo JavaScript được xem là thực tiễn không tốt?

Đối với những gì nó có giá trị, tôi nghĩ đây là một tốt thực tế bởi vì:

  1. Bạn có một chức năng cài đặt, do đó nó phải được dễ dàng hơn để duy trì nếu ví dụ bạn đang quản lý danh sách các phiên bản MyClass để truy cập sau này. (Đẩy một đối tượng lên một mảng là một tác dụng phụ, bạn sẽ phải làm điều đó sau khi hàm tạo trở lại là "thực hành tốt" = khó bảo trì hơn.)
  2. Nó có nguyên mẫu riêng, do đó "quyền sở hữu lớp": Firebug báo cáo điều này như là một trường hợp của MyClass thay vì chỉ là Object. (Điều này, theo ý kiến ​​của tôi, làm cho nó vượt trội so với các mẫu thiết kế khác.)
+0

JSLint không khuyến khích 'MyClass' mới vì bạn không sử dụng nó sau khi bạn đã khởi tạo nó. do đó, nó chỉ được sử dụng cho các tác dụng phụ của nó. Thay vào đó, ví dụ này có thể được viết lại để sử dụng tiêm phụ thuộc như 'initialize (new MyClass());' (mặc dù ví dụ này đơn giản như ngớ ngẩn). – zzzzBov

+0

Bạn có thực sự không bao giờ gán các trường hợp mới được tạo của 'MyClass' cho bất kỳ thứ gì (nói cách khác, đây có phải là một cách phức tạp để làm cho' init() 'một kiểu phương thức tĩnh) không? Việc sử dụng "bình thường" mẫu này sẽ không kích hoạt cảnh báo JSLint. –

+0

@ FrédéricHamidi không bao giờ, nhưng đôi khi nó sẽ có tác dụng phụ mà tự làm công việc, nghĩa là không có gì cần phải làm nữa. Một người xây dựng có thể khởi tạo một đối tượng người, nhưng bạn có thể không nhất thiết phải hoạt động trên người đó ngay bây giờ. Trong trường hợp bạn cần, các hiệu ứng phụ sẽ tự đăng ký trong một mảng để truy cập sau này. – user1994380

Trả lời

8

Trong cuốn sách của mình sạch Mã, Robert Martin nói

Tác dụng phụ là những lời dối trá. Chức năng của bạn hứa hẹn sẽ làm một điều, nhưng nó cũng làm những thứ ẩn khác ... chúng là những sai lầm gây hại và gây hại cho các kết quả thường gặp trong các khớp nối và trật tự thời gian lạ.

Điều bạn đã mô tả trong nhận xét của mình về mảng có vẻ giống như "khớp nối tạm thời lạ".

+1

Câu trả lời hữu ích, cảm ơn các cụm từ tìm kiếm và tài liệu tham khảo. Tôi thấy điều này liên quan đến bất kỳ ai có câu hỏi tương tự - [blog của Mark Seemann] (http: //blog.ploeh.dk/2011/05/24/DesignSmellTemporalCoupling.aspx) (không sử dụng JavaScript). Trong khi chờ đợi không có câu trả lời tốt hơn, tôi sẽ chấp nhận điều này. – user1994380