2010-06-23 4 views
5

Ich bin auf der Suche nach einem Ratschlag, wie man "konstante" Strings innerhalb meiner Klassen empfehlen kann, z.Design Hinweise zu Getter oder Const für String in Klassen - was machen andere?

public string EmployeesString { get { return "Employees"; } } 

const string EmployeeString = "Employee"; 

Der Grund, warum ich diese umsetzen möchte, dh entweder über eine const oder über einen Getter ist, weil während meiner Klasse (n), I Methoden und Konstrukteure, die diese Zeichenfolgen als Parameter verwenden, und ich dachte, um Tippfehler zu vermeiden und auch Strings zu vermeiden (schwach typisiert?), wollte ich sie stark referenzieren, z

DoSomething(this.EmployeeString, employee); 

Was tun andere? Jeder Rat wird sehr geschätzt werden! Ist das gut/schlecht?

Antwort

3

Die "richtige" Antwort hängt meiner Meinung nach davon ab, wie und warum Sie die Zeichenfolge verwenden.

Wenn die Zeichenfolge zur Anzeige verwendet oder einem Benutzer angezeigt wird, ist die Eigenschaft ein besseres Design. Dies macht es viel einfacher, die Lokalisierung später hinzuzufügen, indem Sie die Konstante in Ressourcendateien verschieben, ohne die API ändern zu müssen. Dies macht es auch einfacher, Ihre Klasse anzupassen, ohne anderen Code zu brechen, da Sie die "Konstante" jederzeit ändern können, ohne andere Assemblies zu beschädigen.

Ich finde selten geeignete Verwendungen für den zweiten Fall - sehr wenige Zeichenfolgen sind wirklich konstant, und wenn sie sind, glaube ich, dass sie in der Regel besser als eine Aufzählung statt einer Zeichenfolge dargestellt werden. Dies ist fast immer besser als "magische Zeichenfolgen" in Ihrem Code. Die seltenen Ausnahmen bestehen normalerweise bei der Interaktion mit Legacy-Code. Wenn Sie mit einer separaten API arbeiten, die eine Zeichenfolge erwartet, und die Zeichenfolge wirklich konstant ist, ist die Verwendung einer Konstante möglicherweise "besser" ist in seiner Absicht effizienter und sehr klar.

Denken Sie auch daran, dass die beiden Ansätze miteinander kombiniert werden können:

private const string employeeString = "Employee"; 

public string EmployeeString { get { return employeeString; } } 

Auf diese Weise können Sie die Konstante verwenden, es ist Absicht klar, was aber leicht dies später zu ändern, ohne einen anderen Code zu brechen oder das Ändern Ihrer API . (Ich persönlich bevorzuge dies zu Ihrer "zweiten" Option oben, da die magische Zeichenfolge in der Eigenschaft Getter ist ein Code-Geruch für mich - ich mag meine Konstanten, um offensichtliche Konstanten sein, aber immer noch Eigenschaften bevorzugen.)

+0

Große Rückmeldung. Ich werde nicht für die UI-Ebene verwenden, sondern versuche, APIs zu verwenden, die Zeichenfolgenparameter für Parameter benötigen. – user118190

1

Wovon du sprichst, wäre zumindest in diesem Beispiel eine "Konstante". Daher wäre die zweite Methode meines Erachtens die "geeignetste".

3

Alle Zeichenfolgen, die Sie für Anzeige- oder UI-Arbeit verwenden, sollten in Ressourcendateien eingefügt werden. Dies ermöglicht einen stark typisierten Schlüssel, ermöglicht aber auch eine einfache Internationalisierung Ihrer Anwendung, da Sie die Ressourcendatei in eine neue Sprache übersetzen lassen können, und sie wird automatisch für Benutzer dieser Kultur angewendet.

Zum Beispiel, wenn Sie eine neue RESX-Datei in das Projekt gesteckt namens „ApplicationStrings“, und hinzugefügt, um es ein Schlüssel/Wert-Paar „EmployeeString“/„Mitarbeiter“, man könnte es so in Ihrer Anwendung aufrufen :

DoSomething(ApplicationStrings.EmployeeString, employee); 

Wenn Sie eine übersetzte Version dieser Strings erstellt, lassen Sie uns für mexikanische Spanisch sagen, würden Sie nur eine neue Datei ApplicationStrings.es-mx.resx genannt erstellen. Wenn Personen mit der Einstellung "es-mx culture" Ihr Programm verwenden, wird automatisch die übersetzte Version verwendet.

Die Vorteile sind also ziemlich klar - stark referenzierte Werte, einfache Lokalisierung und zentralisierte Verwaltung von Magic Strings in Ihrer Anwendung.

Auch für Strings, die nicht angezeigt werden, erstelle ich normalerweise Ressourcendateien für sie, wie "InternalStrings.resx". Auf diese Weise können Sie stark typisierte Verweise auf interne "magische Zeichenfolgen" verwenden, die Ihr Programm möglicherweise benötigt, und wenn Sie sie ändern müssen, müssen Sie den Wert nur an einer Stelle ändern.

+0

Genau. Wie dies am besten geschieht, hängt vollständig davon ab, ob die Zeichenfolge für die Signalisierung in Ihrer Assembly, die Signalisierung außerhalb Ihrer Assembly, die Speicherung in einer Datenbank oder für die UI-Arbeit bestimmt ist. +1 –

+0

@Sanjay - guter Punkt, es gibt wesentlich mehr zu denken über die Internationalisierung als nur übersetzte Dateien. Das Sourcing von Strings ist ein guter erster Schritt, um Ihren Anwendungscode dafür zu bereinigen, und eine gute Angewohnheit, sich darauf einzulassen. – womp

+0

+1: Es gibt (seltene) Orte, wo ich glaube, dass konstante Strings sinnvoll sind, aber wie ich in meiner Antwort sagte, sind sie selten - sonst stimme ich zu 100%, und nette Arbeit auf Einzelheiten der Vorteile der Ressource ausspülen Saiten. –

2

Wenn sich die Zeichenfolgen in der Zukunft ändern können, müssen Sie vorsichtig sein, wenn Sie sie const machen, zumindest wenn sie für andere Assemblies zugänglich sind. Andernfalls könnten die anderen Assemblies den neuen Wert nicht übernehmen Erstellen Sie eine neue Version der Assembly.

Edit: Hinzugefügt fehlende Wörter

+1

Wenn ich gegen Ihre Assembly baue und auf Ihre Konstante referenziere, wird der Wert von const in meinen Code integriert. Sie ändern Ihren const Wert und veröffentlichen eine neue Version und es können schlimme Dinge passieren. – Will

+0

@Will: Ja, das ist es, was ich sagen wollte, aber ich denke, ich leide an temporäre Legasthenie oder etwas :) –

1

const Feld

+0

statisch = konst – Will

+0

thx, repariert (ich javaized :)) – Xorty

2

korrekt ist, wenn es wirklich eine Konstante ist dies tue ich:

const string EmployeeString = "Employee"; 

Es ist bei weitem der einfachste Weg, andere Programmierer zu sagen, "Das wird sich nicht ändern."

public string EmployeesString { get { return "Employees"; } } 

Ohne in dem Code zu sehen, weiß ich nicht, was in der Accessor passieren wird. Ich weiß nur, dass es einen Accessor gibt, und ich bekomme einen String zurück. Später könnte auch in diesem Beispiel jemand eine Set-Eigenschaft usw. hinzufügen und den Wert der Eigenschaft zur Laufzeit ändern. Das kann man nicht mit einer Konstante machen.

+0

Groß, Dank !! – user118190

Verwandte Themen