Değişmez nesneler ve DDD birlikte mi gider?


18

DDD kullanan bir sistem düşünün (ORM kullanan herhangi bir sistem). Herhangi bir sistemin gerçekçi bir şekilde, neredeyse her kullanım durumunda, bu etki alanı nesnelerini manipüle etmek olacaktır. Aksi takdirde gerçek bir etki veya amaç yoktur.

Değiştirilemez bir nesnenin değiştirilmesi, nesne devam ettikten sonra yeni bir kayıt oluşturmasına neden olur ve bu da veri kaynağında büyük bir şişkinlik oluşturur (değişikliklerden sonra önceki kayıtları silmediğiniz sürece).

Değişmez nesneleri kullanmanın yararlarını görebiliyorum, ancak bu anlamda değişmez nesneleri kullanmak için yararlı bir durum göremiyorum. Bu yanlış mı?


Yanıtlar:


16

Değişmez nesneler kullanarak hesaplama (işlevsel programlamada olduğu gibi), üretilen her nesnenin kalıcı olması anlamına gelmez!


Bu senaryonun yine de değişmez nesneleri kullandığı bir örnek görmüyorum - bu yüzden özel bir amaç için orada olacaklardı. Yanlış mıyım?
Steven Evers

1
değişmez cisimlerin ara hesaplamalar için yararlı olacağını düşünüyordum (paralel başlıklar halinde)
Steven A. Lowe

11

Alandaki değişmez, veritabanında değişmez olması gerektiği anlamına mı geliyor? Örneğin, müşterinin her zaman bir adresi olduğunu varsayarak aşağıdakileri göz önünde bulundurun:

customer.address = new Address('My Castle', 'Kings street');
customer_repo.save(customer);

şimdi müşteri kimliği 1 olarak göz önüne alındığında aşağıdaki sql çalıştırılır:

INSERT INTO addresses (customer_id, name, street)
VALUES (1, 'My Castle', 'Kings street');

şimdi adres üzerinde aşağıdaki değişiklik yapılır:

customer.address = new Address('Pauper palace', 'Outlands');
customer_repo.save(customer);

ve kalıcılık katmanı, çok akıllı olmak aşağıdaki sql çalışır:

UPDATE addresses SET name='Pauper palance', street='Outlands'
WHERE customer_id = 1;

Bu şekilde ayrı bir DELETE AND INSERT deyiminin ek yükünü önlersiniz. Ayrıca bazı RDBMS'lerin YER DEĞİŞTİR falan olduğunu düşünüyorum. MySql DEĞIŞTIR .


+1 Genel prensipte sizinle aynı fikirdeyim: Değişken etki alanı nesnelerinin neden zorunlu olmayan DB satırları anlamına gelmesi gerektiğini anlamıyorum.
Andres F.

? Biz hiç biz bunu nasıl ele verilen bir müşteri için adres sınıfının şehir niteliğini değiştirmek gerekirse Yukarıdaki durumda, ayrıntılı müşteri o yüzden birden fazla adres olabilir varsayalım müşteri ve adresler arasında birçok ilişki gemiye aa bir
Sudarshan

1
@Sudarshan bu sadece 'değişmez değer nesnesi' yapmanın bir yoludur, veritabanında gerçekten değişmez değildir. Performans nedenleriyle. Her durum özel olarak ele alınmalıdır. Şu anda Alanım için Etkinlik Kaynaklandırmayı tercih ediyorum, ancak buna bağımlıyım.
andho

@Sudarshan özellikle sorunuzu cevaplamak için, sadece satırı yeni değere güncelleyen bir güncelleme sorgusu çalıştırın. Bire çok ise, adresler Müşteri Toplama Kökü içinde DB'de benzersiz olarak tanımlamak için kullanılacak bir tür tanımlayıcıya sahip olacaktır. Daha sonra bu tanımlayıcı ve customer_id, 'adres' tablosundaki bu satırı güncellemek için kullanılacaktır.
andho

@andho "bu sadece veritabanında değişmeyen bir 'değişmez değer nesnesi' yapmanın bir yoludur." Bu gerçekten benim gün teşekkür yaptı
Sudarshan

6

DDD'de, değişmez nesneler hemen hemen değer nesnelerine eşittir. Bu nesneler varlık değil, kimlikleri yoktur. Bu nedenle her zaman değer nesnelerini içerdikleri varlığın sütunları olarak saklıyorum (N / Hibernate ile bunun için Bileşenler kullanabilirsiniz). Kendi masaları yok.


4

Değişmez nesnenin veritabanında nasıl eşlendiğine bağlıdır. Yalnızca DateTime gibi bir bileşense (Joda Time kitaplığından), değeri değiştirmek bir ekleme yerine güncelleme ile sonuçlanır. Bununla birlikte, değişmez bir tabloda bir satır gerektiren daha karmaşıksa, o zaman şişkinlik probleminiz var.

Sanırım zayıf bir argüman olmasına rağmen, bu şekilde bir denetim izi uygulayabilirsiniz. Değiştirilemeyen her değişiklik kesici uçlar aracılığıyla izlenebilir. Yine de bunu yapmanın daha iyi yolları var.

Sonuçta değişmez etki alanı nesnelerine sahip olmak (yalnızca bileşenleri yerine), kalıcılığıyla bir uyumsuzluk gibi görünüyor.


Bir şey değil. Etki alanı nesnelerinin aynı temel verilerden farklı oluşturulmasına izin verdikleri için bileşenler çok kullanışlıdır. Sorunlar, değişmezliğin uygulanmasıyla birlikte gelir. Şahsen, etki alanı nesnelerini değiştirilebilir (birincil anahtar alanlar hariç) ve basit tutarım.
Gary Rowe

"Sonuçta değişmez etki alanı nesnelerine sahip olmak (yalnızca bileşenleri yerine), kalıcılığıyla biraz uyumsuzluk gibi görünüyor." Sizce bileşenler olarak modellenmemesi gereken değer nesnelerine nerede ihtiyacımız var? (Hazırda Bekletme terminolojisi)? --- Üzgünüm son yorumumu yanlış yazmıştım ve dolayısıyla silmiştim.
Sudarshan

Tek bir varlık bir satırla tamamen temsil edildiğinde ve verilerin hiçbiri başka bir etki alanı nesnesi tarafından paylaşılmadığında bileşenlerden kaçının.
Gary Rowe

4

Bu etki alanına bağlıdır. DDD, programlama paradigmasının nesne yönelimli olduğunu belirtmez. Bununla birlikte, nesne yönelimli paradigma, bir veritabanında kalıcı olması gereken tipik uygulama için çok uygundur.

DDD, yazılımınızı çözmeye çalıştığı gerçek sorunu temsil eden bir etki alanı modeli etrafında oluşturmanız gerektiğini belirtir. Eğer bu problem örneğin doğası gereği matematiksel olsaydı, fonksiyonel programlama ve değişmez veri yapıları kullanarak alan katmanını uygulamak çok mantıklı olurdu.

Öte yandan, sorun daha tipik bir kurumsal uygulama ise ve tüm etki alanı nesneleriniz için değişmez nesne yapıları kullanıyorsanız, o zaman DDD'yi takip etmediğinizi iddia ederim. En az iki argüman ortaya koyabilirim:

  • Uygulamanız, sorunlu alan adınızın alan modelini temsil etmiyor. Bu durumda sorun etki alanınız, değiştirilecek durumu olan varlıklardan oluşur. Ve bunu böyle uygulamadınız.

  • Her yerde bulunan bir diliniz yok. Alan adı modelindeki dil ve kavramlar, alan adı uzmanlarının kullandıklarını izlemez.

Not: DDD, uygun olan yerlerde değiştirilemez nesneler kullanır, bunlara sadece değer nesneleri denir.

Bu yüzden tamamen işlevsel veri yapılarını kullanarak bir veritabanı uygulaması oluşturamayacağınızı söylemiyorum ve yapmamanız gerektiğini söylemiyorum. Ben sadece uygulamanın türüne bağlı olarak, DDD diyebilirsiniz sanmıyorum


Peter, harika cevap. Buradaki soruma bir göz atabilir misiniz stackoverflow.com/questions/13783666/… ve sorunumu çözmeme yardımcı olabilir misiniz? Ben değişmez değer nesneleri işletme ile ilgili olmayan yazılımlar için harika olduğunu düşünüyorum. Çoğu kurumsal uygulamanın nesnesi bana göre değiştirilebilir. Değişmez derin iç içe değer nesnesine sahip olduğunuzu düşünün ... ContactInfo-> FizikselKonum-> Adres ve posta kodunu güncellemek istediğiniz ... tüm nesne grafiğini oluşturmak bana sadece bir antipattern değil, Deccal gibi görünüyor. ne düşünüyorsun?
Pepito Fernandez

3

Hazırda Bekletme / NHibernat gibi bir ORM kullanıyorsanız, artık nesnelerini otomatik olarak silmek için basamakla seçeneğinizi ayarlayabilirsiniz. Bir kişinin bir adres nesnesi adresi varsa, adresi değiştirdiğinizde, yenisi kaydedilir ve eskisi artık yetim kaldığı için silinir.


0

Değer nesneleri DDD'de neredeyse her zaman değiştirilemez ve sinek ağırlığı deseni, .NET'in dizelerle yaptığı gibi, bu değer nesnesinin çoğalmasını bellekte tutmak için kullanılabilir. Ana değiş tokuş bir tarafı hafızadır ve diğer tarafı yaratıcı verimliliktir. Flyweight paterni ile, herhangi bir yeni veya yeniden oluşturulmuş değer nesnesinin zaten flyweight önbellek içinde olup olmadığını belirlemek için bir değer temelli karşılaştırma yapılmalıdır, ancak bu noktadan sonraki herhangi bir karşılaştırma genellikle tek bir örnek zorlandığı için referans olarak güvenli bir şekilde yapılabilir. Her iki şekilde de sinek ağırlığı kullanılsın veya kullanılmasın, değer nesneleri hala değişmez hale gelir, çünkü sadece içsel kimliğe sahiptirler ve böylece değerlerini değiştirmek kimliklerini değiştirir.


-1

Değişmez nesneleri kullanmanın başka bir yolu daha var ...

5.0, 6.0, 7.0, 8.0 değerlerini saklamak ve her seferinde tüm kaydı kopyalamak yerine, bunun gibi bir şey depolayabilirsiniz: 5.0, +1.0, +1.0, +1.0 ve sonra sıra 5.0'ı yeniden yapılandırmak için doğru bir bağımlılıklar oluşturun , 6.0, 7.0, 8.0. Bu şekilde küçük değişiklikler yalnızca az miktarda bellek alı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.