Scala gibi işlevsel bir dilde neden bir ORM'ye ihtiyacım olmasın?


30

Desen eşleştirme, Seçenek gibi bazı Scala özelliklerinden ve genel olarak bana daha temiz bir sözdizimi gibi görünmesi için Spring + Hibernate projesinde Java'dan Scala'ya geçip geçemeyeceğimi merak ediyorum. Varsayılan olarak Scala ekosisteminde ORM'yi arıyorum ve Etkinleştir gibi düşündüklerini buldum (ancak çoğunlukla Hazırda Beklet seçeneğinin Scala ile kullanılıp kullanılamayacağını bulmaya çalışıyorum). Bunu ararken Bunu JPA + Scala ile ilgili Play belgelerinde okudum .

Ancak en önemli nokta şudur: işlevsel bir dilin gücüne sahip olduğunuzda Gerçekten Nesneler eşleştiricisine bir İlişkiye ihtiyacınız var mı? Muhtemelen değil. JPA, Java'nın veri dönüştürmedeki güç eksikliğini soyutlamanın uygun bir yoludur, ancak Scala'dan kullanmaya başladığınızda gerçekten de yanlış hissediyor.

Eksiksiz bir uygulama oluşturmak için işlevsel programlamanın nasıl kullanılacağına dair derin bir anlayışa sahip değilim (bu yüzden Scala'yı kullanmak niyetindeyim, böylece bunu aşamalı olarak anlayabiliyorum, çünkü OO + İşlevselini birleştirir), bu yüzden çözemiyorum. neden işlevsel bir dile sahip bir ORM'ye ihtiyacım olmadı ve etki alanı modelinin kalıcılığı ile mücadelede fonksiyonel yaklaşım ne olurdu?

İş mantığı için bir DDD yaklaşımı hala Scala ile mantıklı geliyor, değil mi?


3
Bu görüşe dayalı bir sorudur. Scala tamamen işlevsel değildir, aynı zamanda bir OO dilidir, bu yüzden neden hala bir ORM aracı kullanmak istediğinizi açıklar. DB eşlemesi için, örneğin bakınız: Slick , SORM , Anorm .
Jesper

Bir fikir aramıyorum, işlevsel paradigmayı derinlemesine anlayabilen bir şey istemiyorum. Scala'nın melez olduğunu biliyorum ve OO bölümünü DDD için kullanmak istiyorum. Yani, Scala ile bile bir DDD yaklaşımı alırsam, ORM'nin yol olduğunu mu söylüyorsunuz?
gabrielgiussi

İşlevsel dillerde, çoğunlukla nesnelerin kimliğine sahip olmayan değerlerle uğraşırsınız. Bu nedenle, bir ORM'nin ana işlerinden biri olan değişiklik izlemeye ihtiyacınız yoktur.
Lee


5
Herhangi bir ana dilde bir ORM'ye ihtiyacınız yoktur .
GrandmasterB

Yanıtlar:


30

Eh, böyle bir tartışmamız olduğunda yapılması gereken önemli bir şey, nesne ilişkisel eşleştiricileri ("ORM") ve veritabanı soyutlama katmanlarını açıkça ayırt etmektir . Bir ORM bir tür veritabanı soyutlama katmanıdır, ancak tüm veritabanı soyutlama katmanları ORM değildir. Bunu kavramak için çalışılacak iyi bir araç, Python'un kendisini " farklı şeyler olduğu fikriyle " SQL araç seti ve Nesne İlişkisel Eşleştiricisi "(kalın yazı tipim) olarak alan popüler SQLAlchemy kütüphanesidir . Temel özellikler sayfasına koydukları gibi :

ORM Gerekmiyor

SQLAlchemy, Core ve ORM olarak bilinen iki ayrı bileşenden oluşur . Çekirdek, tam kapsamlı bir SQL soyutlama araç setidir ve çok çeşitli DBAPI uygulamaları ve davranışları üzerinde düzgün bir soyutlama katmanı ve ayrıca üretken Python ifadeleriyle SQL dilinin ifadesini sağlayan bir SQL İfade Dili sunar. Hem DDL deyimlerini yayan hem de mevcut şemaları inceleyen bir şema gösterme sistemi ve Python türlerinin veritabanı türleriyle eşlenmesini sağlayan bir tür sistemi sistemi yuvarlar. Nesne İlişkisel Eşleştiricisi, daha sonra Çekirdeğe dayanan isteğe bağlı bir pakettir.

Ön sayfa ORM'yi şöyle açıklar:

SQLAlchemy, sınıfların veri tabanına açık uçlu olarak eşlenebileceği, veri modelleme düzenini sağlayan isteğe bağlı bir bileşen olan nesne-ilişkisel eşleştiricisi (ORM) ile ünlüdür; nesne modeli ve veritabanı şemasının bir Baştan beri temiz bir şekilde ayrışmış bir yol.

Bir ORM'nin ana fikri, ünlü nesne-ilişkisel empedans uyumsuzluğunu denemek ve köprü yapmaktır . Bu, kullanıcı tanımlı sınıflar arasında bir veritabanı şemasındaki tablolarla ilişkileri tanımlamak ve uygulamanızın sınıfları için otomatik "kaydet" ve "yükleme" işlemleri sağlamak anlamına gelir.

Buna karşılık, ORM dışı veritabanı soyutlama katmanları, ilişkisel veri modeline ve SQL'e daha fazla bağlı olma eğilimindedir ve hiçbir şekilde nesne yönelimli değildir. Bu nedenle, tablolar ve sınıflar arasında "eşlemeler" kullanmak ve veritabanı şemasını programlayıcıdan gizlemek yerine, veritabanını programlayıcıya gösterme eğilimindedirler, ancak daha iyi API'ler ve soyutlamalar yaparlar. Örneğin, SQL sorgu oluşturucuları, programatik olarak, dize manipülasyonu olmadan karmaşık Java sorguları oluşturmanıza olanak tanır ( bunun için Java için jOOQ kitaplığından bir örnek ):

// Typesafely execute the SQL statement directly with jOOQ
Result<Record3<String, String, String>> result =
    create.select(BOOK.TITLE, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
          .from(BOOK)
          .join(AUTHOR)
          .on(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
          .where(BOOK.PUBLISHED_IN.equal(1948))
          .fetch();

Şimdi, Oyun çerçevesi, az önce tarif ettiğim ile ligde% 100 gibi görünmüyor , ancak argümanları bu genel alanda gözüküyor: doğrudan sınıflara çevirmek ve onlardan geri dönmek yerine ilişkisel modelle çalışın.

JOOQ kütüphane ORMs karşı bir konum olarak okuyan değer. Ayrıca okunmaya değer bazı alakalı blog girişleri de vardır:


19

Çok fazla işlevsel programlama yapana kadar açıklamak zor. Nesneye yönelik programlamada, verileriniz bir nesneye sıkışmış ve orada kalır. Bu nesne biraz etrafından geçip biraz değişmiş, ancak genellikle bu verilerin kullanım süresi boyunca aynı “kimlik” ile çalışıyorsunuz.

ORM'ler genellikle bu paradigma etrafında tasarlanmıştır. Veritabanından bazı verileri alırsınız, bir nesneye sıkıştırırsınız, potansiyel olarak bir demet değiştirirsiniz ve işiniz bittiğinde, yine de veritabanına yazabileceğiniz aynı nesneye sahipsiniz.

İşlevsel programlama farklı çalışır. Verileriniz ömrü boyunca tek bir kimliği korumaz. Ayrılır, kopyalanır, paylaşılır ve dönüştürülür. Bir sürü fonksiyondan geçerek akar, daha sonra ihtiyacınız olan çıktı formuna tekrar monte edilir. Herhangi bir veritabanı API'sinin işlevsel bir dilde kendini doğal hissetmesi için bunu hesaba katması gerekir ve JPA bunu yapmaz.


1
+1000 Scala'yı sanki Java + + gibi kullanmakta ısrar eden insanlar beni dilin geleceği için
Andres F.

9

Scala'da veritabanı tablolarını nesnelerle eşlemek hala yararlıdır ve bunu yapmanın birkaç yolu vardır.

Scala dünyasında popüler bir çerçeve kaygandır . Bir ORM değildir, çünkü daha az yapar (yani, açıkça katılmaları söylenmeden ilişkileri getirmez).

Böylece, nesneleri hala veritabanı satırlarına eşlersiniz, ancak nesneleriniz değişmezdir (bu nedenle durum temizlemesi yoktur) ve açıkça bir monadik DSL kullanarak sorguları yürütürsünüz. Sonuç olarak, bir ORM'nin değişkenliği ve öngörülemeyen N + 1 problemleri olmadan bir çok "iyi" kısım elde edersiniz.

İnsanların, anormallik veya düz JDBC gibi daha ince kütüphaneleri kullanarak, kodu güzel tutmak için fonksiyonel teknikleri kullanarak büyük başarı kazandıklarını belirtmek gerekir .

JDBC üzerine fonksiyonel teknikler uygulayan fantastik bir kütüphane de doobie'dir .

Bu nedenle, veritabanı erişimi için birçok seçeneğiniz var, ancak değişebilirliğe yönelttiği için Hazırda Bekletme (ki bu fiili ORM gibi görünüyor) en iyilerinden biri değil.


0

Nesne yönelimli dillerde bile bir ORM'ye ihtiyacınız yoktur.

Birincisi, verilerinizin kalıcı depolama alanınızdan nesnenize fiziksel olarak kopyalanması gerektiğini kim söyledi? Smalltalk'ın arkasındaki adam Alan Kay , nesnelerin verilerden kurtulmasını istedi . Bir nesnenin sadece verilerinin saklandığı bir alana referans alabileceğini ileri sürdü.

İkincisi - bunu başarmanın en iyi yolu nedir? Nesnelerini sorumlulukları ile tanımlamayı ve sahip oldukları veriler hakkında düşünmemeyi öneririm . CRC kartlarının yaklaşımını duyduysanız, tam olarak bunun için kullanılır.

Ve son olarak, OO alanına geri dönmeniz durumunda, bunu uygulamanın bir yolu var .

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.