- Gebrek aan snelheid: behalve bij EF en NH die echt heel traag zijn, is de snelheid veelal niet het probleem. Ik geef je op een briefje dat de code van de gemiddelde programmeur die direct ADO gebruikt er niet eens bij in de buurt komt. Veel ORMs worden geschreven en onderhouden door mensen die dit al jaren doen en alle truuks en pitfalls wel kennen. De gemiddelde developer kent deze echt niet.
- Ellende wanneer de database verandert: Begrijp ik niet zo: je gebruikt toch ook een IDE en niet Notepad om je software te maken? Waarom gebruik je dan wel spartaanse tooling (lees: geen) wanneer die er gewoon is? Een veld toevoegen, een veld veranderen, tabel renamen etc. een goede designer pikt dat gewoon op. Kost mij nog geen 30 seconden en dan heb ik een up-to-date codebase. Los daarvan: een veld wijzigen/toevoegen in een database die gebruikt wordt met een micro 'ORM' (of handgeschreven troep) met hard-coded SQL: dat is pas ellende, want je krijgt de errors at runtime. Veel plezier met testen!

- ontbrekende features: veel ORMs zijn al jaren beschikbaar en erg volwassen (EF Core daargelaten

): ze doen alle basistaken al jaren. Alle edge cases zijn er wel uit. Handgeschreven data-access code heeft echt die features niet, want dat kost jou jaren om te bouwen, en los daarvan: je moet dat ook
onderhouden.
- Geen of beperkte support in 3rd party libraries: geen idee wat je daarmee bedoelt...
- Stijle learning curve. Alles met functionaliteit heeft een learning curve, zoook een ORM. Maar als je denkt dat handgeschreven ADO code geen learning curve heeft dan heb je het mis. Sterker nog: het is 10 tegen 1 niet gedocumenteerd, de echte kennis zit bij 1 a 2 mensen en een vaak gehoord antwoord zal zijn "oh ja dat, ja dat moet ik nog eens fixen, je kunt het beter zo oplossen". Je kunt ook de manual van de ORM er op na slaan, examples bekijken etc. oh en vragen stellen aan hun support.
Het is tegenwoordig echt een domme actie om zelf data-access code te schrijven: wil je geen full ORM gebruiken? Gebruik dan een van de vele micro's, handmatig deze code schrijven is zoals "ik schrijf zelf wel even de web handler, want ik kan dat sneller/beter". Handgeschreven ADO code is veelal troep. Dit heeft een simpele reden: de mensen die dat schrijven zijn geen specialist op dat gebied. Ze gebruiken geen expression trees om materializers te compileren at runtime, ze weten niet hoe ze zonder alle memory op te vreten SQL moeten genereren, om maar wat te noemen. Anderen zijn dat wel. Waarom zou je dan op de stoel van een specialist gaan zitten om specialistisch werk te doen, waar jouw klant je niet eens voor betaalt! (want, het is overhead. Jouw klant betaalt je ook niet om een grid control te bouwen, die koop je).
Tuurlijk is het 'niet moeilijk' om wat generieke code te maken die een SQL string naar de database gooit, en die de terugkomende data in objects stopt. Met wat tijd krijg je dat ook nog wel redelijk snel (lees: je gebruikt niet meer reflection of cachet iig genoeg). Dat is niet de moeilijkheid. De moeilijkheid zit hem in het feit dat in jouw applicatie allerlei dingen met de database worden gedaan, nl. die nuttig zijn op
die manier op
die plek. Dat heeft wellicht specifieke queries nodig of specifieke resultset handling (ga maar eens een object graph mergen in memory, of nog leuker: in een object graph alle entities eruit halen die gesaved moeten worden. Of ga je dat met de hand doen?

) en de ontwikkelaar van de app wil niet dat ook nog eens zelf bouwen.
Dus de handgeschreven code met wat SQL moet dat ook allemaal aankunnen. Liefst efficient en snel, en vandaag nog. 10 tegen 1 dat het er niet inzit of gammel. Immers een full ORM die wel deze features heeft kost jaren om te maken (LLBLGen Pro kostte 15 jaar, EF full ook zo'n beetje, NHibernate ook), 1000-en gebruikers met feedback, 1000-en tests voor allerlei edge cases waar jij nu niet aan denkt maar waar je wellicht wel mee te maken krijgt en als je handgeschreven 'ORM' dan faalt kost dat jouw bedrijf geld. (Los van het feit dat het zelf schrijven ook geld kost, en het onderhouden helemaal. Geld wat je je kunt besparen door iets te gebruiken wat er al is en zich al bewezen heeft).
Dus zelf knoeien is dom. Sorry.
Wat ik heb gezien bij veel developers is het ontbreken van kennis omtrent SQL en specifieke features van database engines zoals SQL server, Oracle etc. Een select en update lukt meestal nog wel maar er is ook een hoop mogelijk met views of stored procedures. Ook dat zal vast niet heilig zijn maar in veel gevallen kom je daar prima mee weg en volstaat in de code een lichtgewicht setje classes die de communicatie met de database op zich neemt. Is mijn ervaring althans.
En hoe praten die met elkaar dan? Hoe ga jij betrouwbaar dat 'setje classes' op resultsets mappen van stored procedures? Dingen in stored procedures stoppen lost niet het probleem op dat je entities de transitie van set naar object graph moeten maken, het levert alleen een nieuwe API op en een boundary waarbij je als app ontwikkelaar veelal moeilijk overheen komt (als in: 'ik moet XYZ doen in de database' en dan moet je de DBA overtuigen dat 2 stored procedures moeten worden aangepast. Dat kan veelal niet (want wie weet ookalweer in welke software die procs worden gebruikt? Niemand, dus komt er een nieuwe proc bij) of moeizaam, of kost tijd etc. Begrijp me niet verkeerd, procs zijn een tool als alle andere en wanneer je data processing moet doen is het veelal efficienter dat te doen in een procedure zodat je niet de grote sets met data die je gaat processen naar de client moet halen, maar voor simpel DML werk, no way.
[
Voor 24% gewijzigd door
EfBe op 05-03-2018 10:12
]