Nesneye Dayalı “normalleştirme”


28

Veri tabanı programlamasında depolamak istediğiniz verilere yaptığınız "normalizasyon" adı verilen bir teknik var.

Bu konsepti nesne tasarımına uygulamaya çalışan var mı? Nasıldın? Nasıl çalıştı?

Düzenleme: Genişletmek / netleştirmek için, veritabanı normalleştirme artıklığı azaltmak için bir dizi ilkeden daha fazlasıdır. İçinde bulunduğunuz adımlar ve aşamalar ve en azından hangi aşamada olduğunuzu gösteren orta derecede tarafsız önlemler var. Nesne tasarımının kendine has ilkeleri var ve koku kavramı var, ancak size söyleyebilecek benzer bir şey yapmanın bir yolu var mı? XX-form0,1,2 ... etc ... ve bir sonraki en "normalize" seviyeye geçme yöntemleriniz?


2
... Yani, sınıflarımızda birden fazla gereksiz değişken bulunmadığını ve projelerimizde birden fazla gereksiz sınıf bulunmadığını denedik mi? Bu işe yarar mıydı?
Satanicpuppy 16:11

2
@Steven A. Lowe: Beş yıl önce, yüksek lisans tezi konusuna karar verdiğimde neredeydiniz? ;)

Bunu hiç denemedim (bu yüzden bir yorum olarak cevap veriyorum) ancak bunu paylaşılan veri önbelleğiyle, nesnelerden önbellekteki paylaşılan verilere işaretçilerle ve bir tür bağımlılık enjeksiyon mekanizmasıyla yapabileceğinizi tahmin ediyorum. örneklerin işaretçilerini paylaşılan verilere yönlendirmek için ...
FrustratedWithFormsDesigner

Çok ilginç bir soru buluyorum.

5
Refactoring'in hem OOP hem de diğer programlama metodolojileri için geçerli olduğunu düşünüyorum.
JohnFx

Yanıtlar:


27

Veritabanının normalleşmesini sağlayan temel gerilimlerin bir kısmı bir OO sisteminde bulunmamakla birlikte, bazıları vardır. Bunlar, OO tasarım modellerine ve bazı şekillerde normalleşmeye benzeyen ilkelere yol açmıştır, en azından OO sistemleri ilişkisel veritabanlarına benzerdir. Örneğin:

Başka bir deyişle, birisi veritabanı normalleştirme tekniklerini OOP'a uygulamaya çalıştı mı? Hayır, çünkü OOP zaten normalleşmenin ilişkisel veritabanları için çözdüğü ortak problemler için çözümlere sahiptir.


+1 Yazmaya çalıştığımdan çok daha iyi!
Michael K

Bunlar prensipler, teknik değil. Bir nesne tasarımını "normalleştirmek" için bu ilkeleri nasıl kullanırsınız?
Edward Strange

3
Veritabanının normalleştirilmesi de bir ilkedir. Her iki durumda da, bu ilkelere ilişkin kararların nasıl alınacağını tanımlayan kalıplar (veya teknikler) vardır. Martin Fowler'ın yeniden yapılanma konusundaki kitaplarına ve Kent Beck'in kalıplardaki kitaplarına bakın. Aradaki fark, veritabanı tasarımının ölçülmesi ve basit bir kurallar kümesine dönüştürülmesi daha kolay olan daha küçük ve daha az karmaşık bir alan olmasıdır.
Rein Henrich,

5
@ Crazy Eddie: İlişkisel bir veritabanı ile nasıl yapıyorsunuz? Bir yöneticinin ihlal edildiği durumları arar ve düzeltirsiniz. Üç işi olan bir sınıf görürseniz, onu üç sınıf olarak yeniden yazarsınız. "Normalize etmek" gibi bir fiil arıyorsanız, belki de "refactor" olsa da, her ne kadar spesifik olsa da, kapsayıcıdır.
Jeremy,

1
@Rein: veritabanı tasarımı ne küçük ne de OOP daha az karmaşıktır, ancak bir büyük avantajı vardı: o başladı sağlam bir teorik temel ve matematiksel model ile. OOP birçok sezgisel gelişim geliştirmiştir, ancak yine de tam bir formalizmi yoktur.
Steven A. Lowe,

18

Evet, evet var

Bu konuda uzun süre sessiz kaldım; konuşmanın zamanı geldi.

  • Bu konsepti nesne tasarımına uygulamaya çalışan var mı?

Evet. 20 yılı aşkın bir süredir nesne normalleşmesini (ve dolayısıyla altta yatan nesne yönelimli teorisi) resmileştirmeye çalışıyorum.

  • Nasıldın?

Bu veri ve kodun farkına varmak suretiyle, en azından teoride, değiştirilebilir. Bu, normalleştirme ilkelerinin ve ilişkisel işlemlerin verinin yanı sıra kod için de geçerli olabileceği anlamına gelir.

  • Nasıl çalıştı?

Şu ana kadar gayet iyi çalıştı: Kazandığım içgörüler, tasarımımın, analizimin ve yeniden yapılanma becerilerimin "gizli silahları" olduğuna inanıyorum.

Bundan önce halka açık bir şey söylemedim, çünkü sonunda araştırmayı bitirmek ve ima edilen araçları üretmek için zamanımın olacağına karar verdim - kendim.

Ancak, hayatımda devam eden her şeyin daha önemli, daha eğlenceli ve / veya daha karlı olduğu sonucuna vardım, araştırmayı bitirmek için zamanım olmayacak. Hiç. Ayrıca, sadece çalışmayı tamamlamak için gerekli CS teorik temeline sahip olmamamın önemli bir olasılığı var.

Yerel üniversitede, nedenini almak isterlerse bir doktora adayına ya da iki kişiye sponsorluk yapmayı sordum, ancak maalesef yerel üniversitemiz dilbilimsel programlama konusunda yeterli bir temel öğretmiyor.

Bu alanda bazı ilginç araştırmalar yapıldı, ancak bunların hepsi - farkında olduğum - işaretten az kaldı. Ya normalleşme ilişkisel bir arka plandan geldiği için nesne yönelimli modellere uygulanmadığını ya da normalleşmenin sadece nesneler tarafından tanımlanan verilere uygulandığını varsaydığını yanlış kabul eder. Ancak bazı çok yakınlarda kaçırılan bazı projeler var ...

Gerçekten ilginç olan şey, normale normalizasyon uyguladığınızda olur - iddia edeceğim , tüm yeniden düzenlemenin temelidir .

Şimdi, yapılacak en iyi şeyin, belki de DC'deki DevDays 2011'de konuşmayı isteyerek ve benim de bu kadar heyecanlı bir topluluk olup olmadığını öğrenmek isteyip istemediğimi düşünüyorum.

İşte bir gözetleme direği: Normalizasyon, minimal ve gereksiz bir şey yapma sürecidir. Bu nedenle nesne yönelimli programlamanın Kendinizi Tekrarlama (DRY) prensibi normalleşme hedeflerinin açık bir göstergesidir. Tüm iyi bilinen nesne yönelimli tasarım / programlama / yeniden düzenleme ilkelerinin nesne normalleşmesinin mantıksal sonucu olduğunu gösterebileceğime inanıyorum. Ayrıca, Nesnenin Normal Formunda (ONF) sistemlerle yapılabilecek, sadece yeniden yapılanmadan daha ilginç şeyler olduğunu da söyleyebilirim.


1
Başka önemli belge var mı?
Steve314,

4
YAYINLA! (Lütfen?) (Güzel lütfen?) Belgeleri sırayla almak için yardıma ihtiyacınız olursa, benimle iletişime geçin.
AJ01

1
@ChrisCirefice: bana mutlu olun, steven.lowe@nov8r.com adresinden bir e-posta çekin
Steven A. Lowe

1
@ChrisCirefice: Sadece FYI, doktora adayı farklı bir üniversiteye geçti; yeniden brülör projesi (yine de DDD üzerine bir kitap yazıyorum)
Steven A. Lowe

1
Merhaba @ StevenA.Lowe Araştırmanızla gerçekten ilgileniyorum. Oldukça kısa bir kağıt buldum encrypted.google.com/… Bu konuda herhangi bir yorumunuz var mı? BTW, belki önce bir blog yazısı yazarak fikrinizi biraz daha gösterebilir misiniz? Teşekkürler.
Wei Qiu,

5

Bu Rein Henrichs'in mükemmel cevabı üzerine bir yorum olarak başladı , ama çok uzun sürdü ...

Normalleştirme ilişkisel verilere uygulanır. Her veriyi sadece bir yerde saklandığından veri bütünlüğünü sağlamayı kolaylaştıran çoğaltmayı önlemek için kullanılır. Normalleştirilmiş bir formun ihlallerini bularak ve düzelterek bir veritabanını normalleştirirsiniz.

Nesneye Yönelik Programlama veri üzerindeki işlemler için geçerlidir. Verileri birlikte işlemenin yollarını gruplamak içindir. Yinelenen yöntemleri elimine etmek için sınıflara benzer teknikler uygulayabilirsiniz, belki de işlemin hangi verileri yönettiğine veya bağlı olduğuna bakarak. Örneğin, OO perspektifindeki 1NF, bir sınıf içinde herhangi bir yinelenen işleme sahip olmaz. 3NF, yaygın olarak kullanılan kodun bir üst sınıfta olduğu iyi bir kalıtımsal yapıya karşılık gelebilir. Eminim burada bağımlılık enjeksiyonuna uygun bir yer bulabilirsin. İyi tasarım ilkeleri ve yeniden düzenleme ihlalleri bularak daha iyi bir tasarıma ulaşırsınız (normal formlar gibi henüz hiçbir şey keşfedilmemiş olsa da).

Her iki dünyada da iyi bir tasarıma ulaşmak için herhangi bir algoritmik yöntem yoktur. Rein Hendrichs'in belirttiği gibi, potansiyel sorunları tanımlayabilecek birçok prensip vardır (kod kokusu gibi). Tasarım desenleri ve en iyi uygulamalar, insanların kendilerine hitap etmeye çalıştığı yöntemlerden bazılarıdır. Test odaklı geliştirme, kodları harici olarak kullanacağınız gibi uygulayarak erken bulma girişiminde bulunur. Veri tabanı gelişiminde olduğu gibi, en iyi çözüm deneyim ve analiz ile bulunur.


2
Benim görüşüme göre, ilkeler bir dizi gerilimi çözmek için ideal yol hakkında bir ifadedir. Desenler bir prensibi uygulamak için bir buluşsal. IOW ilkeleri problem uzayının yapısı hakkında bir ifadedir ve kalıplar onları bir çözüm uzayına dönüştürmek için kurallardır. Ama ben bir matematik cevheriyim, bu yüzden garip düşünüyorum :)
Rein Henrichs 16:11

2

Normalleşmeye benzeyen iş modeli nesnelerini tasarlamak için çok iyi bir yaklaşım , Renkli UML Modellemesidir .

Peter Coad tarafından bulunan ve iş modeli nesnelerinin soyutlanmasına yardımcı olan bir tasarım stratejisidir.

Ne yazık ki - UML ile Renkli Modelleme: Kurumsal Bileşenler ve Süreç - satıldı ve yalnızca kullanılmış olanları satın alabilirsiniz.

İnternet üzerinden bu teknik hakkında birkaç makale var.

İlişkisel tasarıma aşina iseniz, size rehberlik etmesi için Renkte UML Modellemeyi faydalı bulacaksınız:


0

Sınıf diyagramınızı oluştururken kodunuzda ORM java ek açıklamalarını kullanmak için araştırma yaptınız mı? Hazırda Bekletme, modelleme aşaması tamamlandıktan sonra veritabanını oluşturur. Diyagram bu örnekte yalnızca kodun görüntüleyicisidir.


0

Nesne referansları veya işaretçiler yabancı anahtarlara benzer. Bu konuda düşünmeye istekli olduğum kadar derin. :)

Aslında daha derin düşüneceğim. Nesnelerinizi 0 veri yinelemeli olarak modellerseniz ve nesnelerinizi "sorgulayabilir" ve üzerlerinde set tabanlı güncellemeler gerçekleştirirseniz, bağlantı kesilmesi olmaz. Aslında bunu bir nesne tüketici kütüphanesi yaparak yapabilirsiniz. Microsoft bunu çoktan düşündü, ancak C # 'nın set-tabanlı LINQ sözdizimini "sorgu kitaplığı" üzerine koyma yönüne geçti.

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.