wasigh schreef op donderdag 31 juli 2008 @ 12:42:
[...]
Op dit moment ben ik bezig met een C# desktopapplicatie en een eigen O/R mapper gebaseerd op het model wat ik afgekeken heb van CakePHP. Mijn overweging is juist om attributes op te nemen in de code. In mijn ogen is metadata nutteloos zonder een direct verband met de data waar het om gaat. Daarbij word ik helemaal gestoord dat wanneer ik code op 1 plek wijzig ik dan rekening moet houden met andere plekken waar ik ook code moet werken. Dat is voor mij niet onderhoudbaar..
Dat is het gevolg van het feit dat je niet met een abstracte entity definitie werkt waarje de class en table vanaf leidt (aangezien ze beide projecties zijn van die abstracte entity definitie) maar dat je met de projecties zit te werken en daar wijzigingen in aanbrengt. Dus je wijzigt class A, die is de projectie van entity A' op C#, en dus moet je die eerst reverse engineeren naar A', dan de projectie van die wijzigingen maken op een relationeel model zodat je over hetzelfde praat.
Daarom ben ik heel benieuwd waarom attributes afgeschreven zijn door de O/R mappings wereld. Ik krijg de indruk dat dat komt omdat er in de metadata ook configuratie settings worden opgenomen (database namen etc). En configuratie settings wil je natuurlijk kunnen wijzigen. Maar op het moment dat een relatie tussen 2 entiteiten verandert dan zul je toch zowel je code als je mapping aan moeten passen? Maar ik ben niet al teveel bekend in die wereld. Misschien kun jij daar je licht over laten schijnen?
De meeste attribute based mappings hebben target DB specifieke informatie in zich, zoals field length, identity sequences, target types, etc. Dit is funest voor het hergebruiken van domain classes op andere databases. Men kan wel denken dat attribute based mappings alleen field names bevatten maar dat is onzin, daarmee kom je er niet. Je hebt hoe dan ook DB specifieke meta-data nodig en als je dat niet in mappings kwijt kunt, moet dat worden opgehaald at runtime.
En dan heb ik het nog niet eens over het gebrek aan type ABC op database X terwijl deze beschikbaar is op database Y (bit/bool bv). Je hebt dan conversie mappings nodig voor bv Oracle, maar niet voor SqlServer. Je domaincode blijft hetzelfde. DAT zijn problemen waar je tegenaanloopt bij multi-db, en ik erger me echt mateloos aan het gebagataliseer van sommigen hier die vinden dat dat geen vaart loopt, omdat in de projectjes die zij doen het nooit voorkomt.
Ook dat tabelnamen wel even hetzelfde zullen zijn is iets wat lekker weglult op een forum zoals dit maar in de praktijk kom je daar niet mee weg, wanneer de Oracle bak in de hoek jouw namen niet vreet omdat ze te lang zijn, of omdat de DB2 database is gebouwd met een versie die nog maar 8 characters toestond. Ga je dan roepen "dat is niet mijn probleem" ? Nee, je lost het op, en wel op de manier die het beste daartoe leent: in de mapping meta-data die TUSSEN class en table staat, niet IN de table en niet IN de class.
Wanneer je zelf je domain classes schrijft, is attribute based mapping de grootste miskleun die je kunt begaan, want vroeg of laat loop je tegen de nadelen aan van deze vorm van mappings.
Nou, nu hebben wij te maken met duizenden klanten met veelal erg grote databases en ditto projecten. Nu stellen die klanten soms ons de vraag hoe multi-db op te lossen en al een aantal jaren geleden hebben we daar features voor toegevoegd zodat het makkelijk kan, zodat je .NET types die je wilt gebruiken via sqlserver ook op oracle bv kunt gebruiken zonder problemen. Het punt is een beetje dat wat jij beweert dat het nauwelijks voorkomt of niet echt nuttig is echt lulkoek is. Als je denkt dat je iets van deze materie afweet, denk dan even wat harder na voordat je wat roept in deze context. Bv, migratie van db A naar db B? Pakket wordt ontwikkelt voor Sqlserver, grote klant will licenses kopen maar heeft Oracle, kan dat ook? etc. Ga jij dan al de code door of pas je een mapping file aan?
Het gaat erom dat je meestal toch wel van te voren weet of je een domein model in verschillende datastores hebt. De uitzondering argumenten zijn dus niet ze gek veel waard. Zeker niet omdat je altijd nog je metadata met een tool uit je domein model kunt halen. Het is dus niet zo dat je je vast pint.
Je weet helemaal niet veelal van te voren of een applicatie alleen maar 1 db gaat gebruiken. En uitzonderingen zijn het al helemaal niet.
En welke tool gaat de attributes wijzigen dan voor je?
[...]
Wees dan veel duidelijker wat je punt is, want de enige die je maakt heb ik op gereageerd. Je punt is onderhoudbaarheid. Een van de facetten van onderhoudbare code is begrijpelijke code. Mapping bestandje hier, stukje code daar is voor nieuwe/andere mensen niet makkelijk om in te stappen. Vrij duidelijk als het bij de code staat.
blabla, wat je even vergeet is dat db specieke data ook in die mapping attributes staat, je kunt ze echt niet db generiek maken.
[
Voor 23% gewijzigd door
EfBe op 31-07-2008 14:30
]