2012-03-26 6 views
8

Ich formuliere mein Beispiel in generischen Begriffen, weil es den Punkt ohne Berücksichtigung meiner spezifischen Problemdetails vermittelt.Strong-Typisierung für Strings oder andere versiegelte Klassen

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.

Jetzt, in Ihrem Code, finden Sie weiterhin 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.

Also eine mögliche Lösung wäre, nur Klassen aus String abzuleiten.

public class FirstName : String 
{ 
} 

public class LastName : String 
{ 
} 

Jetzt, wenn Sie die falsche Art der Zeichenfolge übergeben würde der Compiler beschweren. Dies ist nicht möglich, da String versiegelt ist. Auch die "using" -Anweisung wird nicht funktionieren (denke ich), weil der Compiler nicht beschweren wird, wenn ich sie verwechsle.

using LastName = String; 

Sicher, konnte ich Klassen bauen, die die Zeichenfolge wickeln und dann werfen Konvertierungsmethoden schreiben, aber das scheint wie mehr Mühe, als es wert ist.

+2

Bitte prägen Sie Ihre Titel nicht mit "C#" und so weiter. Dafür sind die Tags da. –

+0

Warum verwenden Sie nicht benannte Argumente (die in der VS2010-Version von C# eingeführt wurden), um das Umstellen oder Sortieren von Parameterproblemen zu vermeiden, statt das Leben mit einer stärkeren Typisierung schwer zu machen? http://msdn.microsoft.com/en-us/library/dd264739.aspx –

Antwort

1

Nur nicht vergessen, einen anderen Klassen machen wie

A-FileStreamReader : StreamReader 
B-FileStreamReader : StreamReader 
Age : int 
Phone : long 
... 
... 
SLaksPhoneNumer : string // added under pressure...  

Die Lösungen, die Methoden mit den richtigen Parametern aufrufen, wenn das Verfahren zum vorName bitten, es geben und nicht Nachname ...

By the way, was Sie tun (in der Kompilierung oder in RUNTIME) verhindern würde:

new FirstName("Skeet"); 
new LastName("Jon"); 
+2

_Phone-Nummern sind Zeichenfolgen, nicht longs_ – SLaks

+1

@SLaks. Bearbeitet. Humor ++ – gdoron

+1

"Mach einfach keine Fehler". Nun, warum habe ich nicht daran gedacht: ^) – ChuckZ

0

Es ist schwer zu sagen, was genau Ihre Frage.

Wenn Sie beispielsweise eine Methode haben, die 6 String-Parameter akzeptiert und in Zukunft 7, sollten Sie vielleicht nur ein stark typisiertes Objekt erstellen, das die relevanten 6 Eigenschaften besitzt (die Sie in der Zukunft haben können) erweitern, um die siebte hinzuzufügen - die 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.

2

Jetzt, in Ihrem Code, finden Sie weiterhin 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 Ihre Frage wirklich ist. Angesichts dessen sollte es einige Verantwortung auf der Entwicklerseite 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:

void MyMethod(string firstName, stringMiddleName, string lastName, 
string phoneNumber, string email, string country, string city, 
string state, string zipcode, string countryISO, 
string pseudonym, string title, string addressLine1, string addressLine2) 

Offensichtlich ist das gewunden.Erstellen Sie ein Objekt ContactInfo Verpackung die meisten, wenn nicht alle diese Parameter, und dann können Sie schreiben:

void MyMethod(ContactInfo contact) 

EDIT:

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

string ConcatName(string firstName, string lastName) 
{ 
    return (firstName + " " + lastName); 
} 

string myName = ConcatName(lastName: "Crosby", firstName: "Bryan") 

Ausgang:

Bryan Crosby

ich noch genau einen Blick auf den Code nehmen und sehen, ob Sie die Methode Refactoring können (n) und Klassen.

2

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

public class Container<T> 
{ 
    public T Value { get; protected set; } 

    public Container(T value) 
    { 
     Value = value; 
    } 
} 

public class FirstName : Container<string> 
{ 
    public FirstName(string firstName) : base(firstName) { } 
} 

public class LastName : Container<string> 
{ 
    public LastName(string lastName) : base(lastName) { } 
} 

public class Age : Container<int> 
{ 
    public Age(int age) : base(age) { } 
} 

public class Program 
{ 
    public void Process(FirstName firstName, LastName lastName, Age age) 
    { 

    } 
} 
+0

Du hast es hier. Das ist, was ich gesucht habe. – ChuckZ

+0

@ ChuckZ. Sie werden Tausende von Klassen für jede Verwendung haben? – gdoron

+0

Ich bin sicher, er hat einen guten Grund, dies zu verwenden :) – MatthiasG

Verwandte Themen