9

Angenommen vorbei ich habe folgendesPassing einzelnes Objekt vs. mehrere Parameter

Class A { 
    Foo getFoo(); 
    Bar getBar(); 
    Baz getBaz(); 
} 

Und ich brauche eine Funktion, die doStuffFoo, Bar, Baz von ein Objekt verwendet, um zu definieren, und hat einige Sachen

Ich kämpfe zwischen welcher Methode der Implementierung doStuff ist besser (angenommen, es wäre nicht wünschenswert, doStuff innerhalb der Klasse A)

zu platzieren

Methode A

void doStuff(Foo foo, Bar bar, Baz baz) 
{ 
    //some operation 
} 

oder

Methode B

void doStuff(A a) 
{ 
    Foo foo = a.getFoo(); 
    Bar bar = a.getBar(); 
    Baz baz = a.getBaz(); 
    //some operation 
} 

Zu meiner begrenzten Kenntnis, (+ Pros - cons)

Me Thod A

+ Es ist klar genau das, was doStuff() auf

zu

-Susceptible zu langen Parameterlisten und anfällige für Benutzerfehler

Methode B Parameter arbeitet

+ Einfache, leicht Verwenden Sie Methode

+ Scheint mehr erweiterbar (?)

-Erzeugt unnötige Abhängigkeit gegenüber Klasse A


Kann jeder Aktie einen zusätzlichen Einblick auf die Vor- und Nachteile dieser beiden Methoden?

+0

Das gesagt, Methode B – JavaHopper

Antwort

11

Methode A (nackte Parameter) haben immer die Vorteile, dass

  • es die Methode Autor erfordert weniger geben, da sie nicht über ein Parameter-Objekt implementieren müssen,
  • es die Methode Anrufer erfragt um weniger zu typisieren, da sie kein Parameterobjekt
  • instanziieren müssen, da kein Parameterobjekt erstellt werden muss und keine Daten gesammelt werden.
  • Der Leser kann sehen, was die einzelnen Parameter aus der Methodensignatur allein sind (Aber t sein ist ein zweischneidiges Schwert; siehe unten)

Methode B (Parameter Object) hat Vorteile, wenn

  • die Parameter-Domain Bedeutung als eine Gruppe haben, so kann der Parameter Objekt ein Name gegeben werden, der diese Bedeutung erklärt, spart den Leser von Jedes Mitglied der Gruppe muss gelesen und verstanden werden.
  • Die Parameterliste wird in mehr als einer Methode verwendet. Daher reduziert die Verwendung des Parameterobjekts in jedem die
  • Werte in der Parameterliste mehrere m ethods als eine Gruppe, die einfacher ist, wenn sie als ein einzelnes Parameter-Objekt weitergegeben werden können
  • einige Kombinationen von Werten sind ungültig; das Parameter-Objekt kann diese Kombinationen verhindern
  • einige Werte sind optional, die vom Parameter-Objekt zur Verfügung gestellt werden können (abhängig von Ihrer Sprache) Standard-Parameterwerte oder überladene Methoden
  • Es gibt mehr als einen Parameter des gleichen Typs , wodurch wert Swapping Fehler wahrscheinlicher, (obwohl ein Parameter-Objekt in diesem Fall nicht besser ist, wenn es einen Konstruktor mit der gleichen Parameterliste wie das Verfahren hat)

dass der Parameter Objekt, auf den eine neue Abhängigkeit einführt caller und callee depend sind nicht sehr benachteiligt, da es sich um eine einfache Klasse ohne eigene Abhängigkeiten handelt.

So Parameter Objekt ist

  • fast nie lohnt sich für einen einzigen Parameter, manchmal lohnt sich für eine Zwei-Parameter-Methode (zB Point ist in der Regel besser als x, y) und manchmal nicht, und immer hilfsbereit, drei und mehr Parameter
  • immer hilfreich, wenn mehr Methoden, um die gleiche Parameterliste
3

Parameter Object s einen schönen Ansatz liefern verwenden related Parameter kapseln die Gesamt parame zu reduzieren Zählen Sie zu jeder Methode oder Konstruktor. Man sollte sehr vorsichtig sein, um sicherzustellen, dass die Parameterobjekte tatsächlich wirklich verwandte Parameter enthalten.

Tatsächlich gibt es mehrere Möglichkeiten, dieses Problem zu lösen, abhängig von der parameter types Sie beschäftigen. Wenn Sie mit Parametern arbeiten, die allgemeine Typen sind, wie mehr als String s oder Int s und es ein Potenzial für einen Client gibt, die falsche Abfolge von Argumenten tatsächlich zu übergeben, ist es oft sinnvoller, custom types zu erstellen.Erstellen Sie enum mit möglichen Werten. Das kann gute Kompilierzeitprüfung für Ihre Argumente bereitstellen. Eine weitere gute Verwendung von ihnen ist, können Sie sie zu return komplexe Werte von Funktionen verwenden. Siehe here. Ein weiterer Ansatz, den ich oft mache, ist zu überprüfen, ob die Arbeit der doStuff Methode in einfachere Methoden mit weniger Abhängigkeiten unterteilt ist.

Prinzipiell versuche ich, Bob Martins Empfehlung von maximal drei Parametern zu folgen. Naja, eigentlich sagt er, es sollte meistens nicht mehr als eins sein! Jede Erhöhung sollte begründete Gründe haben. Verweise dieses ausgezeichnete Buch: Clean Code

Verwandte Themen