2016-04-15 5 views
0

Ich habe eine Funktion in meinem C# Klasse:Soll die Validierung für verschiedene Codebausteine ​​kombiniert werden?

class Fun { 
    private string waterGun; 
    private string jacket; 

    void HaveSomeFun(bool summers) { 
     waterGun = <Some Value> 
     jacket = <Some Other Value> 

     validate(); 
     if(summers) { 
      Console.WriteLine("Using {0}", waterGun); 
     } else { 
      Console.WriteLine("Using {0}", jacket); 
     } 
    } 

    private void validate() { 
     ArgumentValidationHelper.ValidateNotNullOrEmpty("WaterGun", this.waterGun); 
     ArgumentValidationHelper.ValidateNotNullOrEmpty("Jacket", this.jacket); 
    } 
} 

ich die Variablen Instanzmitglieder für die Validierung nur mache. Ist es sinnvoll, den Gültigkeitsbereich von Variablen von einer Methode zu einer Klasse nur für die Validierung zu erhöhen?

Gibt es einen anderen (besseren) Weg, um diese Funktionalität zu erreichen, wenn die Validierung zentralisiert ist und Variablen nicht als Klassenmitglieder benötigt werden?

+0

Wenn Sie mutig genug sind, können Sie [System.ComponentModel.DataAnnotations] (https://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.validator (v = vs.110) verwenden. aspx). [Hier] (http://stackoverflow.com/q/2109423/6138713) ist eine beantwortete Frage, die sich auf Datenanmerkungen bezieht. –

Antwort

0

Nach Logik Code Validierung bereits zentralisiert ist (ich hoffe, dass die ganze Absicht war, als du/jemand ArgumentValidationHelper Klasse erstellt. Darüber hinaus ist ein Validate Verfahren das Hinzufügen nur diese 2 Validierungen zu wickeln, ich fühle, ist nicht erforderlich, es sei denn, Sie benötigen Ich glaube, Sie wissen, dass diese Klassenvariablen nicht benötigt werden, und ja, sie machen keinen Sinn, weil sie (A) privat (B) nicht durch Aufruf von Code gesetzt werden.

So ist meine Version des Codes ist:

class Fun { 
    void HaveSomeFun(bool summers) { 
     string waterGun = <Some Value> 
     string jacket = <Some Other Value> 

     ArgumentValidationHelper.ValidateNotNullOrEmpty("WaterGun", waterGun); 
     ArgumentValidationHelper.ValidateNotNullOrEmpty("Jacket", jacket); 

     if(summers) { 
      Console.WriteLine("Using {0}", waterGun); 
     } 
     else { 
      Console.WriteLine("Using {0}", jacket); 
     } 
    } 
} 
+0

Das klingt vernünftig für mich. Ich denke, ein zunehmender Umfang von Variablen von der Methode zu einer Klasse nur für die Validierung ist keine gute Strategie insgesamt. – Amber

0

Zuerst bin ich nicht sicher, warum Ihre Mitgliedsvariablen privat sind. Ist das ein Tippfehler? Wenn der Benutzer sie nicht ändern kann, müssen Sie sie nicht überprüfen.

Angenommen, Sie meinten eigentlich "public", könnten Sie in Betracht ziehen, die Elementvariablen in Properties zu konvertieren und die Validierung innerhalb des Setter durchzuführen. Dann können Sie entweder einen Fehler oder einen Standardwert erzeugen. Ich mag diesen Ansatz besser, weil er sicherstellt, dass Ihre Klasse immer in einem gültigen Zustand ist (vorausgesetzt, der aufrufende Code behandelt die Fehler vernünftig ...), anstatt validate() bei jeder Verwendung aufzurufen.

Wenn Sie sie als Argumente verlassen wollen, können Sie auch eine Hilfsklasse machen:

class FunArguments { 
    private string waterGun; 
    public string WaterGun { 
     get { return waterGun; } 
     set { 
      //do some validation check here 
      waterGun = value; 
     } 
    } 
    // etc.. 
} 

, die Sie dann zu Fun in irgendeiner Weise passieren kann.

+0

Meine Frage ist: Macht es Sinn, den Gültigkeitsbereich von Variablen von einer Methode zu einer Klasse nur für die Validierung zu erhöhen? Sie schlagen vor, sie zu Instanzmitgliedern zu machen. Gibt es einen Grund dafür? – Amber

+0

Nun, es hängt davon ab, wo Ihre Variablen herkommen, was ich an Ihrem Code nicht erkennen kann. Nur '' zu schreiben ist nicht sehr klar. – smead

Verwandte Themen