Sammensetningen er mye bedre enn inheritance

Denne artikkelen forklarer fallgrubene arv, og tilbyr en løsning ...
I denne artikkelen vil jeg bruke noen fiktive klasse navn etc på grunn av sensitiviteten av prosjektet jeg jobber på, så bære over med meg hvis noen av opplysningene virker litt rart.
Etter å ha jobbet meg selv om 6 nivåer dypt i arv jeg plutselig innså at min Factory klasse hadde en DateOfBirth. Dette var absolutt uønsket, men med min nåværende modell jeg ikke kunne gjøre noe med det. Mitt valg var å kvitte seg med arven etter Factory og miste alle fordelene ved å gjøre det (har " Tilleggsopplysninger " defineres av brukeren for eksempel), eller å ignorere DateOfBirth og ikke vise det i GUI
. Begge disse alternativene var søppel. I stedet for å ta noen av dem, gikk jeg for en helt annen alternativ i stedet. Jeg bestemte meg for å fjerne nesten all arv innenfor min modell, og legge sammensatte relasjoner i stedet.
Nå, i stedet for min Factory klasse synkende indirekte fra en ObjectWithAdditionalInformation det har ingen stamfar klasse i det hele tatt. For å oppnå den samme funksjonaliteten jeg har nå en enveis forhold fra fabrikk til nå omdøpt AdditionalInformationHolder klasse. Denne klassen holder tilleggsinformasjon brukeren ønsker å gå inn, og Factory skaper en forekomst av den når den først er skapt.
Jeg da opprettet en ramme /UserControl som ville holde GUI for å legge inn tilleggsinformasjon, inkludert sin egen ExpressionHandle .
Det fine med denne tilnærmingen er at jeg kan nå har alle
type objekt innenfor min modell kan ha tilleggsinformasjon spilt mot det hvis jeg ønsker det. Å gjennomføre GUI jeg bare slippe Frame /UserControl på skjemaet for det aktuelle objektet og sette root sammenheng med ExpressionHandle.
Plutselig har jeg en modell med knapt noen arv i det hele tatt. Jeg kan gjøre endringer til klasser uten å måtte sjekke at det vil ikke bryte noen av de etterkommer klasser (eller deres former), og jeg har ikke mistet noe funksjonalitet i det hele tatt.
Jeg anbefaler på det sterkeste at du bruker arv bare for polymorfi fordeler aldri bare for moro skyld arve eiendommer. Bruk kun det når det er en elegant løsning på et problem (slik som den er beskrevet i artikkelen min Komposisjon og rekursiv OCL) snarere enn som en måte å unngå å måtte skrive inn samme attributtene /oppførsel på en ny klasse. Husk, bare fordi en bygning og en person både har et navn, en dato for unnfangelsen, og en plassering, gjør dem ikke det samme! Anmeldelser