Uzun ve geç cevabım, tam bile değil, ama iyi bir açıklama NEDEN bu kalıptan, fikirlerden ve hatta bazı duygulardan nefret ediyorum:
1) kısa versiyon: Active Record , veritabanı ile uygulama kodu arasında " güçlü bir bağlantı " içeren " ince bir katman " oluşturur . Bu mantıksal, hiçbir sorun, hiçbir sorun çözmez. IMHO , programcı için bazı sözdizimsel şeker haricinde HERHANGİ BİR DEĞER sağlamaz (daha sonra ilişkisel bir veritabanında bulunan bazı verilere erişmek için bir "nesne sözdizimi" kullanabilir). Programcılar için biraz rahatlık yaratma çabası (IMHO ...), düşük seviyeli veritabanı erişim araçlarına, örneğin basit, kolay, sade ve benzer yöntemlerin bazı varyasyonlarına (tabii ki, kavramlar ve zarafet ) daha iyi yatırılmalıdır. kullanılan dil).hash_map get_record( string id_value, string table_name, string id_column_name="id" )
2) uzun versiyon: Nesnelerin "kavramsal kontrolüne" sahip olduğum herhangi bir veritabanı odaklı projede AR'den kaçındım ve iyiydi. Genelde katmanlı bir mimari oluşturuyorum (er ya da geç yazılımınızı katmanlara ayırırsınız, en azından orta ve büyük ölçekli projelerde):
A1) veritabanının kendisi, tablolar, ilişkiler, hatta DBMS izin veriyorsa bazı mantık (MySQL de artık büyümüştür)
A2) çoğu zaman, bir veri deposundan daha fazlası vardır: dosya sistemi (veritabanındaki bloblar her zaman iyi bir karar değildir ...), eski sistemler (bunlara "nasıl" erişileceğini hayal edin, birçok çeşit mümkündür .. ama bu konu değil ...)
B) veri tabanı erişim katmanı (bu seviyede, araç yöntemleri, veri tabanındaki verilere kolayca erişme yardımcıları çok açıktır, ancak AR burada bazı sözdizimsel şeker dışında herhangi bir değer sağlamaz)
C) uygulama nesneleri katmanı: "uygulama nesneleri" bazen veritabanındaki bir tablonun basit satırlarıdır, ancak çoğu zaman bunlar zaten bileşik nesnelerdir ve daha yüksek bir mantık eklenmiştir, bu nedenle bu düzeyde AR nesnelerine zaman yatırmak kesinlikle faydasızdır , değerli kodlayıcıların zamanının boşa harcanması, çünkü bu nesnelerin "gerçek değeri", "daha yüksek mantığı" her durumda AR nesnelerinin üzerine uygulanmalıdır - AR ile ve olmadan! Ve örneğin, neden "Günlük giriş nesneleri" soyutlamasına sahip olmak istersiniz? Uygulama mantık kodu bunları yazar, ancak bu onları güncelleme veya silme özelliğine sahip olmalı mı? kulağa aptalca geliyor ve App::Log("I am a log message")
bazı büyüklüklerin kullanımı daha kolayle=new LogEntry(); le.time=now(); le.text="I am a log message"; le.Insert();
. Ve örneğin: uygulamanızdaki günlük görünümünde bir "Günlük giriş nesnesi" kullanmak 100, 1000 veya hatta 10000 günlük satırı için çalışacaktır, ancak er ya da geç optimize etmeniz gerekecek - ve bahse girerim çoğu durumda, sadece Bu küçük ifadeyi çok sayıda kod sarma ve gizleme ile katı sabit AR fikir çerçevelerine sarmak yerine, uygulama mantığınızda (bu, AR fikrini tamamen bozan) küçük güzel SQL SELECT ifadesini kullanın. AR kodu yazmak ve / veya oluşturmakla harcadığınız zaman, günlük giriş listelerini okumak için çok daha akıllı bir arayüze yatırılabilirdi (birçok yönden, sınır gökyüzüdür). Kodlayıcılar , amaçlanan uygulamaya uyan uygulama mantığını gerçekleştirmek için yeni soyutlamalar icat etmeye cesaret etmeli ve aptalca kalıpları yeniden uygulamamalıdır., bu ilk bakışta iyi geliyor!
D) uygulama mantığı - etkileşimli nesnelerin mantığını ve uygulama mantığı nesnelerini oluşturma, silme ve listeleme (!) Mantığını uygular (HAYIR, bu görevler nadiren uygulama mantığı nesnelerinin kendisine sabitlenmelidir: masanızdaki kağıtlar ofisinizdeki diğer tüm sayfaların adları ve yerleri? nesneleri listelemek için "statik" yöntemleri unutun, bu saçma, insan düşünme biçimini [tümü değil-AR çerçevesi benzeri bir yapıya uydurmak için yaratılmış kötü bir uzlaşma -] AR düşünme)
E) kullanıcı arayüzü - pekala, aşağıdaki satırlarda yazacağım şey çok, çok, çok öznel, ancak benim deneyimime göre, AR üzerine inşa edilen projeler genellikle bir uygulamanın UI bölümünü ihmal etti - zaman, belirsiz soyutlamalar oluşturmak için boşa harcandı . Sonunda, bu tür uygulamalar kodlayıcıların çok zamanını boşa harcadı ve kodlayıcıların içeride ve dışarıda teknolojiye eğilimli uygulamaları gibi hissettirdi. Kodlayıcılar kendilerini iyi hissediyorlar (kağıt üzerindeki konsepte göre sonunda sıkı çalışma, her şey bitmiş ve doğru ...) ve müşteriler "bunun böyle olması gerektiğini öğrenmeleri gerekiyor", çünkü bu "profesyonel" .. tamam pardon, konuyu ele alıyorum ;-)
Evet, kuşkusuz, bunların hepsi öznel, ama benim deneyimim (Ruby on Rails hariç, farklı olabilir ve bu yaklaşımla sıfır pratik deneyimim var).
Ücretli projelerde, daha yüksek seviye uygulama mantığı için yapı taşı olarak bazı "aktif kayıt" nesneleri oluşturmaya başlama talebini sık sık duydum. Tecrübelerime göre, bu bariz bir şekilde sıklıklaMüşterinin (çoğu durumda bir yazılım geliştirme şirketi) iyi bir konsepte, büyük bir görüşe, ürünün nihayetinde ne olması gerektiğine dair genel bir bakışa sahip olmaması için bir tür mazeretti. Bu müşteriler katı çerçeveler içinde düşünüyorlar ("on yıl önceki projede iyi çalıştı .."), varlıkları detaylandırabilirler, varlık ilişkilerini tanımlayabilirler, veri ilişkilerini bozabilirler ve temel uygulama mantığını tanımlayabilirler, ancak sonra dururlar ve bunu size teslim edin ve ihtiyacınız olan her şeyin bu olduğunu düşünün ... genellikle tam bir uygulama mantığı, kullanıcı arayüzü, kullanılabilirlik vb. kavramlarından yoksundurlar ... büyük görüşten yoksundurlar ve ayrıntılar ve AR yöntemini takip etmenizi istiyorlar, çünkü .. peki, neden o projede yıllar önce çalıştı, insanları meşgul ve sessiz tutuyor? Bilmiyorum. Ama "ayrıntılar" erkekleri oğlanlardan ayırın, yoksa .. orijinal reklam sloganı nasıldı? ;-)
Yıllar sonra (on yıllık aktif geliştirme deneyimi), bir müşteri "aktif kayıt modelinden" bahsettiğinde, alarm zilim çalar. Onları bu temel kavram aşamasına geri getirmeyi, iki kez düşünmelerini sağlamayı, kavramsal zayıflıklarını göstermeye çalışmayı ya da farkında değillerse onlardan kaçınmayı öğrendim (sonunda, bilirsiniz, henüz bilmeyen bir müşteri) ne istediğini biliyor, belki bildiğini düşünüyor ama bilmiyor ya da konsept çalışmasını bana bedelsiz olarak dışsallaştırmaya çalışıyor, bana çok değerli saatlere, günlere, haftalara ve aylara mal oluyor, hayat çok kısa ...).
Son olarak: BU TÜM neden bu saçma "aktif kayıt kalıbı" ndan nefret ediyorum ve bunu yapıyorum ve mümkün olduğunda ondan kaçınacağım.
DÜZENLEME : Buna Modelsiz bile diyebilirim. Herhangi bir sorunu çözmez (kalıplar sözdizimsel şeker yaratma amacı taşımaz). Bu pek çok sorun yaratır: tüm sorunların kökü (burada birçok cevapları belirtilen ..), yani sadece gizler son derece sınırlı desenler tanım olarak bir arayüz arkasında iyi iyi gelişmiş eski ve güçlü SQL.
Bu kalıp esnekliği sözdizimsel şekerle değiştirir!
Bir düşünün, AR sizin için hangi sorunu çözüyor?