2010-06-03 9 views
5

Je rencontre des difficultés avec une approche générale OOP & Java. Il existe plusieurs façons de laisser les classes/objets communiquer les uns avec les autres. Pour donner un exemple simple:Quelle sera l'approche de la POO? (ou VOTRE approche?)

  • J'ai besoin objet A pour exécuter l'action X.
  • Objet A besoin P, Q et R pour effectuer cette action X.

Est-ce que alors Object récupérer P , Q et R par lui-même (dans l'action X), ou ces valeurs doivent-elles être des paramètres pour l'action X?

Répondre

0

Si les valeurs peuvent être réutilisées, transmettez-les (ou une partie de) en tant que paramètres. Dans le cas contraire, créez-les en tant que variables locales à l'intérieur de X.

4

Ceci est une question trop générale pour être traitée concrètement. L'approche peut être bonne dans certaines situations. Certains facteurs:

  • passant P, Q et R en tant que paramètres rend A plus facile de réutiliser et de test (voir Dependency Injection)
  • si P, Q et R ne sont pas utilisés partout ailleurs en dehors de A, ils pourraient être la méthode fait locales
  • si P, Q et R sont également utilisés dans d'autres procédés de A, ils peuvent être les membres ont fait
0

col P, Q et R à A d'une manière quelconque, soit en le plaçant en tant que propriétés de A ou en les transmettant à X (selon que PQR est spécifique à X ou si A peut aussi en avoir besoin dans d'autres situations).

0

La réponse est que cela dépend.

Si P, Q et R ont une forte, un lien significatif pour une instance de vous pourriez alors envisager de les ajouter en tant que membres de la classe 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(); 
    } 

} 

Si P, Q et R ne sont pas, et sont juste « des valeurs » que l'action d'aide X l'exécutent la tâche de, alors vous pouvez les utiliser comme paramètres

public class A { 

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

} 

La deuxième version ne maintient tout état de sorte qu'il est par thread-safe

0
définition

Approche 1

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

Approche 2

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

classe design est un sous-ensemble de la conception de logiciels: donc tout dépend. Comme la question est peu subjective (tout le monde a une approche différente) je dirai seulement que j'utilise cette méthode, sans dire que c'est la meilleure. Probablement il y a beaucoup de façons différentes.

public interface FuncX { 

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

} 

Et laissez les classes implémenter cette interface. Si deux classes sont petites mais liées, je les laisse implémenter les deux interfaces.

Cela rend chaque implémentation très facile à tester. Pour amorcer le système, une méthode principale doit créer des instances de classes spécifiques. Cela peut être configurable, par exemple.

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

Cela me semble fonctionner pour Composite Pattern.

Vous passez essentiellement les objets P, Q et R dans A, puis exécutez une certaine méthode dans chacun d'eux. Ce modèle est utilisé lorsque vous avez besoin de plusieurs objets pour effectuer la même action. Alors, comme par exemple le wiki dit, vous feriez essentiellement faire quelque chose comme ceci:

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

graphic.print(); 

et graphic.print(); appelleraient print méthode dans chacun des objets d'ellipse.

0

Dans votre projet si le lifetime des objets P, Q, R se trouve dans l'action X alors créez des objets dans l'action elle-même. Au lieu de cela, si la durée de vie ne dépend pas de l'action X, passez-la en argument. Prenez également soin de la portée des objets P, Q, R. Je vous recommande de passer par les concepts tels que Association, Agrégation, Composition et Dépendance avant de concevoir une classe. Prendre un appel basé sur la portée et la durée de vie des objets après avoir compris ces concepts.

0

Le rendre le plus commode possible?

Vous pouvez écrire une fonction/méthode pour accepter plus de 18 arguments, mais ce n'est pas vraiment pratique.

Si la méthode qui va faire l'action A reçoit toujours les mêmes arguments (et vous êtes sûr que cela ne changera pas), je ne vois pas pourquoi vous avez besoin de les passer par argument. Cela dit, je ne m'en tiens pas aux normes et je ne sais pas ce que les autres fondamentalistes de la POO (les gourous du hype) feraient dans cette situation.

Questions connexes