2012-03-30 4 views
5

Ich schaute auf einen Code eines Kollegen Entwickler und fast weinte. In der Methodendefinition gibt es 12 Argumente. Aus meiner Erfahrung .. das ist nicht gut. Wenn ich es wäre, hätte ich irgendeinen Gegenstand geschickt.Was sind bessere Methoden zum Erstellen einer Methode, die viele Argumente benötigt? (10+?)

Gibt es einen anderen/bevorzugten Weg, dies zu tun (mit anderen Worten, was ist der beste Weg, dies zu beheben und zu erklären, warum)?

public long Save (
    String today, 
    String name, 
    String desc, 
    int ID, 
    String otherNm, 
    DateTime dt, 
    int status, 
    String periodID, 
    String otherDt, 
    String submittedDt 
) 

ignorieren meine armen Variablennamen - sie Beispiele sind

+1

Sind die Argumente in irgendeiner Weise verwandt? Wenn ja, dann gruppiere sie in einem Objekt, das die Semantik beschreibt. Ich hoffe es hilft. –

+0

Ich dachte, das wäre eine vernünftige Frage, warum gibt es zwei Stimmen, um es zu schließen? – Cody

Antwort

5

Es hängt stark von der Sprache ab.

In einer Sprache ohne Kompilierung-Typprüfung (zB Python, Javascript, etc.) Sie Schlüsselwort Argumente (common in Python: Sie sie wie ein Wörterbuch übergibt als Argument zugreifen können) verwendet werden sollen oder Objekte/Wörterbücher übergeben Sie manuell als Argumente (üblich in Javascript). Das von Ihnen beschriebene "argument hell" ist jedoch mit der Kompilierzeit-Typprüfung für bestimmte Sprachen manchmal "der richtige Weg, Dinge zu tun", weil die Verwendung von Objekten die Semantik des Typcheckers verdeckt. Die Lösung wäre dann, eine bessere Sprache mit Kompilierzeit Typchecking zu verwenden, die Mustervergleich von Objekten als Argumente ermöglicht.

2

Ja, verwenden Sie Objekte. Außerdem macht die Funktion wahrscheinlich zu viel, wenn sie all diese Informationen benötigt, also verwenden Sie kleinere Funktionen.

+1

Das habe ich mir gedacht. Es fügt nur Daten in eine Tabelle ein. – Cody

1

Es hängt davon ab, wie komplex die Funktion ist. Wenn es mit jedem dieser Argumente etwas nicht triviales tut, sollte es wahrscheinlich geteilt werden. Wenn es sie gerade passiert, sollten sie wahrscheinlich in einem Objekt gesammelt werden. Aber wenn es nur eine Zeile in einer Tabelle erstellt, ist es nicht wirklich eine große Sache. Es ist weniger ein Problem, wenn Ihre Sprache Schlüsselwortargumente unterstützt.

1

Verwenden Sie Objekte.

class User { ... } 
User user = ... 
Save(user); 

Es Entscheidung bietet eine einfache Möglichkeit zum Hinzufügen neuer Parameter.

0

Ich kann mir vorstellen, dass das Problem, das Sie erleben, in der Lage ist, den Methodenaufruf zu betrachten und zu wissen, welches Argument welchen Wert erhält. Dies ist ein schädliches Problem in einer Sprache wie Java, denen etwas wie Schlüsselwortargumente oder JSON-Hashes fehlen, um benannte Argumente zu übergeben. In dieser Situation ist Builder pattern eine nützliche Lösung. Es sind mehr Objekte, insgesamt drei, aber es führt zu einem verständlicheren Code für das Problem, das Sie beschreiben. So sind die drei Objekte in diesem Fall wäre als solche:

  1. Thing: Stateful Einheit, in der Regel unveränderlich (dh Getter nur)
  2. ThingBuilder: Factory-Klasse, ein Ding-Entität erstellt und setzt seine Werte .
  3. ThingDAO: nicht notwendig für die Verwendung des Builder-Musters, sondern adressiert Ihre Frage.

Interaktion

/* 
ThingBuilder is a static inner class of Thing, where each of its 
"set" method calls returns the ThingBuilder instance being worked with 
while the final "build()" call returns the instantiated Thing instance. 
*/ 
Thing thing = Thing.createBuilder(). 
       .setToday("2012/04/01") 
       .setName("Example") 
       // ...etc... 
       .build(); 

// the Thing instance as get methods for each property 
thing.getName(); 

// get your reference to thingDAO however it's done 
thingDAO.save(thing); 

Das Ergebnis ist, dass Sie benannte Argumente und eine unveränderliche Instanz erhalten.

Verwandte Themen