Data verifikasjoner i Getter / Setter eller andre steder?

stemmer
9

Jeg lurer på om det er en god idé å gjøre verifikasjoner i kundeskaffere og settere , eller andre steder i koden.

Dette kan overraske deg være når det kommer til optimalisering og påskynde opp koden, jeg tror du bør ikke gjøre verifikasjoner i kundeskaffere og settere, men i koden der du oppdatere dine filer eller database. Er jeg galt?

Publisert på 05/08/2008 klokken 19:51
kilden bruker
På andre språk...                            


8 svar

stemmer
13

Vel, er en av de reaons hvorfor klassene vanligvis inneholder private medlemmer med offentlige getters / settere nettopp fordi de kan kontrollere data.

Hvis du har et nummer enn det som kan være mellom 1 og 100, ville jeg definitivt sette noe i fuglehunden som validerer det og deretter kanskje kaste et unntak som blir fanget av koden. Grunnen er enkel: Hvis du ikke gjør det i setter, må du huske på at 1-100 begrensning hver gang du setter den, noe som fører til duplisert kode eller når du glemmer det, det fører til en ugyldig tilstand.

Som for ytelse, er jeg med Knuth her:

"Vi bør glemme små effektivitet, sier ca 97% av tiden. Prematur optimalisering er roten til alt ondt"

Svarte 05/08/2008 kl. 19:59
kilden bruker

stemmer
4

@Terrapin, re:

Hvis alt du har er en haug med [enkel offentlig sett / få] egenskaper ... de kan like godt være felt

Eiendommene har andre fordeler over jorder. De er en mer eksplisitt kontrakt, de er serialisert, kan de bli feilsøkt senere, de er et fint sted for forlengelse gjennom arv. Den clunkier Syntaksen er en tilfeldig kompleksitet - Net 3.5 for eksempel overvinner dette.

En vanlig (og feilaktig) praksis er å starte med offentlige områder, og gjøre dem om til eiendommer senere, på en 'etter behov' basis. Dette bryter kontrakten med alle som bruker din klasse, så det er best å starte med egenskaper.

Svarte 08/08/2008 kl. 00:07
kilden bruker

stemmer
3

Det kommer an på.

Vanligvis koden skal svikte raskt. Hvis verdien kan settes av flere punkter i koden, og du validere bare på etter henting av verdien, vises feilen til å være i koden som gjør oppdateringen. Hvis settere validere input, vet du hva koden er å prøve å sette ugyldige verdier.

Svarte 05/08/2008 kl. 19:59
kilden bruker

stemmer
3

Fra perspektivet til å ha de mest vedlikeholds kode, tror jeg du bør gjøre så mye validering som du kan i det setter av en eiendom. På denne måten vil du ikke bli caching eller på annen måte arbeider med ugyldige data.

Tross alt, dette er hva egenskaper er ment for. Hvis alt du har er en haug med egenskaper som ...

public string Name
{
    get
    {
        return _name;
    }
    set
    {
        _name = value;
    }
}

... de kan like godt være felt

Svarte 05/08/2008 kl. 19:59
kilden bruker

stemmer
1

Jeg prøver å aldri la mine objekter inn en ugyldig tilstand, så settere definitivt ville ha validering samt noen metoder som endrer tilstand. På denne måten har jeg aldri å bekymre deg for at objektet jeg arbeider med er ugyldig. Hvis du holde dine metoder som validerings grenser, så du aldri trenger å bekymre deg for validering rammer og IsValid () metodekall drysset over alt.

Svarte 23/09/2008 kl. 19:44
kilden bruker

stemmer
1

Jeg liker å implementere IDataErrorInfo og sette mitt validering logikk i sin feil og dette [Kolonne] egenskaper. På den måten hvis du ønsker å sjekke programmatisk om det er en feil kan du bare teste noen av disse egenskapene i kode, eller du kan hånden valideringen av til databinding i Web Forms, Windows Forms eller WPF.

WPF er "ValidatesOnDataError" Binde egenskapen gjør dette spesielt lett.

Svarte 07/08/2008 kl. 22:24
kilden bruker

stemmer
1

Du kanskje vil sjekke ut Domain Driven Design , av Eric Evans. DDD har denne oppfatningen av en spesifikasjon:

... eksplisitt predikat-lignende VERDI OBJEKTER for spesialiserte formål. En spesifikasjon er et predikat som avgjør om et objekt har eller ikke tilfredsstiller visse kriterier.

Jeg tror sviktende fort er en ting, den andre er der for å holde logikken for validering. Domenet er det rette stedet å holde logikken, og jeg tror en Objekt eller validere metoden på Domene gjenstander ville være et godt sted.

Svarte 05/08/2008 kl. 20:03
kilden bruker

stemmer
1

Validering skal fanges separat fra getter eller settere i en validerings metode. På den måten hvis valideringen må gjenbrukes på tvers av flere komponenter, er det tilgjengelig.

Når den setter heter, bør en slik valideringstjeneste anvendes for å desinfisere inndata inn i objektet. På den måten vet du all informasjon som er lagret i et objekt er gyldig til alle tider.

Du trenger ikke noen form for validering for getter, fordi informasjon om objektet er allerede klarert for å være gyldig.

Ikke lagre validering til en database oppdatering !! Det er bedre å mislykkes raskt .

Svarte 05/08/2008 kl. 19:55
kilden bruker

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