2010-12-14 33 views
8

Trong Java, cho lớp sau:Java Kiểu/Thực hành tốt nhất - thông qua các lĩnh vực với các phương pháp tiếp cận trực tiếp vs

public class MyClass { 
    private final Dependency dependency; 
    public MyClass(Dependency dependency) 
    { 
     this.dependency = dependency; 
    } 

    public void doWork() 
    { 
     // validate dependency... 
    } 

Phương pháp DoWork cần gọi một phương pháp có sử dụng dependency.

Lựa chọn nào trong hai biến thể sau đây được coi là "thực hành tốt nhất" và tại sao?

// Access dependency directly 
    void validateDependency() 
    { 
     this.dependency.something(); 
    } 

    // access dependency as passed to the method 
    void validateDependency(Dependency dependency) 
    { 
     dependency.something(); 
    } 

Tôi thấy mình ưu tiên sau, chuyển trực tiếp phụ thuộc vào phương pháp, vì nó giúp phương pháp dễ dàng hơn để thử nghiệm cách ly (mặc dù, nhẹ).

Tuy nhiên, tôi quan tâm đến quy ước java/thực tiễn tốt nhất ở đây.

+4

nó chắc chắn phụ thuộc vào tình huống. –

+1

chính xác! phụ thuộc vào tình huống - ví dụ, nếu bạn có các thao tác được kết nối tạm thời (cần được gọi theo thứ tự cụ thể), thì bạn nên sử dụng lệnh sau. Nếu không, bạn có thể kết thúc với khách hàng/người duy trì mã của bạn nhận được hành vi của NPE hoặc khó hiểu hơn. – lucas1000001

+0

cũng, để đưa nó đến một cực đoan - Tôi đoán bạn đang thực sự xem xét chức năng vs đối tượng theo định hướng lập trình phong cách - oo là cựu, và chức năng sau này. – lucas1000001

Trả lời

9

Một lớp học tồn tại vì bạn có trạng thái và hoạt động được kết hợp với trạng thái đó. Không có lý do chính đáng để chuyển một phần của trạng thái đó thành tham số cho một phương thức lớp.

Thực tế, điều đó sẽ cho tôi biết rằng phần trạng thái đó không thực sự thuộc về lớp học. Hoặc phương thức đó không thuộc về lớp.

Sử dụng tham số "để kiểm tra đơn vị dễ dàng hơn" là dấu hiệu tốt cho phép kiểm tra đơn vị (phương thức này không nằm trong lớp).

+0

+1 ngay trên anon tốt của tôi –

-1

Không có cách nào phù hợp để thực hiện. Tôi thích đặt biến ở đó.

+1

-1 API nên được suy nghĩ kỹ hơn. –

-1

Tiêm phụ thuộc. Tùy chọn thứ hai là "tốt nhất".

Nếu bạn làm cho lớp "Phụ thuộc" của bạn thành một giao diện, nó làm cho mã trở nên mô-đun hơn, dễ kiểm tra hơn, ít bị ghép đôi hơn.

+1

-1 "Phụ thuộc" của anh là biến thành viên. Nó đã được ghép đôi. Gọi đây là "tiêm phụ thuộc" làm xáo trộn tình hình. –

3

Vâng, trong ví dụ của bạn, bạn đang yêu cầu hàm thực hiện điều gì đó với Phụ thuộc cho chính nó vào một hàm tĩnh, không phải là hàm thành viên.

Quy tắc của ngón tay cái là: Sử dụng các thành viên trực tiếp khi gọi một phương thức trên một đối tượng sở hữu thành viên nhưng qua tài liệu tham khảo khi thực hiện/kiểm tra một cái gì đó liên quan trực tiếp đến sự phụ thuộc và ủng hộ phương pháp tĩnh cho sau này

Đó là một chút tiết nhưng tôi hy vọng nó sẽ giúp. Như mọi khi cố gắng "làm điều đúng" và sự khác biệt nhỏ này sẽ không tạo ra tác động lớn đến việc bảo trì hoặc khả năng đọc mã của bạn.

Các vấn đề liên quan