2016-05-13 4 views
2

Ich bin von Python, Ruby und PHP World und eine der Techniken, die ich versuche zu entfernen ist Argument-Reihenfolge Abhängigkeiten von meinem Code. Dies ist eine kurze Demonstration dieser Technik in Ruby implementiert:Wie vermeidet man Argument-Reihenfolge Abhängigkeiten in statisch getippten Sprachen wie Java oder C#

class Gear 
    attr_reader :chainring, :cog, :wheel 
    def initialize(args) 
     @chainring = args[:chainring] 
     @cog = args[:cog] 
     @wheel = args[:wheel] 
    end 
    ... 
end 

Gear.new(
    :chainring => 52, 
    :cog => 11, 
    :wheel => Wheel.new(26, 1.5)).gear_inches 

Wie Sie den Client-Code muss nicht die Reihenfolge der Argumente wissen, sehen einen Gang Beispiel für die Initialisierung und Ich mag das. Aber jetzt frage ich mich, wie das Gleiche in statisch typisierten Sprachen wie Java implementiert ist und ich mich auch frage, ob Leute versuchen, solchen Techniken zu folgen oder nicht in dieser Art von Sprachen. Wenn jemand seine Erfahrung teilen und Democode zeigen kann (sei es in Java, C# usw.), wäre das großartig.

+1

Wahrscheinlich wird das Fassadenmuster stattdessen verwendet, um die Clientseite zu vereinfachen? – Jacobian

+2

Im Allgemeinen nicht; Sie können benutzerdefinierte Objektinstanzen als Parameter verwenden (zumindest in Java ist Ihre Argumentreihenfolge Teil der Methodensignatur). –

+0

Es klingt, als ob Sie an Groovy interessiert sein könnten; es stellt sowohl benannte Initialisierer als auch etwas anderen Zucker zur Verfügung, den Sie suchen. – chrylis

Antwort

3

Wenn es nur für neues Objekt erstellen, können Sie Object Initializer verwenden können:

public class Gear 
{ 
    public int Chainring { get; set; } 
    public int Cog { get; set; } 
    public int Wheel { get; set; } 
} 

// ... 
var gear = new Gear 
{ 
    // could be in any order, 
    Cog = 11, 
    Chainring = 52, 
} 

Wie für Methodenargumente Besuche KSid Antwort auf Named and Optional Arguments.

+0

Ah Ich glaube, ich habe missverstanden, was die Person fragte, aber ich glaube, Ihre Antwort ist richtig. – KSib

+0

@KSib Gar nicht, Sie haben für den 2. Fall, aber nicht vollständig abgedeckt. – Xiaoy312

+0

Sieht gut aus! Vielen Dank! Ich wünschte, Java hätte auch eine solche Technik. – Jacobian

4

Sie müssen keine Argumentreihenfolge in C# einhalten. Wenn Sie den Parameternamen kennen, können Sie named and optional arguments nutzen, indem Sie den Parameternamen, einen Doppelpunkt und Ihren Wert verwenden.

static void Main(string[] args) 
    { 
     var variable1 = "1"; 
     var variable2= 90056; 
     var variable3 = 'u'; 

     // random order 
     TestMethod(arg3: variable3, arg1: variable1, arg2: variable2); 

     // you can even omit some argument 
     TestMethod(arg2: variable2); 
    } 

    private static void TestMethod(string arg1 = null, int arg2 = 0, char arg3 = '\0') 
    { 
     Console.WriteLine(arg1); 
     Console.WriteLine(arg2); 
     Console.WriteLine(arg3); 

     Console.ReadKey(); 
    } 

Ich glaube, dass Xiaoy312 Antwort ist, was Sie suchen, aber ich werde das hier nur verlassen, falls jemand darüber später neugierig ist.

+0

Erweiterte Ihre Antwort mit optionalen Argumenten für die Vollständigkeit. Ich änderte auch die Argumentordnung zu der Weise, die ich mag xP – Xiaoy312

+0

Haha, das ist in Ordnung. Danke für die Unterstützung in beide Richtungen :) – KSib

2

Das ist eine Sprachfunktion, die in einigen, aber nicht in allen statisch typisierten Sprachen vorhanden ist. Die Funktion ist in Java nicht vorhanden, aber sie ist in Scala vorhanden und in C# vorhanden (siehe KSibs Antwort).

In Bezug auf Ihre Technik gibt es ein paar Vorteile.

  1. Ihr Code funktioniert auch, wenn Argument, um
  2. Sicherheit Verbesserter Compiler geändert wird über Ihre Parameter explizit zu werden (zB Compiler-Fehler, wenn Argument nicht existiert)
  3. Verbesserte Lesbarkeit, wo es mehrere Überladungen für eine Verfahren
  4. bessere Lesbarkeit/Wartbarkeit, wo es mehr Argumente des gleichen Typs sind

die Nachteile sind

  1. Sie sind gekoppelt Argumentnamen
  2. Argument Namen eher über geringfügige Revisionen ändern, aber Argument, um angeblich nicht
  3. Weitere ausführliche Code
2

Versuchen über geringfügige Revisionen ändern Lombok.

In Java, Argument Reihenfolge in Methoden ist sehr zwingend, es sei denn, Sie sprechen über Kommandozeilen-Anwendungen und dafür würde ich vorschlagen Apache CLI. Wenn Sie über Konstrukteure sprechen, dann ist Lombok eine gute Bibliothek für Sie. Es implementiert ein Builder-Muster und Sie können dann Ihre Instanzen basierend auf einer beliebigen Anzahl von privaten Variablen, die Sie deklariert haben, und in beliebiger Reihenfolge erstellen.

Angenommen, Sie haben:

@Builder 
public class MySuperClasse { 

private int mySuperInt; 

private String mySuperString; 

private Date mySuperDate; 

} 

Sie dann Ihre Instanzen wie folgt aufbauen können:

MySuperClass super = MySuperClass.builder().mySuperString(string).mySuperInt(int).mySuperDate(date).build(); 

oder Sie können

MySuperClass super = MySupeClass.builder().mySuperDate(date).build(); 

Im Wesentlichen geschieht tun, was ist, wenn Sie Wenn Sie Ihre Klasse mit @Builder annotieren, erstellt Lombok implizit den Builder und die verschiedenen Methoden zum Erstellen Ihrer Klasse Beispiel. Das Schöne daran ist, dass es genau das tut, was Sie wollen, jedoch in einer etwas anderen Art und Weise.

+1

Sieht handlich aus. Allerdings scheinen C# -Setter und Getter bequemer zu sein. – Jacobian

Verwandte Themen