2015-03-06 7 views
7

Angenommen, ich habe ein Objekt Auto, mit fünf Parametern, {Zahlen, Farbe, Kilometerstand, Pferdestärken, maxSpeed}. Ich habe eine Methode, die 3 dieser Werte benötigt. Welche der beiden Optionen gilt als Best Practice? Ist es besser, umschließendes Objekt zu übergeben und die Anzahl der Parameter zu reduzieren, ODER einfach nur minimale Daten an eine Methode zu übergeben (zB: bei Methode 2 wird auf Zahlen und Farbe nicht zugegriffen)?Ist es gut, minimale Parameter zu übergeben?

  1. Option 1 Pass ganzes Objekt:

    void compute(Car c, Person p) { 
        return c.mileage + c.horsepower + c.maxSpeed + p.age; 
    } 
    
  2. Option 2: gerade in den Verfahren Werte zu.

    void compute(int mileage, int horsepower, int maxSpeed, int age) { 
        return mileage + horsepower + maxSpeed + age.; 
    } 
    

Hinweis: davon ausgehen, aus irgendeinem Grund, berechnen kann nicht ein Teil der Car-Klasse sein. Bitte antworten Sie mit dieser Annahme.

+1

Es ist wahrscheinlich Geschmack, der entscheidet.Die folgende Konvention hilft immer, also würde ich sagen, dass das Gehen mit weniger Argumenten üblicher ist, mehr Sinn ergibt und am wichtigsten ist flexibler (das Ändern der Felder in der "Car" -Klasse ändert nicht die Methodensignatur) – Dragan

Antwort

6

Es ist besser, das eingeschlossene Objekt zu übergeben, da jede Veränderung in der Anzahl der Parameter bei der Berechnung nicht erforderlich, die Methodensignatur in Zukunft beeinflussen würde.

Sie können tatsächlich eine Schnittstelle Typ, sagen, Vehicle stattdessen akzeptieren. Dies ermöglicht, dass die gleiche Methode später Daten auf Bike, Jet usw. berechnen kann.

public int compute(Vehicle veh) { 
    return veh.computePerformance(); 
} 

wo Car implementiert das Verfahren als

public int computePerformance() { 
    return mileage + horsepower + maxSpeed; 
} 

Die Idee ist, Code zu schreiben, der sich leicht auf Dehnbarkeit verleiht.

+0

Es ist besser, das eingeschlossene Objekt zu übergeben, da jede Änderung in der Anzahl der Parameter erforderlich ist Die Berechnung würde die Methodensignatur in Zukunft nicht beeinflussen. - Das antwortet! – JavaDeveloper

5

Ich würde eine dritte Option vorschlagen: Fügen Sie eine Methode "compute" zu Auto hinzu.

Dies heißt "Sag, frag nicht".

Siehe http://martinfowler.com/bliki/TellDontAsk.html

+0

lässt uns sagen 'compute' brauchte ein anderes Objekt namens Truck und konnte aus irgendeinem Grund nicht Teil des Autos sein? – JavaDeveloper

+0

@JavaDeveloper Vielleicht machen Sie eine abstrakte Superklasse Vehicle und implementieren Sie eine nicht abstrakte Methode 'compute' in ihr. Machen Sie Car, Truck, alles, was Sie brauchen, erben Sie davon (oder machen Sie es abstrakt, wenn Sie es später in Unterklassen implementieren wollen). Dann haben alle Unterklassen automatisch 'compute'. Sie können die Felder "Kilometerstand", "Pferdestärke" und "maxSpeed" tatsächlich in die Superklasse verschieben. – Shashank

+0

@Shashank lässt annehmen, dass 'compute' eine andere Klassenperson benötigt, die nicht in der Klassenhierarchie verwandt ist. Punkt der Frage ist nicht, Vererbung zu lernen, es ist über 'übergeben Sie mehr params vs pass einzelnes Objekt' – JavaDeveloper

2

Ich schlage zweite Option vor.

Warum?

Annahme eines: Ihre Rechenmethode wird von einer anderen Klasse verwendet Kilometer zu berechnen sagte 'Klasse Eigentümer

Annahme zwei: Angenommen, morgen Ihre Rechenmethode eines mehr benötigt Attribut aus der Klasse Auto zu berechnen das Meilenalter.

Wenn Sie nach Option eins gehen: dann müssen Sie einen weiteren Parameter in method compute einführen, was zu Kompilierungsproblemen in anderen Klassen führen würde, die Ihre Methode aufrufen. In diesem Fall 'Klasseninhaber'.

Wenn Sie nach Option zwei gehen: Sie haben die Flexibilität, um Ihre Implementierung der Berechnungsmethode zu aktualisieren, ohne irgendeine andere Klasse zu beeinflussen, die diese Methode verwendet.

Verwandte Themen