Имам известни затруднения и пратих следното писмо до Митьо и Кънев:
Имам проблем с проекта. В момента си пиша core функционалността и се замислям как после върху нея ще надградя със Sinatra и БД. В момента класовете ми имат доста полета, които принципно биха били полета на таблица. Четох малко за DataMapper и ActiveRecord и съвсем се обърках. Примерно имам един клас User с инстанционни променливи username, email, pass, realname да речем и това ми е в ядрото. Ако искам БД, то тоя клас не става ли ненужен, ако ползвам DataMapper(или ActiveRecord) например? Нещо не съм наясно. Не знам как да си обвия класовете, така че да ги ползвам с бази данни.
Ето и отговора, който получих от Митьо:
Във връзка с темата на въпроса ти, виж последния параграф в секцията "Архитектура" от документа с указания за проектите: https://gist.github.com/mitio/4135365#------ Там, освен указания, има и връзка към една блог публикация с примерен код.
Моето обобщение е следното — да, до голяма степен класът, наследяващ/include-ващ ORM, било то DataMapper или ActiveRecord, ще се повтаря с класа от ядрото ти, особено ако основното нещо, което имаш във въпросния клас-ядро, са полета. В много случаи на практика хората не правят отделни класове за persistance и за моделиране на обектите от тяхната проблемна област. Понякога това е приемлив компромис, защото носи бързина на имплементация и простота на кода. Проблемът идва тогава, когато нещата започнат неизбежно да се усложняват като изисквания, когато по-голяма част от въпросната проблемна област се пренесе и моделира в код. Тогава кашата в тези "нераздробени" класове, грижещи се за persistance и за 1000 други неща, започва да става все по-трудна за управление, да не говорим за разделение. Просто когато човек разсъждава от предпоставката, че имаш таблица orders, която ти пази данните за поръчките и съответно клас Order, който е част от ORM-а и някак ти моделира тези данни, то извода, до който обикновено се стига е, че всичко за поръчки трябва да влиза в този клас. Това е порочен начин на мислене и е пътят към споменатата по-горе каша.
Тук идва и моментът, в който се опитваме да ви сръчкаме да напипате границата между persistance и моделиране на обекти от проблемната област. Ако успеете да се "откачите" от оковите на ORM-а, ще ви бъде по-лесно да раздробите и моделирате правилно въпросната проблемна област. Ако се поддадете на изкушението да слеете ORM-кода с вашия domain-модел, то ще ви бъде много трудно да се измъкнете от това блато впоследствие.
ПП: И една забележка, която получих: при проблеми, първо във форумите.