Bir işletmenin iyi bilinen işletme kimliği DDD / OOP'de özel bir türle mi temsil edilmelidir?


9

Pratik terimlerle class, bir stringya da başka bir ilkel tip üzerinde bir özel (değişmez) kullanmak anlamına gelir .

Örnekler:

  1. Yayıncılık: Uluslararası Standart Kitap Numarası.
  2. Finans: Uluslararası Menkul Kıymet Kimlik Numarası.

Avantajları:

  1. Bir tanımlayıcının biçimini sağlayabilir.
  2. Modelin birinci sınıf üyesi olur.

Dezavantajları:

  1. Kalıcılık sürtünmesi ekler (örn. Varlık Çerçevesi).
  2. Daha fazla kod.

Özel bir sınıf mı kullanmalısınız? Elbette. Bunları kimlik olarak mı kullanmalısınız? Kesinlikle Hayır :) İş anlamında bir kimlik yol boyunca sorunlara neden olur.
Songo

2
@Songo Bana göre bu, kimliklerin değer semantiğine sahip olması gereken bir argüman , ancak ilkel türler değer semantiğine sahip tek türler değildir, bu nedenle sınıf imo'yu mutlaka dışlamaz. Bu noktayı belirtmeyi unuttuğumdan beri rakip bir cevap yayınlamaktan çekinmeyin.
Ixrec

1
Eski bir sorum, konuya farklı görüşlerle değindi: programmers.stackexchange.com/questions/281827/… Türleri oluşturmaya gittim ve yapmaya devam ediyorum.
Ziv

Yanıtlar:


6

Sınıfa dize olmamanın ek karmaşıklığını haklı çıkarmak için yeterince kullanışlı işlevsellik verebilirseniz, bunu yapın. ISBN ve ISIN gibi tanımlayıcılar için, durumun böyle olmadığından şüpheleniyorum.

Bir tanımlayıcı sınıf yararlı olması için, bunun gibi bir şey görünmesini beklenir:

class ISIN {
    fromCUSIP()
    fromRawISINString()
    toString(ISIN::FormatType)
    getExchange()
    getCountryCode()
    getLastFourDigits()
    getWhateverCode()
    ...
}

Bunun yerine daha çok şuna benzer:

class ISIN {
    getString()
    setString()
}

Sonra sınıf tamamen hendek, her yerde düzenli dizeleri kullanın ve tüm ilgili değişken isimlerinde sürekli olarak "isin" kullandığınızdan emin olun.

Bazı dillerde, yeni bir tür eklemenin tipik programlarda neredeyse hiçbir "ek karmaşıklığı" olmadığına dikkat edin, bu durumda yeni bir tür işlevselliği olmasa bile yeni tür oluşturmanız önerilir. Ancak bu, C ++ gibi geleneksel OOP dillerinin çoğu için geçerli değildir.


6

Onun için git diyebilirim. Bu durumda avantajların dezavantajlarından daha ağır bastığını iddia ediyorum. Ekstra kod oldukça az olması muhtemeldir ve kalıcılık sorunu kolayca yeni Sınıfınız ve veritabanının beklediği tür arasında bir tür dönüştürücü sağlayarak çözülebilir (Entity Framework'ü hiç kullanmadım ama bunun nispeten ağrısız olduğunu biliyorum. Derin Uyku).

Kendi sınıfınızı tanımlayarak elde edebileceğiniz avantajlardan biri, derleyicinin ISBN veya ISIN isteyen herhangi bir yöntemin derleme zamanında yanlış değeri girmeye çalışacağını bilmesini sağlayabilmesidir . Ayrıca, kuruluşunuzdaki bu alanın üzerine yanlışlıkla yazmak çok daha zor olacaktır. Bunun gibi yaygın hatalardan tamamen kaçınabiliriz:

book.setAuthor(otherBook.getAuthorName());
book.setIsbn(otherBook.getAuthorName());
book.setPrice(otherBook.getPrice())

ISBN, ilkel bir türden ziyade bir sınıfsa, yukarıdaki kod derlenmeyecek ve daha sonra hata ayıklama zamanından tasarruf sağlayacaktır.


1
ayarlayıcılar ve alıcılar? 1992 mi?
Miles Rout
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.