Poco Class Tasarımı Hk.
-
Selam hocalar,
Bir model çıkarmaya uğraşıyorum lakin en sade ve optimum tasarımı çıkaramadım. Aşağıdaki gibi 8 tip var. Tabi şahıs ve şirket diye ayırırsa 16 tablo oluyor. Kalıtım dikkate alınarak nasıl bir base class olmalı interface yahut abstract class tasarımı nasıl olmalı sizler bu tip durumlarda nasıl bir yol izliyorsunuz? (Aynı olan property ler var aynı olmayanlar var vs vs.)
He desen ki her birini 16 ayrı tabloya 16 ayrı poco class ile bas o da bir yöntem :) lakin hiç de kullanışlı değil :) Bu yüzden işin içine interface - abstract girdiğinde nasıl bir tasarım çıkar buradan?
Kullanıdığım araç ve yöntem: Asp.Net MVC, EF CodeFirst.
-
Id den Adres'e kadar tüm özellikler aynı ise onları BaseCompany gibi bir class olarak tanımla, daha sonra diğer class ları bundan türetebilirsin. Zaten farklı propertylere sahipse böyle yapman normal.
Anladığım kadarıyla bu class lar senin modelin olacak, o yüzden çok fazla kompleks düşünmene gerek yok. Hatta 16 tane ayrı class yapsan bile sorun olacak bir durum yok, çünkü her hangi bir operasyon barındırmıyor.
operasyonel tarafında da mesela repository design pattern den yararlanabilirsin
http://web.archive.org/web/20150404154203/https://www.remondo.net/repository-pattern-example-csharp/
-
unbalanced bunu yazdı
Id den Adres'e kadar tüm özellikler aynı ise onları BaseCompany gibi bir class olarak tanımla, daha sonra diğer class ları bundan türetebilirsin. Zaten farklı propertylere sahipse böyle yapman normal.
Anladığım kadarıyla bu class lar senin modelin olacak, o yüzden çok fazla kompleks düşünmene gerek yok. Hatta 16 tane ayrı class yapsan bile sorun olacak bir durum yok, çünkü her hangi bir operasyon barındırmıyor.
operasyonel tarafında da mesela repository design pattern den yararlanabilirsin
http://web.archive.org/web/20150404154203/https://www.remondo.net/repository-pattern-example-csharp/
Aynen hocam yapımda generic repository, IOC, UnityOfWork vs hepsini kullanıyorum.
İşte sıkıntımda o BaseCompany ve BasePerson diye 2 tane base class ım mı olmalı? Aşağıda bölmeye çalıştım. 8 farklı tip gibi görünsede Xşahıs tipi - Xşirket tipi diye ayırırsam 16 farklı class olacak. Ortak olan prop ları renklendirmeye çalıştım bu durumda tüm renk sayısı kadar base class ım olmalı ki ortak prop ları bu baselere yazayım yanlış mıyım?
Aynen hocam bu classlar benim modellerim oalcak.
-
http://www.entityframeworktutorial.net/code-first/inheritance-strategy-in-code-first.aspx
TPH, TPT ve TPC olmak üzere üç farklı yaklaşım var. Yolladığım bağlantılara bakın.
-
sorunu şimdi anladım hocam, sen X,Y tipi altında genelleştirmeye çalışmışsın ama altındaki şahıs ve şirket de farklıymış.
Yerinde olsam db de bu kolon adlarını değiştirip daha çok ortak yapardım, o zaman şahıs ve şirket tamamen aynı olurdu, ama db yi değiştirme imkanın yoksa
Şahıs ve Şirket lerdeki ortakları toplayıp bir base class altına alacaksın (BaseInfo)
daha sonra BasePerson ve BaseCompany oluşturacaksın ve baseinfo dan türeyecekler.
Buraya kadar olan kısım Id den Adres e kadar olan kısım olacak..
Kalan kısımlar için ise X tipi şahıs, X tipi şirket, Y tipi şahıs, Y tipi şirket şeklinde oluştuacaksın.
Çünkü anladığım kadarıyla toplam 16 tablon var ve her halukarda bu şekilde bir yapıya ihtiyaç duyacaksın gibi görünüyor.
Senin yerinde olsam ve imkanım olsa veritabanı yapısını değiştirirdim hocam.
Şöyle; Bir tane tablo, Id den Adrese kadar tüm bilgileri eklerdim ve ek olarak bir de Tip (X,Y tipini tutmak için) ve Kind (Şahıs,Şirket tutmak için) diye iki kolon oluştururdum
Harici bir tabloya gerek duymadan 3 tane field i de buraya kolon olarak ekledim sorunun tek tabloyla çözülürdü.
En kötü ihtimal farklı bir tablo yapardım orada da bu A,B,C propertylerinin isimlerini ve değerlerini tutardım, bir de ilişkide olması için oluşturduğum tablonun id sini yazardım..
-
YeniHarman bunu yazdı
http://www.entityframeworktutorial.net/code-first/inheritance-strategy-in-code-first.aspx
TPH, TPT ve TPC olmak üzere üç farklı yaklaşım var. Yolladığım bağlantılara bakın.
hocam burda gördüğüm kadarıyla db ye müdahale ediliyor, yani tasarımı baştan yaptırıyor gibi.
-
YeniHarman bunu yazdı
http://www.entityframeworktutorial.net/code-first/inheritance-strategy-in-code-first.aspx
TPH, TPT ve TPC olmak üzere üç farklı yaklaşım var. Yolladığım bağlantılara bakın.
inceliyorum hocam eyv.
-
unbalanced bunu yazdı
sorunu şimdi anladım hocam, sen X,Y tipi altında genelleştirmeye çalışmışsın ama altındaki şahıs ve şirket de farklıymış.
Yerinde olsam db de bu kolon adlarını değiştirip daha çok ortak yapardım, o zaman şahıs ve şirket tamamen aynı olurdu, ama db yi değiştirme imkanın yoksa
Şahıs ve Şirket lerdeki ortakları toplayıp bir base class altına alacaksın (BaseInfo)
daha sonra BasePerson ve BaseCompany oluşturacaksın ve baseinfo dan türeyecekler.
Buraya kadar olan kısım Id den Adres e kadar olan kısım olacak..
Kalan kısımlar için ise X tipi şahıs, X tipi şirket, Y tipi şahıs, Y tipi şirket şeklinde oluştuacaksın.
Çünkü anladığım kadarıyla toplam 16 tablon var ve her halukarda bu şekilde bir yapıya ihtiyaç duyacaksın gibi görünüyor.
Senin yerinde olsam ve imkanım olsa veritabanı yapısını değiştirirdim hocam.
Şöyle; Bir tane tablo, Id den Adrese kadar tüm bilgileri eklerdim ve ek olarak bir de Tip (X,Y tipini tutmak için) ve Kind (Şahıs,Şirket tutmak için) diye iki kolon oluştururdum
Harici bir tabloya gerek duymadan 3 tane field i de buraya kolon olarak ekledim sorunun tek tabloyla çözülürdü.
En kötü ihtimal farklı bir tablo yapardım orada da bu A,B,C propertylerinin isimlerini ve değerlerini tutardım, bir de ilişkide olması için oluşturduğum tablonun id sini yazardım..
Yeni harmanın linklerine baktıktan sonra bunu deneyeceğm hocam. Tek bir tabloda hepsini tut diyorsun değil mi? Ayrı ayrı tablolar işi kolaylaştırır diye düşünmüştüm lakin çok karmaşıklaştırdı :)
-
hocam pek uyuyamadım gece o yüzden kafam iyi çalışmıyor, düşünemiyorum tam tasarım nasıl olmalı. Belki bir kaç tablo daha mantıklı olabilir ama en kötü ihtimal 2 tablo işini görecektir..
Sadece x-y.. tipini ve şahıs-şirket kavramını tutacaksın. Eğer başka bir şeyler daha eklenecekse yani dinamik olacaksa, X,Y tipi için ayrı bir tablo, şahıs-şirket için ayrı bir tablo yapabilirsin.
diğer A,b,c property için name,value, relationalId yi tutabilirsin.
-
unbalanced bunu yazdıYeniHarman bunu yazdı
http://www.entityframeworktutorial.net/code-first/inheritance-strategy-in-code-first.aspx
TPH, TPT ve TPC olmak üzere üç farklı yaklaşım var. Yolladığım bağlantılara bakın.
hocam burda gördüğüm kadarıyla db ye müdahale ediliyor, yani tasarımı baştan yaptırıyor gibi.
Kesinlikle:) Hocam mecburiyet diyelim. Başka türlü simule etmekten (arkaplanda ef'in yaptıklarını sql cümlecikleri ya da stored procedure ile yapmaktan) başka çözüm yok diye biliyorum.
-
Eğer yanlış anlamadıysam, aslında hücre içerikleri aynı olmasına rağmen tipleri farklıysa, mesela insan tablosu için 30 kişi var (ama kimisi yazılımcı kimisi doktor kimi çöpçü gibi). bu durumda tabloya bir de type_id şeklinde atama yapıp ayrıştırılabilir. bu sayede aynı tabloda olmasına rağmen zibilyon tane tip üretilebilir? ben mi yanlış anladım acaba?