4 Stimmen

Klassenbibliothek von Konstanten - die beste Praxis?

Ich habe .Net Reflector für eine interne Anwendung verwendet, um zu verstehen, was der vorherige Entwickler getan hat, und auch um zu lernen. Ich habe nie gehabt aktuell Anleitung, wie man Apps entwickelt, also nehme ich, wo ich kann (Hurra Stack Overflow). Das heißt, ich habe etwas gefunden, das mich verwirrt hat. Eine Klassenbibliothek namens WinConstant, die den folgenden Code enthält.

Hier sind meine aktuellen Fragen:

  1. Wozu könnte das gut sein?

  2. Welchen Wert hat die Speicherung einer eine Reihe von Konstanten in einer Klasse Bibliothek?

  3. Gilt dies als "Beste Praxis"?

Gedanken und Ratschläge sind willkommen!

Public Class clsConstant
    Public Const cAccess As String = "Access"
    Public Const cAddress As String = "Address"
    Public Const cCancel As String = "Cancel"
    Public Const cCity As String = "City"
    Public Const cClear As String = "Clear"
    Public Const cClickOnMessage As String = "Click on any row in top pane to see the detail fields in the bottom pane."
    Public Const cClientID As String = "ClientID"
    Public Const cColon As String = ": "
    Public Const cComma As String = ","
    Public Const cContactID As String = "ContactID"
    Public Const cCounty As String = "County"
    Public Const cDash As String = "-"
    Public Const cDelete As String = "Delete"
    Public Const cDepartment As String = "Department"
    Public Const cError As String = "Error"
    Public Const cExec As String = "Exec"
    Public Const cFalse As String = "False"
    Public Const cFavorite As String = "Favorite"
    Public Const cFederal As String = "Federal"
    Public Const cFriday As String = "Friday"
    Public Const cfrmMain As String = "frmMain"
    Public Const cfrmModuleLogin As String = "frmModuleLogin"
    Public Const cfrmModuleSplash As String = "frmModuleSplash"
    Public Const cHelp As String = "Help"
    Public Const cHint As String = "Hint"
    Public Const cImagePath As String = "../../image"
    Public Const cIn As String = "In"
    Public Const cInformation As String = "Information"
    Public Const cInitialScreenID As String = "InitialScreenID"
    Public Const cInsert As String = "Insert"
    Public Const cJuvenileID As String = "JuvenileID"
    Public Const cLetter As String = "Letter"
    Public Const cManual As String = "Manual"
    Public Const cMasterID As String = "MasterID"
    Public Const cModuleID As String = "ModuleID"
    Public Const cModuleName As String = "ModuleName"
    Public Const cMonday As String = "Monday"
    Public Const cName As String = "Name"
    Public Const cNegative As String = "Negative"
     _
    Public Shared ReadOnly cNLowDate As DateTime = New DateTime(&H851055320574000)
     _
    Public Shared ReadOnly cNullDate As DateTime = New DateTime
    Public Const cNullDateString As String = "12:00:00 AM"
    Public Const cOfficeIDDefault As String = "01"
    Public Const cOne As Integer = 1
    Public Const cOut As String = "Out"
    Public Const cPopUp As String = "PopUp"
    Public Const cPositive As String = "Positive"
    Public Const cProcess As String = "Process"
    Public Const cProviderID As String = "ProviderID"
    Public Const cQuestion As String = "Question"
    Public Const cRead As String = "Read"
    Public Const cReferralID As String = "ReferralID"
    Public Const cReminder As String = "Reminder"
    Public Const cReport As String = "Report"
    Public Const cReportEngine As String = "ReportEngine"
    Public Const cReportEnginePath As String = "ReportEnginePath"
    Public Const cReportingServices As String = "ReportingServices"
    Public Const cReportServer As String = "ReportServer"
    Public Const cReportService As String = "ReportService"
    Public Const cReportServiceLocal As String = "ReportServiceLocal"
    Public Const cReportServiceServer As String = "ReportServiceServer"
    Public Const cSaturday As String = "Saturday"
    Public Const cSearch As String = "Search"
    Public Const cSelect As String = "Select"
    Public Const cSpace As String = " "
    Public Const cSQLLoginError As String = "SQL Server login/password invalid"
    Public Const cStart As String = "Select a module"
    Public Const cState As String = "State"
    Public Const cSubjectID As String = "SubjectID"
    Public Const cSunday As String = "Sunday"
    Public Const cThursday As String = "Thursday"
    Public Const cTooltipCancel As String = "Reset form data values back to before all manual changes."
    Public Const cTooltipClear As String = "Clears all data entry fields prior to an Insert"
    Public Const cTooltipClient As String = "Display a Client popup window."
    Public Const cTooltipClose As String = "Close this form"
    Public Const cTooltipDelete As String = "Delete the current record being displayed, no undo possible."
    Public Const cTooltipExe As String = "Initiate a batch process."
    Public Const cTooltipInsert As String = "Insert a brand new record"
    Public Const cTooltipSearch As String = "Perform a Search for values entered."
    Public Const cTooltipSelect As String = "Perform a Select for values entered."
    Public Const cTooltipUpdate As String = "Update an existing record"
    Public Const cTrue As String = "True"
    Public Const cTuesday As String = "Tuesday"
    Public Const cUnderscore As String = "____________________________________________________________"
    Public Const cUpdate As String = "Update"
    Public Const cWarning As String = "Warning"
    Public Const cWeb As String = "Web"
    Public Const cWednesday As String = "Wednesday"
    Public Const cWorkerID As String = "WorkerID"
    Public Const cZero As Integer = 0
    Public Shared strLongDate As String() = DateAndTime.Now.ToLongDateString.Split(New Char() { ","c })
    Public Shared strModuleMainStatusStripFormID As String = Nothing
End Class

8voto

Joe Soul-bringer Punkte 3214

In den Tagen der Programmierung von Windows-Anwendungen in C gab es ähnliche Dateien #included in Windows, die aus folgenden Elementen bestanden lang Listen von #Definitionen, die Konstanten erzeugen. Verschiedene c-Anwendungen haben diesen Ansatz in ihren eigenen Dateien nachgeahmt. Die "Klasse" scheint eine "Transliteration" dieses "C-ismus" zu sein. Das Grundprinzip des objektorientierten Designs besteht darin, Code und Daten zu zusammenhängenden funktionalen Einheiten zu mischen: zu Objekten. Wie jfullerton schrieb:

Aus der Sicht der Programmierung, Objektorientierung beinhaltet Programm Objekte, Kapselung und Vererbung, und Polymorphismus. Die konzeptionellen Objekte sind im Programmcode modelliert Code modelliert. Die Verkapselung hält die Eigenschaften eines Objekts Daten eines Objekts und die Methoden, die diese Daten verwenden zusammen als Teil des Objekts.

Diese konstante Liste entspricht also eindeutig nicht den OO-Praktiken, sondern ist ein Rückgriff auf die alten Zeiten.

Um Ihre Fragen zu beantworten:

  1. -- Diese Klasse enthält Konstanten, d.h. sie
  2. -- Der alte Entwickler hat dies wahrscheinlich getan, weil er es gewohnt war, dies zu tun.
  3. -- Es ist nicht aktuell beste Praktiken.

Wenn dies ein Teil Ihrer Bewerbung ist, können Sie es natürlich nicht einfach wegwerfen. Vielmehr ist dies etwas, das im Laufe der Zeit refaktorisiert werden muss, vorausgesetzt, Sie verwenden aktuell bewährte Praktiken von Testgetriebene Entwicklung y Refaktorierung

7voto

Joel Coehoorn Punkte 377088

Ausgliederung Literale vom Rest des Codes zu trennen, ist eine gute Idee.

Seltsam ist, dass es sich dabei größtenteils um Ressourcen und nicht um konstante Zeichenfolgen handeln sollte. Dann könnten sie bei Bedarf leicht lokalisiert oder ersetzt/aktualisiert werden, ohne die gesamte Anwendung neu kompilieren zu müssen.

Einige von ihnen sollten nicht einmal Ressourcen sein: cUnderscore sieht zum Beispiel so aus, als würde es Text verwenden, um einen visuellen Effekt zu erzeugen - generell eine schlechte Idee.

Zur Verteidigung Ihres Vorgängers möchte ich anmerken, dass ich diesen Code für besser halte, als die gleichen Konstanten im gesamten Quelltext zu finden, da er die Umstrukturierung auf Ressourcen ein wenig einfacher macht.

5voto

Gerrie Schenck Punkte 21800

Eine Konstante ist etwas, das sich nie ändert, zum Beispiel

Public Const NumberOne as Int = 1

Meine erste Bemerkung: Einiges von dem, was Sie zusammengefasst haben, ist nicht wirklich const.

Ein weiterer Nachteil ist, dass die Verwendung des Schlüsselworts const eine binäre Abhängigkeit erzeugt. Dies bedeutet, dass Sie die Assembly, die Ihre constants.dll verwendet, neu erstellen müssen. Sie können sie nicht einfach ersetzen. Das liegt an der Funktionsweise von consts: Der Compiler ersetzt den Namen durch den Wert zur Kompilierzeit .

Eine Lösung für dieses Problem ist die Verwendung von ReadOnly anstelle von Const.

Ich halte es nicht für eine gute Praxis, eine solche Bibliothek zu erstellen. Ich würde meinem Team sowieso nicht erlauben, eine zu erstellen...

5voto

Steve Mitcham Punkte 5131

Das sieht so aus, als hätte ein Entwickler einen Kodierungsstandard, der besagt: Verwende keine Stringliterale in deinem Code, und hat pflichtbewusst jede einzelne Konstante herausgetrennt, egal ob es Sinn macht oder nicht.

Zum Beispiel gibt es wahrscheinlich ein Element, bei dem die Zahl 1 im Code benötigt wurde, und anstatt DefaultNumberOfLineItems oder eine andere beschreibende Konstante zu verwenden, wurde NumberOne = 1 verwendet;

Am besten wäre es, Konstanten beschreibend und in der Nähe ihres Verwendungszwecks zu halten. Es spricht nichts gegen eine statische Klasse verwandter Konstanten, die eine gewisse Bedeutung haben und miteinander in Beziehung stehen.

Ich habe zum Beispiel an einem System gearbeitet, das Attribute mit eindeutigen Schlüsseln versieht. Diese Schlüssel werden in einer statischen Klasse mit beschreibenden Namen für die Attribute gesammelt, die eigentlichen Schlüssel werden von einem automatischen System generiert

public static class AttributeIDs
{
   public const string Name = "UniqueGeneratedKeyForNameAttribute";
   public const string Description ="UnqiueGeneratedKeyForDescriptionAttribute";
   ... etc.
}

In der Praxis wird dies wie folgt verwendet

MyAccess.GetValueForAttribute(AttributeIDs.Name);

die alle zugehörigen Konstanten zusammenfasst.

2voto

Scott Dorman Punkte 41206

Es gibt mögliche nützliche Szenarien für eine solche Klasse. Im Allgemeinen werden Dinge wie "magische Zahlen" oder "magische Zeichenketten" in Konstanten umgewandelt und in einer statischen (gemeinsam genutzten) Klasse abgelegt. Der Grund dafür ist, diese "magischen" Werte an einem einzigen Ort zu isolieren und zu ermöglichen, dass sie durch einen sinnvollen Namen referenziert werden können. (Normalerweise wird dies für numerische Werte verwendet.) Im Falle von String-Werten hilft es sicherzustellen, dass jedes Mal auf denselben Wert verwiesen wird. Das beste Beispiel hierfür sind String-Schlüssel in Ihrer app.config-Datei.

Abgesehen davon sollten Konstanten für etwas verwendet werden, das sich nicht ändert (oder sich so selten ändert, dass es effektiv konstant ist). In den meisten Fällen sollten Strings, die sich ändern können (oder lokalisiert werden müssen), als Ressourcen in einer .resx-Datei gespeichert werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X