Ověření dat konstruktoru

hlasů
3

Třída vzorek „C # Třída Desing Handbook“ (str 137) nevyvolá validační metodu třídy pro určité oblasti z vnitřní tříd pouze konstruktoru. Takže v podstatě třída vzorek umožňuje vytvořit objekt se špatnými údaji a jen vyvolá chybu za těmito daty při volání vlastnost pole, která dělá ověření na to pak. Takže nyní máte špatný objekt a nejsou to vědět, dokud po faktu.

Nikdy jsem nepochopil, proč nemají stačí zavolat na majetek z konstruktoru tedy házet chybu okamžitě, je-li nalezena chybná data během inicializace? Jsem e-mailem je k ničemu ...

Mám ve zvyku používat následující formát voláním své vlastnosti od svých konstruktérů - je to správné struktury pro ověření inicializační data? ty

class Foo
{
    private string _emailAddress;

    public Foo(string emailAddress)
    {
        EmailAddress = emailAddress;
    }

    public string EmailAddress
    {
        get { return _emailAddress; }
        set
        {
            if (!ValidEmail(value))
                throw new ArgumentException
                    (string.Format
                    (Email address {0} is in wrong format, 
                    value));

            _emailAddress = value;
        }
    }


    private static bool ValidEmail(string emailAddress)
    {
        return Regex.IsMatch
            (emailAddress, @\b[A-Z0-9._%+-]+ +
                           @@[A-Z0-9.-]+\.[A-Z]{2,4}\b,
                           RegexOptions.IgnoreCase);
    }
}
Položena 26/08/2009 v 23:59
zdroj uživatelem
V jiných jazycích...                            


5 odpovědí

hlasů
2

Nemá smysl, aby mi nedošlo k ověření dat v konstruktoru. Jak jste poukázat na to, objekt může skončit v neplatném stavu. Vzhledem k tomu, tento design, ani byste si uvědomit, že jste měli špatné dat při volání kariérista.

Na cokoliv mírné složitosti nebo vyšší, mám tendenci používat zlomenou Pravidla blížit spíše než okamžitě házet výjimku. V tomto přístupu, I definovat předmět BrokenRules, který obsahuje informace o třídě a nemovitostí, které jsou neplatné, a z toho důvodu, že je neplatná. Potom, ve společné základní třídy, já definovat seznam uspořádat seznam všeho, co „špatným“ o objektu. Vlastnost (opět v základní třídě) isValid ukazuje, zda existuje v současné době žádné rozbité pravidla.

Výhodou tohoto postupu je, že by mohly být několik věcí, které se stavem objektu špatně. Pokud je uživatel vyzván k nápravě problémů (tj tento objekt je nastaven z uživatelského rozhraní), poskytuje seznam všech problémů umožňuje uživateli opravit najednou, spíše než upevnění jednu chybu prostě být řečeno, je zde ještě jeden. A ještě jeden. Atd.

Odpovězeno 27/08/2009 v 00:07
zdroj uživatelem

hlasů
2

Ano, pokud váš celkový přístup je:

Ujistěte se, že se můžete dostat pouze instanci validobjektu

pak se mi to.

Konstruktéři by měly být použity k vytvoření objektů, které jsou okamžitě platné, nevytvářet jen ‚kontejner‘ pro věci, které mají být vložil.

Odpovězeno 27/08/2009 v 00:03
zdroj uživatelem

hlasů
2

No, na jednu, budete pravděpodobně získat obávaný NullReferenceException, protože nejste kontrolovat, zda emailAddress je null na jakékoliv úrovni. Že zvláštní kontrola by měla být provedena v samotném konstruktoru, a pokud emailAddress null, hodit ArgumentNullException. Pokud jde o zbytek, nevidím žádné zvláštní problémy s tím, jak je psáno ve svém vzorku. Nicméně, tam jsou některé problémy, které mohou nastat, pokud uděláte vlastnost virtuální, a které pochází děti z této třídy. Exekuční příkaz z pole inicializace, základny a odvozené třídy consturctors pak stává problémem, a vy budete muset dávat pozor.

Odpovězeno 27/08/2009 v 00:03
zdroj uživatelem

hlasů
0

validace se děje, když je nastavena e-mailová adresa. To je místo, kde ho chcete, protože e-mailová adresa by mohly být znovu nastavit později.

Pokud jste se také nazývá ověření v konstruktoru, měli byste být dělat navíc, nadbytečné ověřovací hovor (jednou při výstavbě, jiný když je e-mailová adresa je nastavena v konstruktoru).

Odpovězeno 27/08/2009 v 00:04
zdroj uživatelem

hlasů
0

Nevidím nic špatného s tímto přístupem. Můžete volat metody na to v konstruktoru, a vlastnictví tvůrci / getry jsou jen syntaktický cukr pro volání metod.

Odpovězeno 27/08/2009 v 00:03
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more