Interesuje mnie, czy wzór ActiveRecord, rozsławiony przez Ruby on Rails, zachęca lub zniechęca do korzystania z zasad projektowania SOLID .
Na przykład wydaje mi się, że obiekty ActiveRecord zawierają zarówno logikę domeny, jak i logikę trwałości, co stanowi naruszenie zasady pojedynczej odpowiedzialności.
object-oriented
ruby-on-rails
nicholaides
źródło
źródło
Odpowiedzi:
Istnieje pewna ważna krytyka na ActiveRecord. Jak zawsze wujek Bob podsumowuje to idealnie :
Wikipedia podsumowuje krytykę w kwestii testowalności :
Specjalnie dla implementacji Ruby on Rails Gavin King pisze (moje wyróżnienie):
Również o implementacji Ruby on Rails John Januszczak pisze (moje wyróżnienie ):
Kilka dodatkowych informacji na temat tego, dlaczego ActiveRecord i ORM są ogólnie uważane za anty-wzorzec:
ActiveRecord zawsze wydawał się niezwykle użytecznym anty-wzorcem , ale zgadzam się, że jest to sprzeczne z SRP, a ponadto, że jest sprzeczne z zasadą inwersji zależności.
źródło
(Zakładam, że klasa ActiveRecord jest implementowana bez żadnej możliwości wstrzyknięcia zależności).
Z własnego doświadczenia mogę powiedzieć, że wzorzec ActiveRecord staje się główną przeszkodą w pisaniu testów jednostkowych. Sprzężenie warstwy trwałości i logiki biznesowej w pojedynczej „klasie ActiveRecord” uniemożliwia napisanie testów jednostkowych (chyba że najpierw dokonamy refaktoryzacji). Dlatego jedyną opcją jest pisanie testów integracyjnych; i to nie jest tak skuteczne jak testy jednostkowe. Staje się to poważnym problemem, szczególnie jeśli przejmiesz projekt z dużą ilością klas ActiveRecord; poddaje się bardzo skomplikowanym testom integracji, które są trudne do utrzymania.
Tak więc ActiveRecord jest bardzo podobny do SRP i powoduje pewne bóle głowy związane z konserwacją; zdaje się odbierać moc pisaniu testów jednostkowych.
źródło