Sınıfları “Bilgi” sonekiyle adlandırmanın ardındaki fikir nedir, örneğin: “SomeClass” ve “SomeClassInfo”?


20

Fiziksel cihazlarla ilgilenen bir projede çalışıyorum ve bu projedeki bazı sınıfların nasıl düzgün bir şekilde adlandırılacağı konusunda kafam karıştı.

Gerçek cihazlar (sensörler ve alıcılar) bir şey ve onların yazılımda temsil başka bir şey göz önüne alındığında , ben bazı sınıfları "Bilgi" soneki ad desen ile adlandırmayı düşünüyorum.

Örneğin, a Sensor, gerçek sensörü temsil eden bir sınıf olsa da (gerçekte bazı çalışma cihazlarına bağlandığında), SensorInfosadece bu sensörün özelliklerini temsil etmek için kullanılır. Örneğin, dosya kaydetme üzerine, mantıklı bile olmayan bir tür SensorInfoserileştirmek yerine, dosya başlığına serileştiririm Sensor.

Ama şimdi kafam karıştı, çünkü nesnelerin yaşam döngüsünde bir ya da diğeri kullanmam gerekip gerekmediğini ya da diğerinden nasıl alacağımı ya da her iki varyantın aslında sadece bir sınıfa daraltılmasının gerekip gerekmediğine karar veremediğim bir orta alan var.

Ayrıca, çok yaygın olan örnek Employeesınıf açık bir şekilde sadece gerçek kişinin bir temsilidir, ancak hiç kimse EmployeeInfobildiğim kadarıyla sınıfı adlandırmayı önermez.

Birlikte çalıştığım dil .NET'tir ve bu adlandırma modeli, bu sınıflarla örneklemek için çerçeve boyunca yaygın görünmektedir:

  • Directoryve DirectoryInfosınıflar;
  • Fileve FileInfosınıflar;
  • ConnectionInfosınıf (muhabir Connectionsınıf olmadan );
  • DeviceInfosınıf (muhabir Devicesınıf olmadan );

Benim sorum şu: Bu adlandırma modelini kullanmanın ortak bir mantığı var mı? Bir çift isme ( Thingve ThingInfo) sahip olmanın mantıklı olduğu durumlar ve muadili olmadan sadece ThingInfosınıfın veya sınıfın olması gereken diğer durumlar var Thingmı?


5
Ben Aaronson şu cevabı verdi; Infosonek ayırt statickendi durum bilgisi karşılığından yardımcı yöntemleri ihtiva eden bir sınıf. Bu bir "en iyi uygulama" değildir; bu, .NET ekibinin belirli bir sorunu çözmek için geldiği bir yoldur. Bunlar aynı kolaylıkla sahip ile gelebilir FileUtilityve Fileancak File.DoSomething()ve FileInfo.FileNamedaha iyi okumak gibi görünüyor.
Robert Harvey

1
Bunun ortak bir örüntü olduğunu belirtmek gerekir, ancak diller ve API'lar kadar farklı adlandırma kuralları vardır. Örneğin, Java'da durum bilgisi olan bir sınıfınız varsa, somut Fooolmayan bir yardımcı sınıfınız olabilir Foos. Adlandırma söz konusu olduğunda, önemli olan API içinde ve ideal olarak platformdaki API'ler arasında tutarlılıktır.
Kevin Krumwiede

1
Gerçekten mi? "Kimse EmployeeInfo sınıfına isim önermez" ?? KİMSE? Bu çok açık olmayan bir şey için biraz güçlü görünüyor.
ThePopMachine

@ThePopMachine "Kimse" kelimesinin bu durumda çok zor olabileceğine katılıyorum, ancak Employeeörnekler henüz çevrimiçi veya klasik kitaplarda EmployeeInfobulunmuyor , henüz görmedim (belki bir çalışan yaşayan bir varlık olduğu için değil, bağlantı veya dosya gibi teknik bir yapı). Ancak, kabul edildi, eğer sınıf EmployeeInfobir projede önerilecekse, bunun kullanılabileceğini düşünüyorum.
heltonbiker

Yanıtlar:


21

"Bilgi" nin yanlış isim olduğunu düşünüyorum. Nesnelerin durumu ve eylemleri vardır: "bilgi", halihazırda OOP'a dönüştürülmüş "durum" için başka bir addır.

Burada gerçekten neyi modellemeye çalışıyorsunuz? Diğer kodun kullanabilmesi için yazılımdaki donanımı temsil eden bir nesneye ihtiyacınız vardır.

Söylemesi kolay ama öğrendiğiniz gibi bundan daha fazlası var. "Donanımı temsil etmek" şaşırtıcı derecede geniştir. Bunu yapan bir nesnenin birkaç endişesi vardır:

  • USB arabirimi, seri bağlantı noktası, TCP / IP veya tescilli bağlantıyla konuşurken düşük seviye cihaz iletişimi.
  • Devlet yönetimi. Cihaz açık mı? Yazılımla konuşmaya hazır mısınız? Meşgul?
  • Olayları işleme. Cihaz veri üretti: şimdi ilgilenen diğer sınıflara geçmek için etkinlikler oluşturmamız gerekiyor.

Sensörler gibi bazı aygıtların yazıcı / tarayıcı / faks çok işlevli aygıtından daha az endişe olacaktır. Bir sensör muhtemelen sadece biraz akış üretirken, karmaşık bir cihaz karmaşık protokollere ve etkileşimlere sahip olabilir.

Her neyse, özel sorunuza geri dönersek, özel gereksinimlerinize ve donanım etkileşiminin karmaşıklığına bağlı olarak bunu yapmanın birkaç yolu vardır.

Bir sıcaklık sensörü için sınıf hiyerarşisini nasıl tasarlayacağımın bir örneği:

  • ITemperatureSource: sıcaklık verisi üretebilecek her şeyi temsil eden arayüz: bir sensör, bir dosya sarıcı veya sabit kodlu veri bile olabilir (düşün: sahte test).

  • Acme4680Sensör: ACME model 4680 sensörü (Roadrunner yakında olduğunda tespit etmek için mükemmeldir). Bu, birden fazla arabirim uygulayabilir: belki de bu sensör hem sıcaklığı hem de nemi algılar. Bu nesne, "sensör bağlı mı?" Gibi program düzeyinde bir durum içeriyor. ve "son okuma neydi?"

  • Acme4680SensorComm: yalnızca fiziksel cihazla iletişim kurmak için kullanılır . Çok fazla devleti korumaz. Mesaj göndermek ve almak için kullanılır. Donanımın anladığı her mesaj için bir C # yöntemi vardır.

  • HardwareManager: cihazları almak için kullanılır. Bu aslında örnekleri önbelleğe alan bir fabrika: her donanım cihazı için bir cihaz nesnesinin yalnızca bir örneği olmalıdır. A ipliği ACME sıcaklık sensörünü talep ederse ve B ipliği ACME nem sensörünü isterse bunların aslında aynı nesne olduğunu ve her iki dişe de geri döndürülmesi gerektiğini bilecek kadar akıllı olmalıdır.


En üst düzeyde, her bir donanım türü için arayüzlere sahip olacaksınız. C # kodunuzun C # veri türlerini (örn. Ham aygıt sürücüsünün kullanabileceği bayt dizileri değil) kullanarak aygıtlarda gerçekleştireceği işlemleri açıklarlar.

Aynı düzeyde, her donanım türü için bir örnek içeren bir numaralandırma sınıfınız vardır. Sıcaklık sensörü bir tip, nem sensörü başka bir tip olabilir.

Bunun altında bir seviye, bu arayüzleri uygulayan gerçek sınıflardır: yukarıda tarif edilen Acme4680Sensör I'e benzer bir cihazı temsil ederler. Aygıt birden çok işlevi yerine getirebiliyorsa, belirli bir sınıf birden çok arabirim uygulayabilir.

Her aygıt sınıfının, donanımla konuşmanın düşük düzeyli görevini gerçekleştiren kendi özel Comm (iletişim) sınıfı vardır.

Donanım modülünün dışında görünen tek katman arabirimler / enum artı HardwareManager'dır. HardwareManager sınıfı, aygıt sınıflarının örneğini, önbellek örneklerini ( gerçekten aynı donanım aygıtıyla konuşurken iki aygıt sınıfının olmasını istemezsiniz) vb . İşleyen fabrika soyutlamasıdır . Belirli bir sensör türüne ihtiyaç duyan bir sınıf, HardwareManager'dan belirli numaralandırma için cihaz, daha sonra zaten somutlaştırılmış olup olmadığını, nasıl yaratılacağı ve başlatılacağı vb.

Burada amaç etmektir Decouple düşük seviyeli donanım mantıktan iş mantığı. Sensör verilerini ekrana yazdıran bir kod yazarken, bu kod, ne tür bir sensörünüz olduğunu ve yalnızca bu donanım arayüzleri üzerinde merkezlenen bu ayırma işleminin mevcut olup olmadığını önemsememelidir .


Bu cevapta açıklanan tasarımı gösteren UML sınıfı diyagram örneği

Not: şema ok çorbasına dönüşeceği için HardwareManager ile çizmediğim her aygıt sınıfı arasında ilişkilendirmeler vardır.


Çok ilginç bir cevap. Hızlı bir düzenleme isteyebilirim: bahsettiğiniz dört sınıf arasındaki miras / çevreleme / işbirliği nedir daha açık bırakın. Çok teşekkür ederim!
heltonbiker

Bir UML sınıf diyagramı ekledim. Bu yardımcı olur mu?

2
Bunun katil bir cevap olduğunu söyleyebilirim , ve bu sadece bana çok yardımcı olmayacak, ama gelecekte çok daha fazla insana yardımcı olabileceğine inanıyorum. Ayrıca, sağladığınız sınıf hiyerarşisi örneği sorunumuzu ve çözüm alanlarımızı oldukça iyi bir şekilde eşler. Tekrar çok teşekkür ederim!
heltonbiker

Daha fazla şey olduğunu fark ettiğim soruyu okuduğumda, biraz aşırıya kaçtım ve tüm tasarımı paylaştım. Bu basit bir adlandırma probleminden daha fazlasıdır, çünkü isimler tasarımın göstergesidir. Bu şekilde yapılmış sistemler ile çalıştım ve oldukça iyi çalıştılar.

11

Burada tek bir birleştirici kural bulmak biraz zor olabilir, çünkü bu sınıflar bir dizi isim alanına yayılmıştır ( ConnectionInfoiçeride CrystalDecisionsve DeviceInfoiçeride System.Reporting.WebForms).

Ancak bu örneklere baktığımızda, son ekin iki farklı kullanımı var gibi görünüyor:

  • Örnek yöntemler sağlayan bir sınıfla statik yöntemler sağlayan bir sınıfı ayırt etme. System.IOTanımları ile altı çizildiği gibi , sınıflar için durum böyledir :

    Dizin :

    Dizinler ve alt dizinler aracılığıyla oluşturma, taşıma ve numaralandırma için statik yöntemleri ortaya koyar. Bu sınıf devralınamaz.

    DirectoryInfo :

    Dizinler ve alt dizinler aracılığıyla oluşturma, taşıma ve numaralandırma için örnek yöntemleri ortaya koyar. Bu sınıf devralınamaz.

    Infoburada biraz garip bir seçim gibi görünüyor, ancak farkı nispeten netleştiriyor: bir Directorysınıf makul bir şekilde belirli bir dizini temsil edebilir veya herhangi bir durumu tutmadan genel dizinle ilgili yardımcı yöntemler DirectoryInfosağlayabilirken, sadece gerçekten eski olabilir.

  • Sınıfın yalnızca bilgi tuttuğunu ve son ekli addan makul şekilde beklenebilecek davranış sağlamadığını vurgulamak .

    O cümlenin son kısmı, farklılaşacaktır, demek ki bulmacanın parçası olabileceğini düşünmek ConnectionInfodan EmployeeInfo. Eğer denilen bir sınıfım Connectionolsaydı, bana gerçekten bir bağlantının sahip olduğu işlevselliği sağlamasını beklerdim - void Open()vb. Yöntemler arardım . Ancak, sağ akıllarında hiç kimse bir Employeesınıfın aslında gerçek ne Employeeyapar, ya da benzeri yöntemler aramaya void DoPaperwork()veya bool TryDiscreetlyBrowseFacebook().


1
Cevabınız için çok teşekkür ederim! Cevabınızdaki ilk merminin kesinlikle .NET sınıflarında neler olduğunu açıkladığını düşünüyorum, ancak ikincisinin daha fazla değeri var (ve bu arada farklı), çünkü amaçlanan soyutlamayı daha iyi ortaya koyuyor: kullanılacak bir şey vs. tarif edilecek bir şey. Hangi cevabın kabul edileceğini seçmek zordu.
heltonbiker

4

Genel olarak, bir Infonesne zaman içinde bir nesnenin durumu hakkında bilgi içerir . Sistemden bir dosyaya bakmasını FileInfove boyutuyla ilişkili bir nesneyi vermesini istersem, bu nesnenin, istek verildiğinde (veya daha kesin olarak, boyutunda) dosyanın boyutunu bildirmesini beklerim. aramanın yapıldığı zaman ve geri döndüğü zaman arasındaki dosya). Dosyanın boyutu zamanında isteği döner ve zaman arasındaki değişirse FileInfonesne incelendiğinde, ben ederim değil böyle bir değişiklik yansıtılması bekliyoruz FileInfonesne.

Bu davranışın bir Filenesnenin davranışından çok farklı olacağını unutmayın . Bir disk dosyasını özel olmayan modda açma isteği Filebir Sizeözelliğe sahip bir nesne verirse , disk dosyasının boyutu değiştiğinde döndürülen değerin değişmesini beklerim, çünkü Filenesne yalnızca durumunu göstermez bir dosya - dosyanın kendisini temsil eder .

Çoğu durumda, bir kaynağa iliştirilen nesnelerin hizmetleri artık gerekli olmadığında temizlenmesi gerekir. Çünkü *Infonesneler kaynaklara takmak yok, temizleme gerektirmez. Sonuç olarak, bir Infonesnenin bir istemcinin gereksinimlerini karşılayacağı durumlarda , temel kaynağı temsil eden, ancak bu kaynakla olan bağlantısının temizlenmesi gereken bir nesneyi kullanmaktan ziyade kod kullanmak daha iyi olabilir.


1
Bu tam yanlış değil, ama beri, pek de iyi .NET'in adlandırma desenleri açıklamaya görünmüyor Filesınıf örneği ve olamaz FileInfonesneleri yapmak altta yatan dosya sistemi ile güncelleme.
Nathan Tuggy

@NathanTuggy Bunun, .NET'teki bu adlandırma kuralıyla iyi bir şekilde ilgili olmadığını kabul ediyorum, ancak mevcut sorunumla ilgili olarak, bunun çok alakalı olduğuna ve tutarlı bir çözüm oluşturabileceğine inanıyorum. Bu cevabı iptal ettim, ancak kabul etmek için sadece birini seçmek zor ...
heltonbiker

@NathanTuggy: .NET'in herhangi bir tutarlılık modeli olarak kullanılmasını önermem. Çok iyi fikirleri kapsayan iyi ve kullanışlı bir Çerçeve, ancak karışımda da birkaç kötü fikir yakalanıyor.
supercat

@supercat: Tabii; ".NET neden bu şeyi yapıyor?" "% THIS_WAY% şeyleri yapmak iyi bir fikir olacaktır".
Nathan Tuggy

@NathanTuggy: Söz konusu sınıfların ayrıntılarını tam olarak hatırlamıyordum, ancak FileInfostatik olarak yakalanmış bilgiler olduğunu düşündüm . Öyle değil mi? Ayrıca, dosyaları özel olmayan modda açmak için hiç fırsatım olmadı, ancak mümkün olmalı ve açılışta kullanılan nesne olmasa bile bir dosyanın geçerli boyutunu bildirecek bir yöntem olmasını beklerdim. denilen File(normalde sadece kullanmak ReadAllBytes, WriteAllBytes, ReadAllText, WriteAllText, vb.)
supercat

2

Gerçek cihazlar (sensörler ve alıcılar) bir şey ve onların yazılımda temsil başka bir şey göz önüne alındığında , ben bazı sınıfları "Bilgi" soneki ad desen ile adlandırmayı düşünüyorum.

Örneğin, a Sensor, gerçek sensörü temsil eden bir sınıf olsa da (gerçekte bazı çalışma cihazlarına bağlandığında), SensorInfosadece bu sensörün özelliklerini temsil etmek için kullanılır. Örneğin, dosya kaydetme üzerine, mantıklı bile olmayan bir tür SensorInfoserileştirmek yerine, dosya başlığına serileştiririm Sensor.

Bu ayrımı sevmiyorum. Tüm nesneler "yazılımda temsil [ler] dir. "Nesne" kelimesinin anlamı budur.

Şimdi, bir çevre birimi hakkındaki bilgileri, çevre birimiyle arayüz oluşturan gerçek koddan ayırmak mantıklı olabilir. Bu nedenle, örneğin, Sensör, donanım değişkenine ihtiyaç duymayan bazı yöntemlerle birlikte örnek değişkenlerinin çoğunu içeren bir SensorInfo öğesine sahipken, Sensor sınıfı fiziksel sensörle etkileşime girmekten sorumludur. Sen-a yok SensorBilgisayarınız bir sensör sahip olmadıkça, ancak makul bir şekilde var-bir olabilir SensorInfo.

Sorun şu ki, bu tür bir tasarım (neredeyse) herhangi bir sınıfa genelleştirilebilir. Bu yüzden dikkatli olmalısın. SensorInfoInfoMesela bir dersiniz olmazdı . Eğer bir Sensordeğişkeniniz varsa , üyesiyle etkileşime girerek kendinizi Demeter yasasını ihlal ederken bulabilirsiniz SensorInfo. Elbette bunların hiçbiri ölümcül değildir, ancak API tasarımı sadece kütüphane yazarları için değildir. Kendi API'nizi temiz ve basit tutarsanız, kodunuz daha sürdürülebilir olur.

Dizinler gibi dosya sistemi kaynakları bence bu kenara çok yakın. Yerel olarak erişilemeyen, doğru olmayan bir dizini tanımlamak istediğiniz bazı durumlar vardır, ancak ortalama geliştirici muhtemelen bu durumlardan birinde değildir. Sınıf yapısını bu şekilde karmaşıklaştırmak bana göre yararsızdır. Kontrast Python'un yaklaşımı pathlib: "Büyük olasılıkla ihtiyacınız olan şey" olan tek bir sınıf ve çoğu geliştiricinin güvenle göz ardı edebileceği çeşitli yardımcı sınıflar vardır. Bununla birlikte, gerçekten onlara ihtiyacınız varsa, sadece aynı yöntemleri sağlarlar, sadece somut yöntemlerle çıkarılırlar.


Cevabınız için teşekkürler ve "have-a" yapınız için kudos;) Cevabınız bana bazılarının "DTO" (Veri Aktarım Nesnesi) kavramı - veya onun kaşlarını çatmış Parametre Nesnesini - neden olduğu rahatsızlığı hatırlatıyor daha ortodoks OO zealotları tarafından genellikle yöntem içermediği için (sonuçta bir veri aktarım nesnesidir). Bu anlamda ve başkalarının söylediklerini de özetleyerek, bunun bir SensorInfotür DTO olacağını ve / veya gerçek Sensornesnenin yalnızca veri / durum bölümünü temsil eden bir "anlık görüntü" ve hatta bir "spec" olacağını düşünüyorum. "orada bile olmayabilir".
heltonbiker

Çoğu tasarım sorununda olduğu gibi, zor ve hızlı bir kural yoktur. Sağladığım pathlib örneğinde, PureWindowsPathbir Bilgi nesnesi gibi davranıyor, ancak Windows sistemi gerektirmeyen şeyler yapmak için yöntemlere sahip (örneğin bir alt dizini almak, bir dosya uzantısını bölmek, vb.). Bu sadece yüceltilmiş bir yapı sağlamaktan daha yararlıdır.
Kevin,

1
Yine, "yüceltilmiş yapı" bölümü için kudos :). Bu bana Bob Amca'nın "Temizlik Kodu" kitabındaki ilgili alıntıyı hatırlatıyor, Bölüm 6: "Olgun programcılar, her şeyin bir nesne olduğu fikrinin bir efsane olduğunu bilirler. Bazen gerçekten üzerinde işlem yapan basit veri yapıları istersiniz."
heltonbiker

2

Bağlam / etki alanının önemli olduğunu söyleyebilirim, çünkü üst düzey iş mantığı kodu ve düşük düzey modelleri, mimari bileşenleri vb ...

'Bilgi', 'Veri', 'Yönetici', 'Nesne', 'Sınıf', 'Model', 'Denetleyici' vb. bu bilgi gerekli değildir.

Ticari alanın sınıf adları, kulağa garip gelse veya% 100 doğru dil olmasa da, tüm paydaşların bu konuda konuştuğu gibi olmalıdır.

Veri yapıları için iyi son ekler örneğin 'Liste', 'Harita' ve gerekli olduğunu düşünüyorsanız 'Dekoratör', 'Bağdaştırıcı' desenleri içindir.

Sensör senaryosuna göre, sensörünüzün SensorInfone olduğunu kaydetmeyi beklemiyordum , ama SensorSpec. Infoimho daha çok türetilmiş bir bilgidir, örneğin FileInfoboyut, kaydetmediğiniz veya yol ve dosya adından oluşturulan dosya yolu gibi bir şeydir.

Başka bir nokta:

Bilgisayar Bilimlerinde sadece iki zor şey vardır: önbellek geçersiz kılma ve şeyleri adlandırma.

- Phil Karlton

Bu bana her zaman sadece birkaç saniyeliğine bir isim düşünmeyi hatırlatıyor ve eğer bir şey bulamazsam, garip isimler kullanıyorum ve 'TODO' ile işaretliyorum. IDE'im yeniden düzenleme desteği sağladığı için bunu daha sonra değiştirebilirim. İyi olması gereken bir şirket sloganı değil, ancak her istediğimizde değiştirebileceğimiz bazı kodlar. Bunu aklınızda bulundurun.


1

ThingInfo, Şey için harika bir salt okunur Proxy olarak kullanılabilir.

bkz. http://www.dofactory.com/net/proxy-design-pattern

Proxy: "Başka bir nesnenin ona erişimi kontrol etmesi için bir vekil veya yer tutucu sağlayın."

Genellikle ThingInfo, ayarlayıcı içermeyen genel özelliklere sahip olacaktır. Bu sınıfların ve sınıftaki yöntemlerin kullanımı güvenlidir ve yedekleme verilerinde, nesnede veya diğer nesnelerde herhangi bir değişiklik yapmayacaktır. Hiçbir durum değişikliği veya başka yan etki meydana gelmez. Bunlar, raporlama ve web hizmetleri için veya nesne hakkında bilgiye ihtiyaç duyduğunuz ancak asıl nesnenin kendisine erişimi sınırlamak istediğiniz herhangi bir yerde kullanılabilir.

Mümkün olduğunda ThingInfo'yu kullanın ve gerçek Thing'in kullanımını gerçekten Thing nesnesini değiştirmeniz gereken zamanlarla sınırlayın. Bu kalıbı kullanmaya alıştığınızda okuma ve hata ayıklamayı çok daha hızlı hale getirir.


Mükemmel. Bugün daha önce, soruda kullandığım sınıflarla ilgili olarak mimari ihtiyaçlarımı analiz ediyordum ve aynı sonuca vardım. Benim durumumda, Receiverbirçok Sensors'den veri akışı alan bir var . Fikir: alıcı gerçek sensörleri soyutlamalıdır. Ama sorun şu: Sensör bilgisine ihtiyacım var, böylece onları bazı dosya başlıklarına yazabilirim. Çözüm: her birinin IReceiverbir listesi olacaktır SensorInfo. Alıcıya sensör durumunu değiştiren komutlar gönderirsem, bu değişiklikler ilgili alana (alıcıdan) yansıtılır SensorInfo.
heltonbiker

(devam ...) yani: Sensörlerin kendileri ile konuşmuyorum, sadece Alıcı ile daha üst düzey komutlar aracılığıyla konuşuyorum ve Alıcı da Sensörlerin her biri ile konuşuyor. Ama sonunda alıcı örneğinden List<SensorInfo>salt okunur özelliği aracılığıyla aldığım sensörlerden bilgiye ihtiyacım var .
heltonbiker

1

Şimdiye kadar bu sorudaki hiç kimse bu isimlendirme sözleşmesinin gerçek nedenini almamış görünüyor.

Bir DirectoryInfodeğil dizin. Öyle bir veri ile DTO hakkında dizine. Aynı dizini tanımlayan pek çok örnek olabilir. Bu bir varlık değildir. Bu bir atış değeri nesnesidir. A , gerçek dizini temsil etmez. Bunu bir dizin için tanıtıcı veya denetleyici olarak da düşünebilirsiniz.DirectoryInfo

Bunu adlandırılmış bir sınıfla karşılaştırın Employee. Bu bir ORM varlık nesnesi olabilir ve bu çalışanı tanımlayan tek nesnedir. Eğer kimliği olmayan bir değer-nesne ise çağrılmalıdır EmployeeInfo. Bir Employeegerçekten gerçek çalışanı temsil ediyor. Çağrılan bir değer benzeri DTO sınıfı EmployeeInfo, çalışanı açıkça temsil etmez, daha ziyade onu tanımlar veya bu konuda veri depolar.

Aslında BCL'de her iki sınıfın da bulunduğu bir örnek vardır: A ServiceController, bir Windows Hizmetini tanımlayan bir sınıftır. Her hizmet için bu türden herhangi bir sayıda denetleyici olabilir. Bir ServiceBase(ya da türetilmiş bir sınıfı) olan fiili hizmet ve kavramsal olarak farklı hizmet başına bunun birden çok örneği için mantıklı değildir.


Bu Proxy@Shmoken tarafından bahsedilen desene benziyor, değil mi?
heltonbiker

@heltonbiker mutlaka vekil olmak zorunda değildir. Açıkladığı şeye hiçbir şekilde bağlı olmayan bir nesne olabilir. Örneğin EmployeeInfo, bir web servisinden bir alabilirsiniz . Bu bir vekil değil. Daha örnek: Bir AddressInfobile gelmez sahip bir adres bir varlık olmadığı için vekil can birşey. Bu tek başına bir değerdir.
usr

1
Anlıyorum!
heltonbiker
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.