Moja długa i spóźniona odpowiedź, nawet niepełna, ale dobre wyjaśnienie DLACZEGO nienawidzę tego schematu, opinii, a nawet niektórych emocji:
1) wersja skrócona: moduł Active Record tworzy „ cienką warstwę ” „ silnego powiązania ” między bazą danych a kodem aplikacji. Co nie rozwiązuje żadnych problemów logicznych, żadnych problemów, żadnych problemów. IMHO, nie dostarcza ŻADNEJ WARTOŚCI, z wyjątkiem pewnej składniowej cukru dla programisty (który może następnie użyć „składni obiektowej”, aby uzyskać dostęp do niektórych danych, które istnieją w relacyjnej bazie danych). Wysiłek mający na celu zapewnienie programistom komfortu powinien (IMHO ...) lepiej zainwestować w niskopoziomowe narzędzia dostępu do baz danych, np. Niektóre odmiany prostego, łatwego, prostegohash_map get_record( string id_value, string table_name, string id_column_name="id" )
i podobnych metod (oczywiście koncepcje i elegancja znacznie się różnią w zależności od używany język).
2) wersja długa: W każdym projekcie opartym na bazach danych, w którym miałem „koncepcyjną kontrolę” nad rzeczami, unikałem AR i było dobrze. Zwykle buduję architekturę warstwową (prędzej czy później dzielisz oprogramowanie na warstwy, przynajmniej w projektach o średniej i dużej wielkości):
A1) sama baza danych, tabele, relacje, nawet jakaś logika, jeśli pozwala na to DBMS (MySQL również jest teraz dorosły)
A2) Bardzo często jest coś więcej niż tylko magazyn danych: system plików (bloby w bazie danych nie zawsze są dobrą decyzją ...), starsze systemy (wyobraź sobie "jak" będą one dostępne, możliwe jest wiele odmian ... ale to nie o to chodzi ...)
B) warstwa dostępu do bazy danych (na tym poziomie metody narzędziowe, pomoce w łatwym dostępie do danych w bazie danych są bardzo mile widziane, ale AR nie zapewnia tutaj żadnej wartości, z wyjątkiem cukru syntaktycznego)
C) Warstwa obiektów aplikacji: „obiekty aplikacji” czasami są prostymi wierszami tabeli w bazie danych, ale w większości przypadków są złożone obiekty i mają dołączoną wyższą logikę, więc inwestowanie czasu w obiekty AR na tym poziomie jest po prostu bezużyteczne , strata cennego czasu programistów, ponieważ „rzeczywista wartość”, „wyższa logika” tych obiektów i tak musi być zaimplementowana na obiektach AR - z i bez AR! I na przykład, dlaczego chcesz mieć abstrakcję „obiektów wpisów dziennika”? Zapisuje je kod logiki aplikacji, ale czy powinien mieć możliwość ich aktualizacji lub usunięcia? brzmi głupio, a App::Log("I am a log message")
niektóre wielkości są łatwiejsze w użyciu niżle=new LogEntry(); le.time=now(); le.text="I am a log message"; le.Insert();
. Na przykład: użycie „obiektu wpisu dziennika” w widoku dziennika w aplikacji będzie działać dla 100, 1000 lub nawet 10000 wierszy dziennika, ale prędzej czy później będziesz musiał zoptymalizować - i założę się, że w większości przypadków po prostu użyj tej małej, pięknej instrukcji SQL SELECT w logice aplikacji (co całkowicie łamie ideę AR ...), zamiast zawijać tę małą instrukcję w sztywne, ustalone ramki pomysłów AR z dużą ilością zawijania kodu i ukrywania go. Czas spędzony na pisaniu i / lub budowaniu kodu AR mógł zostać zainwestowany w znacznie sprytniejszy interfejs do czytania list wpisów do dziennika (na wiele, wiele sposobów, nieograniczone są możliwości). Programiści powinni odważyć się wymyślić nowe abstrakcje, aby zrealizować swoją logikę aplikacji, która pasuje do zamierzonej aplikacji, a nie głupio ponownie wdrażać głupie wzorce, brzmi dobrze na pierwszy rzut oka!
D) logika aplikacji - implementuje logikę interakcji obiektów oraz tworzenia, usuwania i wyświetlania (!) Obiektów logiki aplikacji (NIE, zadania te rzadko powinny być zakotwiczone w samych obiektach logiki aplikacji: czy mówi kartka papieru na biurku) masz nazwy i lokalizacje wszystkich innych arkuszy w twoim biurze? zapomnij o "statycznych" metodach wyliczania obiektów, to głupie, zły kompromis stworzony po to, by ludzki sposób myślenia pasował do [nie-całkowicie-AR-podobnych -] Myślenie AR)
E) interfejs użytkownika - cóż, to, co napiszę w kolejnych wierszach, jest bardzo, bardzo, bardzo subiektywne, ale z mojego doświadczenia wynika, że projekty oparte na AR często zaniedbywały część UI aplikacji - czas został zmarnowany na tworzenie niejasnych abstrakcji . W końcu takie aplikacje zmarnowały wiele czasu programistów i sprawiają wrażenie aplikacji tworzonych przez programistów dla programistów, zorientowanych technicznie wewnątrz i na zewnątrz. Koderzy czują się dobrze (ciężka praca w końcu wykonana, wszystko skończone i poprawne, zgodnie z koncepcją na papierze…), a klienci „muszą się tylko nauczyć, że tak musi być”, bo to „profesjonalnie” .. ok przepraszam, błądzę ;-)
Cóż, co prawda, to wszystko jest subiektywne, ale jest to moje doświadczenie (z wyłączeniem Ruby on Rails, może być inaczej i nie mam żadnego praktycznego doświadczenia z tym podejściem).
W płatnych projektach często słyszałem żądanie, aby rozpocząć od tworzenia obiektów „aktywnego rekordu” jako elementu składowego dla logiki aplikacji wyższego poziomu. Z mojego doświadczenia wynika, że częstobył swego rodzaju wymówką dla tego, że klient (w większości przypadków firma zajmująca się tworzeniem oprogramowania) nie miał dobrej koncepcji, szerokiego spojrzenia, przeglądu tego, jaki powinien być ostatecznie produkt. Ci klienci myślą w sztywnych ramach („w projekcie dziesięć lat temu to działało dobrze…”), mogą kształtować byty, mogą definiować relacje encji, mogą rozbijać relacje danych i definiować podstawową logikę aplikacji, ale potem przestają i przekaż ją tobie i pomyśl, że to wszystko, czego potrzebujesz ... często brakuje im pełnej koncepcji logiki aplikacji, interfejsu użytkownika, użyteczności itd., i tak dalej ... brakuje im dużego widoku i brakuje im miłości do szczegóły, i chcą, żebyś podążał tą drogą w rzeczywistości rozszerzonej, ponieważ ... no cóż, to działało w tym projekcie lata temu, dzięki czemu ludzie są zajęci i milczą? Nie wiem Ale „szczegóły” oddzielać mężczyzn od chłopców, czyli ... jak wyglądało oryginalne hasło reklamowe? ;-)
Po wielu latach (dziesięć lat aktywnego doświadczenia w programowaniu), gdy klient wspomina o „wzorcu aktywnego nagrywania”, dzwoni dzwonek alarmowy. Nauczyłem się próbować doprowadzić ich z powrotem do tej niezbędnej fazy koncepcyjnej , pozwolić im pomyśleć dwa razy, spróbować pokazać ich koncepcyjne słabości lub po prostu ich unikać, jeśli nie są rozeznani (w końcu wiesz, klient, który jeszcze nie wie, czego chce, może nawet myśli, że wie, ale nie, lub próbuje za darmo przekazać mi pracę koncepcyjną, kosztuje mnie wiele cennych godzin, dni, tygodni i miesięcy mojego czasu, życie jest zbyt krótkie ...).
W końcu: TO WSZYSTKO jest powodem, dla którego nienawidzę tego głupiego „wzorca aktywnego nagrywania” i robię to i będę tego unikać, kiedy tylko będzie to możliwe.
EDYCJA : nazwałbym to nawet bez wzoru. Nie rozwiązuje żadnego problemu (wzorce nie mają tworzyć cukru syntaktycznego). Stwarza wiele problemów: źródłem wszystkich problemów (wymienionych w wielu odpowiedziach tutaj ..) jest to, że po prostu ukrywa stary dobry, dobrze rozwinięty i potężny SQL za interfejsem, który jest z definicji bardzo ograniczony.
Ten wzór zastępuje elastyczność cukrem syntaktycznym!
Pomyśl o tym, jaki problem rozwiązuje dla Ciebie AR?