2010-06-03 18 views
5

Mam problemy z niektórymi ogólnymi metodami Java OOP &. Istnieją różne sposoby, aby klasy/obiekty komunikowały się ze sobą. Dać prosty przykładJakie będzie podejście OOP? (lub TWOJE podejscie?)

  • trzeba obiektowi wykonać działania X.
  • Object musi P, Q i R w celu przeprowadzenia tej operacji X.

następnie Object ODZYSKIWANIE str , Q i R jako takie (w ramach działania X), czy te wartości muszą być parametrami dla działania X?

Odpowiedz

0

Jeśli wartości mogą być ponownie użyte, należy je przekazać (lub część) jako parametry. W przeciwnym razie utwórz je jako zmienne lokalne w X.

4

To zbyt ogólne pytanie, na które należy odpowiedzieć konkretnie. W niektórych sytuacjach każde podejście może być dobre. Niektóre czynniki:

  • przechodzące P, Q i R, jako parametry umożliwia łatwiejszy do ponownego użycia i test (patrz Dependency Injection)
  • jeżeli P, Q i R, nie są wykorzystywane w innym miejscu na zewnątrz, ale może być wykonana sposobem lokalnych
  • jeżeli P, Q i R są również stosowane w innych metodach a, mogą być wykonane członków
0

Przełęcz P, Q i R w w pewnym stopniu, albo przez ustawienie go jako właściwościach lub przekazując je do X (w zależności od tego, czy PQR są specyficzne dla X, czy też mogą być potrzebne A w innych sytuacjach).

0

Odpowiedź jest taka, że ​​to zależy.

Jeżeli P, Q i R mają silną, sensowne link do instancji wtedy można rozważyć dodanie ich jako członków klasy 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(); 
    } 

} 

Jeżeli P, Q i R nie są i są tylko „pewne wartości”, który pomaga akcja X wykonać to zadanie, to może chcesz je wykorzystać jako parametry

public class A { 

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

} 

druga wersja nie utrzymuje żadnego państwa, więc jest z definicji wątku bezpieczny

0

Approach 1

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

Podejście 2

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

klasy konstrukcja jest podzbiorem projektowania oprogramowania: tak to wszystko zależy.

Ponieważ pytanie jest mało subiektywne (każdy ma inne podejście) powiem tylko, że używam tej metody, nie mówiąc, że jest to najlepsze. Prawdopodobnie istnieje wiele różnych sposobów.

public interface FuncX { 

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

} 

I niech klasy implementują ten interfejs. Jeśli dwie klasy są małe, ale powiązane, pozwalam im implementować oba interfejsy.

Sprawia, że ​​każda implementacja jest bardzo łatwa do sprawdzenia. Aby uruchomić system, główna metoda musi tworzyć wystąpienia określonych klas. Można na przykład konfigurować.

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

To brzmi dla mnie jak praca dla Composite Pattern.

Po prostu przekazujesz obiekty P, Q i R do A, a następnie wykonujesz określoną metodę we wszystkich z nich. Ten wzór jest używany, gdy potrzebujesz kilku obiektów do wykonania tej samej akcji. Tak, jak na przykład wiki mówi, że jesteś po prostu zrobić coś jak to:

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

graphic.print(); 

i graphic.print(); nazwałbym print metodę wewnątrz każdego z obiektów elipsy.

0

W twoim projekcie, jeśli lifetime obiektów P, Q, R znajduje się w obrębie działania X, wtedy stwórz obiekty wewnątrz samego działania. Zamiast tego, jeśli czas życia nie zależy od działania X, przekazujemy go jako argument. Zadbaj również o zakres obiektów P, Q, R. Zalecam, aby przed zaprojektowaniem klasy zapoznać się z koncepcjami, takimi jak Asocjacja, Agregacja, Kompozycja i Zależność. Wykonaj połączenie w oparciu o zasięg i czas życia obiektów po zrozumieniu tych pojęć.

0

Czy to najwygodniejszy sposób?

Można napisać funkcję/metodę akceptowania 18 argumentów, ale nie jest to wygodne.

Jeśli metoda, która ma zamiar wykonać działanie A, zawsze otrzymuje te same argumenty (i jesteś bardzo pewny, że to się nie zmieni), nie rozumiem, dlaczego potrzebujesz ich przekazać przez argument.

To powiedziawszy, zwykle nie trzymam się norm i nie wiem, co by zrobili inni fundamentaliści OOP (hype gurus) w tej sytuacji.

Powiązane problemy