Çoktan çoğa derin ilişkileri yönetmek için bir tasarım modeli var mı?


10

Birkaç uygulama üzerinde çalışırken karşılaştığım bu veri modelini tanımlamakta sorun yaşıyorum.

Bu oluşmaktadır:

  1. Birçok nesnenin kendisinden oluşan bir nesne türü
  2. Her nesnenin ilk nesnenin 'çokuna' sahip olduğu ikinci bir nesne türü
  3. Ve birinci nesnenin alt nesnelerinin her biri, ikinci nesne türüyle her ilişkilendirme için değiştirilebilir.

Basit bir örnek şunlar olabilir:

  1. Bir dizi dersten oluşan bir programlama kursu
  2. Dersler belirli ödevlerden oluşur.
  3. Bir öğrenciye bir kurs atanabilir.
  4. Bununla birlikte, bir öğrenciye bir ders atandıktan sonra, her ders ve / veya ödev, öğrencinin kaldırılması ve eklenmesi ile, orijinal dersin tanınamayacağı noktaya kadar özelleştirilebilir.

Çözümlerimde bunun sonucu:

Bir öğrenciye bir ders atandığında, ders belleğe yüklenir. Daha sonra her bir alt nesne için uygun meta verilerle bir öğrenci / alt nesne ilişki nesnesi oluşturulur. Temel olarak, gerekli özelleştirilebilir nesneleri oluşturmak için orijinal nesneyi şablon olarak kullanıyorum.

Bu, alt nesneler daha karmaşık ve numaralandıkça büyük miktarda veriyle sonuçlanır. Bu veri modelini manipüle etmek için gerekli mantık / karmaşıklık miktarını azaltmak için bazı optimizasyon veya desen olup olmadığını merak ediyorum.


2
"Veri miktarını azaltmak" istediğinizden emin misiniz? Bunun yerine, gerekli davranışı uygulamak için yazılması gereken "önemsiz kod ve mantık miktarını azaltmanın" yollarını mı arıyorsunuz? (Verilerin devam eden yönetiminin veritabanına benzer ilişkisel veri yapısı gerektirdiğini fark ediyorum.)
rwong

@rwong Evet, "önemsiz olmayan kod ve mantık miktarını azaltmak" benim nihai hedefim. Bana göre bu, veri karmaşıklığının bir şekilde azaltılması anlamına geliyor, ancak bu mutlaka bir gereklilik değil. Bu kadar yaygın bir veri deseni haline geldi ve onu yönetmenin daha basit bir yolu olup olmadığını merak ediyorum.
Nicholas Pickering

1
Prensipte bu bir m: n ilişkisinin geliştirilmiş bir versiyonudur. »Karmaşık nesne ilişkileri nasıl yönetilir« gibi bir başlık?
Thomas Junk

1
Büyük miktarda veri, verilerdeki büyük bir karmaşıklık düzeyi ile aynı değildir. Yaptığınız şeyi yönetmedeki zorluk, büyük olasılıkla hacimden çok karmaşıklıkla büyüyecektir.
Walter Mitty

1
İlginç. Bu kalıbı olan birkaç uygulama üzerinde çalıştım, ancak daha önce hiç fark etmedim. Bu tür verileri yönetmenin daha basit yollarını da görmek isterim.
Jules

Yanıtlar:


6

İhtiyacınıza bağlı olarak birkaç seçenek görüyorum: (1) ortak bir algoritmayı takip eden birçok benzersiz örnek varsa, (2) çok sayıda benzer nesne varsa veya çalışma zamanında nesne oluşturacaksanız ve (3) çalışırken nesnenin davranışını dinamik olarak değiştirmek istiyorsunuz. Not: Gerektiğinde burada bahsettiğim tüm desenleri birleştirebilirsiniz.

  1. Her "ikinci nesne türü" benzersizse ancak benzer bir davranış modeli izliyorsa, Şablon Kalıbı'nı . Sanki bunu yapıyor gibisin. Ancak bunu açık bir şekilde ifade etmek için, temel sınıfınız programlanmış genel algoritmaya sahiptir; bu algoritmanın belirli adımları türetilmiş sınıflarda uygulanır.

  2. Çok sayıda nesne oluşturacaksanız veya çalışma zamanında nesne oluşturma sizin için önemliyse, Fabrika Deseni'ni .

  3. Ve davranışı dinamik olarak değiştirmek isterseniz, Stategy Pattern işe yarayabilir. Örneğin, düzenli bir müfredattaki bir öğrencinin özel ihtiyaçlara veya hızlandırılmış bir programa girmesine karar verilirse. Bu, müfredatın temel sınıfını temsil edecek bir nesnenin "öğrencisini" oluşturarak çalışır. Müfredat, öğrencinin yapısındaki türetilmiş bir müfredata atanacaktır (bu kulağa garip geliyor) ve daha sonra başka bir türetilmiş müfredata yeniden atanabilir.

(Sadece FYI, eğer C ++ ile (3) Strateji Kalıbı kullanıyorsanız, kompozisyon için Değerler vermeniz gerekecektir.)

Nesnelerinizi ve ikinci nesneleri saklamak için Yineleyici Deseni (bunlar arasında geçiş yapmak, eklemek, silmek, sıralamak vb.) Göz önünde bulundurulmaya değer olabilir.

İyi bir referans, bahsettiğim desenleri ve bunların uygulanmasını kapsayan Head First Design Patterns'tir . Java ile çalışırlar.


0

Bir veri deposu veya kalıcılığı sayesinde, bir çalışma zamanında herhangi bir noktada bu tür derinliğe sahip nesnelerin olması gerektiğine inanmakta zorlanıyorum. CRUD GUI'lar için mi? Eğer öyleyse, yaklaşımınızı baştan değiştirmenizi öneririm. IE:

Öğrencinin göstermesi için gerekli alt yapıyı tanımlayın ve başlangıç ​​dizinini db'ye geri depolayın ve görünüme ve arka uç db'ye gidip gelen vatansız bir şekilde güncelleyin.


Önerinizi anladığımdan emin değilim. Boş bir alt nesne oluşturmak gerekir, sonra onları alt nesne değiştirmek için izin veren başka bir forma zorlamak?
Nicholas Pickering

Eğer tüm yaptığınız içerik ve arka uç veritabanı arasında durumsuz bir işlem ise, kendi içinde nesneleri çok başarılı değil öneririz. Bu durumda, bunları kaldırın ve yalnızca istemcinin yüzüne özel veriler için işlemi gerçekleştirin.
John P. Feltz

Düzenleme: Bu aynı zamanda işlemin gerçekleştirildiği belirli verileri yakalamak için nesneler oluşturmak anlamına da gelebilir.
John P. Feltz

Yanlış anlamadığım sürece, süreç hakkında hiçbir şeyin vatansız yapılabileceğini sanmıyorum. Her şey kullanıcı eyleminin bağlamına bağlıdır. Bir kullanıcı birincil nesne oluşturduğunda, alt yapının hemen değiştirilmesini bekler.
Nicholas Pickering

-1

Her öğrencinin, orijinal kursun tanınmayacağı noktaya kadar özelleştirilmiş bir kursu, orijinal kursun basitçe “varsayılan” bir referans olduğunu gösterir. Ne yapacağım ÖzelleştirilmişCorese (veya bunların bir listesi) adlı bir sınıf oluşturmak ve bir öğrencinin bir özellik olarak (veya bir listesi) var. Özelleştirilmiş Kurs, “referans” kullanım için orijinal kursa referans verebilir, ancak ana çalışma ve veriler Özelleştirilmiş Kursun kendisinde olacaktır.


downvoter yorum yapmak ister misiniz?
frezq

Ben aşağı itmedim (OP), ama görünüşe göre başka bir cevapta zaten açıklanan Şablonu veya Strateji Modelini tarif etmeye çalışıyorsunuz.
Nicholas Pickering
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.