Strong-typing für Strings oder andere versiegelte Klassen

8

Ich formuliere mein Beispiel in generischen Begriffen, weil es den Punkt vermittelt, ohne auf meine spezifischen Problemdetails eingehen zu müssen.

Angenommen, Sie hatten eine Reihe von Methoden, die Strings als Parameter verwenden. Angenommen, eine Zeichenfolge wäre der "Vorname" einer Person und eine andere wäre der "Nachname" einer Person. Es könnte andere Saiten wie "Lieblingsessen" geben.

In Ihrem Code finden Sie immer wieder Laufzeitfehler, weil Sie die Parameter durcheinander bringen. Sie können die Reihenfolge von "Vorname" und "Nachname" ändern oder eine verwenden, wenn Sie die andere verwendet haben sollten. Der Wert von stark typisierten Sprachen besteht darin, dass diese Fehler zur Build-Zeit und nicht zur Laufzeit gefunden werden.

Eine mögliche Lösung wäre also, nur Klassen aus string abzuleiten.

%Vor%

Wenn Sie nun den falschen String-Typ übergeben haben, würde sich der Compiler beschweren. Das obige ist nicht möglich, da String versiegelt ist. Außerdem wird die "using" -Anweisung nicht funktionieren (denke ich), weil der Compiler sich nicht beschweren wird, wenn ich sie verwechsle.

%Vor%

Sicher, ich könnte Klassen erstellen, die die Zeichenfolge umschließen und dann Umwandlungsmethoden für die Umwandlung schreiben, aber das scheint mehr Mühe zu geben, als es wert ist.

    
ChuckZ 26.03.2012, 18:02
quelle

4 Antworten

2

Ich weiß nicht, was Ihr Ziel ist, aber Sie scheinen es ernst zu meinen :) So wäre eine mögliche Lösung, eine generische Container-Klasse zu verwenden. Es wäre in der Tat weniger bequem, als von den versiegelten Klassen zu erben.

%Vor%     
MatthiasG 26.03.2012 18:18
quelle
2
  

In Ihrem Code finden Sie immer wieder Laufzeitfehler, weil Sie die Parameter durcheinander bringen. Sie können die Reihenfolge von "Vorname" und "Nachname" ändern oder eine verwenden, wenn Sie die andere verwendet haben sollten. Der Wert von stark typisierten Sprachen besteht darin, dass diese Fehler zur Build-Zeit und nicht zur Laufzeit gefunden werden.

Es ist schwer zu sagen, was deine Frage wirklich ist. Angesichts dessen sollte es auf der Entwicklerseite einige Verantwortung geben. Über wie viele Parameter reden wir hier? Wenn Sie mehr als ein paar Parameter haben, bedeutet dies in der Regel, dass Sie Ihren Code umgestalten müssen. Zum Beispiel:

%Vor%

Offensichtlich ist das verworren. Erstellen Sie ein Objekt ContactInfo , das die meisten, wenn nicht alle diese Parameter umschließt, und schreiben Sie dann:

%Vor%

BEARBEITEN:

Sie können, wenn Sie VS2010 verwenden, die Funktion benannter Parameter verwenden. Dadurch können Sie sie in einer anderen Reihenfolge übergeben.

%Vor%

Ausgabe:

  

Bryan Crosby

Ich noch würde Ihren Code genau betrachten und sehen, ob Sie die Methode (n) und Klassen umgestalten können.

    
Bryan Crosby 26.03.2012 18:18
quelle
1

Vergessen Sie nicht, andere Klassen wie

zu erstellen %Vor%

Die Lösung ist, rufen Sie die Methoden mit den richtigen Parametern auf, wenn die Methode nach FirstName fragt und nicht nach LastName ...

Übrigens, was Sie daran hindern würde (in der Kompilierzeit oder in RUNTIME):

%Vor%     
gdoron 26.03.2012 18:07
quelle
0

Es ist schwer zu sagen, was genau deine Frage ist.

Wenn Sie zum Beispiel eine Methode haben, die 6 String-Parameter benötigt und in Zukunft vielleicht 7, sollten Sie vielleicht ein stark typisiertes Objekt erstellen, das die relevanten 6 Eigenschaften hat (die Sie in Zukunft erweitern können) Hinzufügen der siebten - Vermeidung der Notwendigkeit, die Signatur auf der Methode zu ändern. Dann kann Ihre Methode nur den einen Parameter akzeptieren, der Ihr stark typisiertes Objekt ist, das die relevanten Parameter für Ihre Methode enthält.

    
brightgarden 26.03.2012 18:13
quelle