2010-06-03 42 views
5

Tôi đang gặp khó khăn với một số phương pháp tiếp cận chung của OOP & Java. Có nhiều cách khác nhau để cho các lớp/đối tượng giao tiếp với nhau. Để cung cấp một ví dụ đơn giản:Phương pháp tiếp cận OOP là gì? (hoặc cách tiếp cận CỦA BẠN?)

  • tôi cần đối tượng A để thực hiện hành động X.
  • Object A cần P, Q và R để thực hiện thao tác này X.

sau đó sẽ Object Một lấy P , Q và R của chính nó (trong hành động X), hoặc phải các giá trị này là các tham số cho hành động X?

Trả lời

0

Nếu các giá trị có thể được tái sử dụng, sau đó chuyển chúng (hoặc một phần của) làm tham số. Otrherwise, tạo chúng dưới dạng biến cục bộ bên trong X.

4

Đây là câu hỏi quá chung chung để được trả lời cụ thể. Hoặc là cách tiếp cận có thể tốt trong những tình huống nhất định. Một số yếu tố:

  • đi qua P, Q và R là các thông số làm cho A dễ dàng hơn để tái sử dụng và thử nghiệm (xem Dependency Injection)
  • nếu P, Q và R không được sử dụng bất cứ nơi nào khác ngoài A, họ có thể được thực hiện phương pháp địa phương
  • thành viên
  • nếu P, Q và R cũng được sử dụng trong các phương pháp còn lại của A, họ có thể được thực hiện
0

đèo P, Q và R đến A một cách nào đó, hoặc bằng cách thiết lập nó như là thuộc tính của A hoặc bằng cách chuyển chúng sang X (tùy thuộc vào nếu PQR là X-cụ thể hoặc nếu họ có thể cần thiết bởi A trong các tình huống khác quá).

0

Câu trả lời là tùy thuộc.

Nếu P, Q và R có một, liên kết có ý nghĩa mạnh mẽ để một thể hiện của A thì bạn có thể cân nhắc việc thêm chúng như các thành viên của lớp A.

public class A { 

    private P p; 
    private Q q; 
    private R r; 

    public A(P p, Q q, R r) { 
    this.p = p; 
    this.q = q; 
    this.r = r; 
    } 

    public void x() { 
    p.doSomething(); 
    q.doSomething(); 
    r.doSomething(); 
    } 

} 

Nếu P, Q và R là không, và chỉ là "một số giá trị" mà giúp đỡ hành động X thực hiện nó nhiệm vụ, sau đó bạn có thể muốn sử dụng chúng như thông số

public class A { 

    public void x(P p, Q q, R r) { 
    p.doSomething(); 
    q.doSomething(); 
    r.doSomething(); 
    } 

} 

phiên bản thứ hai không duy trì bất kỳ nhà nước vì thế nó là theo định nghĩa thread-safe

0

Cách tiếp cận 1

class A{ 
    ctor(P, Q, R) 
    { 
    } 
    void X() 
    { 
    P.SomeMethod(); 
    Q.SomeMethod(); 
    R.SomeMethod(); 
    } 
} 

Cách tiếp cận 2

class A{ 
    void X(P, Q, R) 
    { 
    P.SomeMethod(); 
    Q.SomeMethod(); 
    R.SomeMethod(); 
    } 
} 
0

Class-thiết kế là một tập hợp con của phần mềm thiết kế: vì vậy tất cả phụ thuộc.

Vì câu hỏi rất ít chủ quan (mọi người đều có cách tiếp cận khác), tôi sẽ chỉ nói rằng tôi sử dụng phương pháp này, mà không nói rằng đó là cách tốt nhất. Có lẽ có rất nhiều cách khác nhau.

public interface FuncX { 

    public void actionX(FuncP p, FuncQ q, FuncR r); 

} 

Và để các lớp thực hiện giao diện này. Nếu hai lớp nhỏ nhưng có liên quan, tôi cho phép chúng triển khai cả hai giao diện.

Điều này giúp mỗi lần triển khai dễ dàng thực hiện được. Để khởi động hệ thống, một phương thức chính phải tạo ra các cá thể của các lớp cụ thể. Điều này có thể được cấu hình, ví dụ.

public class MyFuncX implements FuncX, FuncP { 

    public void actionX(FuncP p, FuncQ q, FuncR r) { 
     ... 
    } 

    public void actionP(...) { 
     ... 
    } 

} 

// the caller: 
FuncX x = new MyFuncX(); // dependency 
FuncQ q = ...; 
FuncR r = ...; 

x.actionX(x, q, r); 
0

Nghe có vẻ như tôi thích làm việc cho Composite Pattern.

Bạn về cơ bản truyền đối tượng P, Q và R vào A và sau đó thực thi phương thức nhất định bên trong tất cả chúng. Mẫu này được sử dụng khi bạn cần một số đối tượng để thực hiện cùng một hành động. Vì vậy, như ví dụ trên wiki nói, bạn muốn làm điều gì đó về cơ bản như thế này:

graphic1.add(ellipse1); 
graphic1.add(ellipse2); 
graphic1.add(ellipse3); 

graphic.print(); 

graphic.print(); sẽ gọi print phương pháp bên trong mỗi người trong số các đối tượng hình elip.

0

Trong dự án của bạn nếu lifetime của đối tượng P, Q, R nằm trong hành động X, sau đó tạo đối tượng trong chính hành động đó. Thay vào đó, nếu tuổi thọ không phụ thuộc vào hành động X thì hãy chuyển nó thành một đối số. Cũng chăm sóc phạm vi của các đối tượng P, Q, R. Tôi khuyên bạn nên đi qua các khái niệm như Hiệp hội, Tổng hợp, Thành phần và Sự phụ thuộc trước khi thiết kế một lớp học. Thực hiện cuộc gọi dựa trên phạm vi và tuổi thọ của các đối tượng sau khi hiểu các khái niệm đó.

0

Làm cho cách thuận tiện nhất có thể?

Bạn có thể viết hàm/phương thức để chấp nhận hơn 18 đối số, nhưng nó không thực sự thuận tiện.

Nếu phương pháp sẽ thực hiện hành động A luôn nhận được cùng một đối số (và bạn chắc chắn điều này sẽ không thay đổi), tôi không thấy lý do bạn cần chúng được chuyển bởi đối số.

Điều đó nói rằng, tôi thường không tuân thủ các tiêu chuẩn và không biết những người theo chủ nghĩa cơ bản khác của OOP (hype kinh nghiệm) sẽ làm gì trong tình huống này.

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