ORM Anti-Patern midir? [kapalı]


58

Bir meslektaşımla ORM ve artıları ve eksileri hakkında çok canlandırıcı ve iç içe geçmiş bir tartışma yaşadım. Bence bir ORM sadece nadir durumlarda yararlıdır. En azından benim deneyimimde.

Ancak şu anda kendi argümanlarımı listelemek istemiyorum. Size soruyorum, ORM hakkında ne düşünüyorsunuz? Artıları ve eksileri nelerdir?



2
Evet. Veritabanında değerli bir şey yapmayan genel bir CRUD uygulamanız yoksa, bu durumda ilişkisel bir veritabanı kullanmamanız gerekir.
Raynos

1
@derphil: Daha az genişletmek isteyebilirsiniz, yoksa bu kapanacaktır. Bunun bir anti-kalıp olduğuna inanıyorsanız, belki nedenini belirtin ve sonra bu anti-paternin hangi durumlarda uygun olduğunu sorun (ancak bu hala çok geniş olabilir).
SinirliFormsDesigner'la

2
@derphil, o blog yazısına yapılan yorumlarda çok sayıda karşı karşılaşma var, onları okudunuz mu?
Péter Török

2
Ve neden bir ORM'ye
Zapadlo 20:17

Yanıtlar:


83

İlişkisel bir veri tabanına nesne yönelimli bir açıdan yaklaşmaya çalışırken, oldukça büyük ve çeşitli bir dizi kavramsal ve teknik zorluk vardır. Bu zorluklar topluca nesne-ilişkisel empedans uyumsuzluğu olarak bilinir ve ilgili Wikipedia makalesi son derece bilgilendiricidir. Makale epeyce tanımlıyor, onları burada tanımlamanın mantıklı bir yolunu görmüyorum. Size genel bir fikir vermek için, bunlar aşağıdaki gibi kataloglanır:

  • uyuşmazlıklar
    • Nesneye yönelik kavramlar
    • Veri tipi farklılıkları
    • Yapısal ve bütünlük farklılıkları
    • Manipülatif farklılıklar
    • İşlem farkları
  • Empedans uyumsuzluğunu çözme
    • minimizasyonu
    • Alternatif mimariler
    • tazminat
  • çekişme
  • Felsefi farklılıklar

Bence makaleyi okumak için zaman ayırırsanız, ORM'nin bazen bir anti-patern olarak tanımlandığı gerçeğinin kaçınılmaz olduğunu anlayacaksınız. İki alan öylesine farklıdır ki, birini diğerine muamele etmeye yönelik herhangi bir yaklaşım, varsayılan olarak bir anti-patern olduğu gibi, bir anti-paternin bir alan felsefesine aykırı bir patern olduğu anlamına gelir.

Ancak, terimin esasen iki büyük alan arasında bir köprü görevi gören hiçbir şeye uygulanmaması gerektiğini düşünüyorum. Bir kalıbı anti-kalıp olarak etiketlemek, yalnızca kendi alanı içinde anlamlı olur. Öyleyse, bunun bir anti-kalıp olup olmadığı sorusu alakasız.

Ama yararlı mı? Evet ORM, orada en kullanışlı anti-paternlerden biridir. Neden sadece kendinizi bir projede veritabanlarını değiştirmek zorunda kalacağınız pratik bir durumda bulursanız anlayacaksınız. Hatta aynı veritabanının başka bir sürümüne bile yükseltebilirsiniz. ORM, bunlardan biridir, ancak gerçekten ihtiyaç duyduğunuzda tamamen anlarsınız.

Ders dışı, her şey faydalı olduğu için, ORM kötüye kullanma eğilimindedir. Eğer bir şekilde üzerinde çalıştığınız veritabanı hakkında her şeyi bilme ihtiyacının yerini aldığını düşünüyorsanız, o zaman geri gelip sizi ısırır. Zor.

Son olarak, bana utanmadan takmanıza izin Cevaplarımı başka bir ilgili ile ilgili, "ActiveRecord desen KATI tasarım ilkelerini teşvik / takip ediyor mu?" Bana göre bu, "bu bir anti-patern" midir? den çok daha alakalı bir sorudur.


5
"Empedans uyumsuzluğu" cümlesinde çalışmak için +1. Meraklılar için buzzwords, ama ben de onları seviyorum!
hardmath

Tamamen katılıyorum ... bu bağlantının çok iyi açıklanmış olduğunu kontrol edin: seldo.com/weblog/2011/08/11/orm_is_an_antipattern
sandino

42

Bu, "elektrikli matkap bir kalıp önleyici mi?" Diye sormaya benzer. ORM'ler araç kutumda iyi bir yer edinerek kazan plaka kodumu düşürdü ve gerekirse özel SQL kullanabiliyorum. Öyleyse, bir anti-patern ise, hangi paterne karşı çıkar?

Cevabım hayır, orada hayatınızı çok kolaylaştıran ve kodunuzu daha anlaşılır kılan birçok olgun ORM var. Bu, herhangi bir şekilde, tam tersine SQL'i anlamanıza gerek olmadığı anlamına gelir.


11
+1 Ben de çok faydalı olduğunu düşünüyorum, bir öğrenme eğrisi var. Ama el ile pojoları vb. Doldurmak zorunda kalmamak çok hoş
NimChimpsky

18

İlk olarak Martin Fowler tarafından desen olarak adlandırılan ve o zamandan beri neredeyse her modern programlama dilinde benimsenen "anti-patern" bir şeye tereddüt ediyorum. ( ActiveRecord hakkındaki Wikipedia makalesine bakın .)

İyi bir ORM bir projede çok daha az koda (ve çok daha az tekrarlama) neden olabilir ve hiçbir şey orijinal kodun miktarı kadar hatalarla güçlü bir şekilde ilişkilendirilemez.

ORM'ler genellikle veritabanlarıyla çalışmak için en yaygın kullanım durumlarını ele almak üzere tasarlanmıştır. Karmaşık sorguların hala açıkça yazılması gerekebilir. Ancak her veritabanı etkileşimi için açık sorgular yazmaktan kesinlikle rahatsızlık duyuyorum. Çoğu durumda, bu bir zaman kaybıdır.


12
"Makam tarafından argümana karşı
çıkmakta

3
@Raynos: Yani demek istiyorsun ki… Fowler olabilirdi… YANLIŞ ?!?! şok ve gasp Heresy! Küfür !! : P;)
Sinir

9
@Raynos - Belki de otorite en iyi argüman değil, ancak OP "benim tecrübeme göre" dedi. Bu esasen kişisel otoriteye bir itirazdır, bu yüzden otorite ve fikir birliğine itirazda bulunmanın makul olduğunu düşünüyorum. Ayrıca, "anti-patern" tabiri fikirlerle ilgilidir. Başkalarının ne düşündüğüne dair örnekler verdim.
Nathan Long

3
@ NathanHong Ben sadece popülerliğin ve doğruluğun ortogonal olduğuna işaret ediyordum.
Raynos

1
FWIW Veri Eşleyici muhtemelen bir ORM ile en yakından eşleşen modeldir. ActiveRecord kesinlikle ilgili olsa da, farklı bir kalıptır.
JasonTrue

11

SQL öğrenmek yerine ORM kullanmak oldukça kötü bir fikirdir. Eğer tam olarak ne tür bir SQL üretildiğini bilmiyorsanız, N + 1 problemlerini ve nasıl optimize edileceğini anlamıyorsanız, kesinlikle iyiden daha fazla zarara neden olacaktır. Bir ORM kullanarak çok daha üretken olduğumu hissediyorum. Ben sadece veritabanı yazmak istemiyorsanız, veritabanı yokmuş gibi davranmaya çalışmayan ve yolunuza çıkmayan bir Rails ActiveRecord'u tercih ediyorum. Bazı insanların ne yaptıklarını derinlemesine anlamadan, çok derin gördükleri deyimlere güvenebilmelerine rağmen endişeleniyorum.


11

Deneyim: Linib2NHibernate ile NHibernate kullanıyorum.

Artıları:

  • "Magic Strings" den kurtulur ya da en azından onları koymak için bir kez ve sadece bir kez yer sunar
  • Tüm zaman boyunca bir OO paradigmasında çalışmama izin veriyor
  • Kod okumak daha kolay
  • Üstüne inşa kod değiştirmek kolaydır
  • 2 ayrı havuz tutmadan gerçek ilişkisel veritabanınızı değiştirmenize olanak sağlar (nadiren yapılır, ancak ihtiyacınız olursa bu büyük bir avantajdır).

Eksileri:

  • Kod yazmak zor , çünkü
  • Bu yeterli bir soyutlama değildir - hala arka planda ne yaptığını yakından bilmeniz gerekir

Çoğu insanın başlangıçta ümit ettiği vaadi yerine getirmediğini söyleyeceğim. Bunun bir model olduğunu söylediği için birini suçlamam. Benim durumumda, Linq2NHibernate sorgularımın gerçekten çalıştığından emin olmak için hala bir SQLite veritabanına karşı entegrasyon testleri yapmam gerektiğini düşünüyorum. Gerçekten de, zaten gerçek bir ilişkisel veritabanına karşı entegrasyon testleri yapıyorsanız, o zaman bu tür "sihirli dizgiler" ile ilgili sorunu ortadan kaldırır.

Yeni bir projeye başlayacak olsam, ORM kullanıp kullanmayacağımdan emin değilim. Ben muhtemelen, ama emin diyemem sen gerekir. Projeniz için C ++ veya Java / .NET'i seçmek arasındaki fark gibi olduğunu söyleyebilirim: Daha düşük bir seviyede çalışarak aldığınız esnekliğe mi ihtiyacınız olacak, yoksa daha yüksek bir seviyede çalışmayı ve (sözde) daha fazla olmayı mı tercih edersiniz? üretken? Normal cevap, kaçabildiğiniz kadar yüksek bir seviyede çalışmaktır . Bu genellikle bir ORM kullanmak anlamına gelir.


6

Bir ORM'nin gücü, nesne odaklı teknikleri kullanarak uygulama davranışını modellemenize izin vermesidir. Dikkatlice tasarlanmış bir dünyada, işletme dilinin geliştirme ekibinin dilini düzgün bir şekilde karşıladığı bir uygulama katmanına sahipsiniz. ORM duyarlı bir şekilde kullanılıyorsa, ORM bunun bir etkinleştiricisidir.

Zayıflık, gerçekte, gerçekten nesneye yönelik programlama yapan gerçekte kişi sayısının oldukça az olmasıdır. Pek çok insan spagetti ve köfte yazıyor, kendileri için çok az davranışa sahip olan oldukça eşleşmiş nesneler ve gerçekte davranışları iğrenç 8000 hatlı "Servis" ve "Yönetici" sınıflarında sona eriyor ve bu kod çoğu zaman herkesin korktuğu şekilde kıvrılıyor değiştirmek, çünkü yan etkilerin ne olacağını çözemezler.

Ek olarak, birçok insan ilişkisel modeli gerçekten anlamıyor. Bir ORM onları elde etmelerine yardımcı olmayacak ve ilişkisel modeli soyutlayarak onlara yardım etmeyecektir. Yalnızca etki alanı katmanınıza erken odaklanmanızı ve veritabanı tasarımı konusunda çok endişelenmeden hemen önce bunu elde etmenizi sağlar. İyi uygulanırsa, mantıklı şema taşıma araçları yardımıyla ORM ve kod borcunun birikmesini önlemenize yardımcı olabilir.

Bir ORM'nin uygulama kodunu basit, okunabilir ve test edilebilir tuttuğu ve makul performansa sahip olduğu uygulamalar oluşturdum. Ayrıca, örgünün kötüye kullanıldığı ve kodun kıvrıldığı, test edilemez, yavaş ve kırılgan olduğu uygulamaları da sürdürdüm; ORM'nin bununla çok az ilgisi olduğu ortaya çıktı, uygulama alanını kötü modellenen kötü kod yazmak yerine, eski mühendislik ekibinin uygulama alanını zayıf modüle eden kötü kod yazdığını ve bunların tümünü ihmal eden kötü hizmet katmanı kodunu yazdığı ORM'lerinin onlara sağlayabileceği değer.

ORM'ler sizi daha akıllı yapmaz, ancak doğru geliştiricinin ellerinde, daha sürdürülebilir ve daha yüksek kaliteli kodlara yol açabilir.


Bunun DB erişimi için bir ORM ve DB erişimini daha kolay ve daha iyi hale getirmek için süslü bir kod oluşturucu olarak bir ORM kullanmasını karıştırdığını düşünüyorum.
gbjbaanb

Bununla ne demek istediğini anlamadım. Yorumunuz bana pek mantıklı gelmiyor.
JasonTrue,

Bir ORM, sizin için bir sürü zor işin yapıldığı bir DB'ye erişmek için harika bir yol yapar, ancak bir DB'nin bir nesne koleksiyonu olduğunu varsaymak için bir tasarım deseni olarak kullanırsanız, düşmeye başlar. Bu söylediğini düşündüğüm şeydi.
gbjbaanb

Veritabanının nasıl çalıştığını anlamanızı gerektirmeyen sihirli bir nesne deposu varmış gibi davranmak için ORM kullanmayı asla savunduğumu sanmıyorum. Ben tam tersini söyledim: Nesne yönelimli programlamayı iyi anlıyorsanız ve veritabanlarının nasıl çalıştığını anlarsanız, bir ORM daha sürdürülebilir bir kod üretmenize yardımcı olabilir.
JasonTrue,

5

Belki de cevabınız sorunun cevabıdır: Uygulama verilerinizi ilişkisel bir veri tabanından başka bir yerde saklamak iyi bir fikir midir? Hangi sorunları ortadan kaldırıyorsunuz ve başka hangi sorunları toplayacaksınız? Verilerinizi kolayca çapraz referanslama kabiliyetine sahip olmadan (katılabilirsiniz) ya da birden çok ölçüt temelinde istediğiniz kayıtları hızlıca filtreleyemez misiniz? Sağlam bir işlem desteğine ihtiyacınız yok mu (alternatifinizin buna sahip olmadığını varsayarak)? Tüm uygulamaların her zaman tutarlı ve eksiksiz bir veri deposuna ihtiyacı yoktur.

Sanırım buradaki gerçek anti-patern, ihtiyacınız olmadığında ilişkisel bir DB kullanıyor olabilir. Birine ihtiyacınız varsa, o zaman ORM'ye ihtiyacınız vardır ve bu kesinlikle bir anti-patern değildir.


1
İhtiyaç duymazsanız ilişkisel bir veritabanı kullanmanın kötü bir fikir olduğunu kabul ederken, bir gün kullanıyorsanız ORM'nin gülünç olduğunu!
HLGEM

1
Öyleyse, verilerinizi veri tabanına girip çıkaracaksınız? Bir yerlerde, nesnelerin ilişkisel yapıya eşlenmesi ve veritabanından okunduğunda yeniden yaratılması gerekecek. Sorguları el ile yazsanız ve verileri sonuç kümelerinin içine ve dışına kopyalasanız bile, ORM yapıyorsunuz.
TMN 17:11

1
Tüm veritabanı işlemlerini yapmak için depolanan işlemlerin (dahili kontrol nedenleriyle herhangi bir finansal veri girmenin tek kabul edilebilir yolu) kullanılması bence ORM değildir. SQL'i iyi tanıyan biri için ORM için hiçbir zaman bir değer görmedim. Ben de hiç bir ORM'ye bağımlı olan bir sistemde (ve çok karmaşık Kurumsal uygulamalarla çalışıyorum) çalışmadım, yaptığınız şey karmaşık olduğunda yeterince iyi değiller.
HLGEM

6
@HLGEM: Peki ya veritabanından aldığın veriler? İlişkisel veritabanını sorguladığınızda sonuçları nesnelerle eşleştirmiyor musunuz? Tecrübelerime göre, ilişkisel veritabanlarını kullanan iki tür proje var: üçüncü taraf ORM'leri kullananlar ve kendi zayıf inşa edilmiş ORM'lerini içerenler.
Carson63000,

2
+1 Carson. Ham DataSet'leri iade etmemeniz ve bunları kodunuzun üzerine koymadığınız sürece (tüm IMHO'ların en korkunç suçu olanı) ne olursa olsun, bir tür ORM kullanırsınız; ORM'ler sizin için yapar.
Wayne Molina

4

ORM bir araçtır. Tüm araçlar gibi, uygun bir şekilde kullanıldığında oldukça iyi çalışırlar. Uygun olmayan bir şekilde kullanıldığında daha büyük bir çekiç ve bir miktar koli bandı gerekir.

Üzerinde çalışmakta olduğum mevcut proje durumunda, geliştirici olmayanlar (makine mühendisleri, hassas olmaları) tarafından korunacaklar ve bu yüzden basit ve anlaşılması kolay olması gerekiyor. Bu grubun geliştiricileri işe almak için bir bütçeye sahip olması birkaç yıl alacaktır (bir sonraki Cumhurbaşkanı katılan ajansı kaldırmazsayalım), bu nedenle gelecekteki bakım yetenekleri bizim için önemli bir faktördür.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.