2008-11-25 25 views
5

Kısa süre önce Boş Nesne tasarım deseninde this youtube tutorial'u izledim. İçinde bazı hatalar olsa da: NullCar gibi hiçbir şey yapmayan sonsuz bir döngü yaratır, kavram iyi açıklanmıştır. Benim sorum şu ki, null olabilecek nesneler aldıklarında ve kodunuzda kullanıldığında ne yaparsınız? Varsayılan olarak hangi değerin döneceğini nasıl bilebilirsiniz? Yoksa bu kalıbı tüm nesnelerin içinde mi uygulamalıyım? Ya ipleri veya ilkelleri iade etmem gerekirse? Java perspektifinden bahsediyorum.Boş nesne tasarımı desen sorusu

DÜZENLEME: Ben varsayılan değer testi için boş nesneler test ticareti olmayacak? Değilse neden olmasın?

cevap

4

Bildiğim kadarıyla bunu anladım olarak fikri boş nesnenin değeri mümkün olduğunca "hiçbir şey" kadar yakın olmasıdır. Bu maalesef kendinizi tanımlamanız gerektiği anlamına gelir. Örnek olarak, bir "boş" String'i geçemediğimde kişisel olarak "" kullanıyorum, benim için boş nesne numarası -1'dir (çoğunlukla varsayılan olarak çoğu veritabanı dizisi 1'den başlar ve bunları öğe kimliği için kullanırız: sa lot yani -1 Listeler/haritalar/setleri Collections.EMPTY_SET, EMPTY_MAP veya EMPTY_LIST ve benzeri ile ölü eşantiyon bu bir null nesnesidir). Eğer özel bir sınıfım varsa, null bir nesne oluşturmam gerekiyorsa, tüm gerçek verileri buradan kaldırırım ve nereden aldığımı görüyorum ve daha sonra bahsettiğim şeyi "boş" olana kadar uygularım.

Yani gerçekten sadece kendiniz karar vermek zorunda, varsayılan olarak döndürülecek değer "biliyorum" yok.

8

null Nesne amacı kodunda boş referanslara sahip kaçınmaktır. Boş Nesne alıcıları tarafından döndürülen değerler alanınıza bağlıdır. Sıfır veya boş dize genellikle uygundur.

gerçek hayata Null Nesne deseni devrik varsa, ne soruyorsun " kimse kaç yaşında? " sormak benzer. Eğer tell, don't ask ilkesini takip etmek değil göründüğü gibi

Belki tasarım geliştirilebilir. Bir nesne başka bir nesneye davranışı delege ettiğinde (genellikle Strateji veya Durum Tasarım Kalıpları gibi) Null Object design pattern, genellikle Null Object design pattern; Tom Hawtin - tackline'ın yorumladığı gibi, değerleri döndüren nesneler için Special Case Objects kullanın.

+0

Sanırım Boş Nesne şablonunun bağlamının "söyleme, sorma" türleri ile daha iyi karşılandığını yorumlamak daha doğru olur. Geri dönen türler için Özel Durum Nesneleri'ne gitme olasılığınız daha yüksektir. Muhtemelen. –

+2

Wow, programlama ipucu olarak bir zen tao ... :-) – PhiLho

2

Sıfır olabilecek nesneler aldığında ve kodunuzda kullanıldığında ne yaparsınız? Varsayılan olarak hangi değerin döneceğini nasıl bilebilirsiniz?

nasıl uygulamak için hangi sınıfları biliyoruz? Bu bir tasarım sorusudur, uygulamaya bağlıdır. Genellikle NullObject yönteminin amacını konuşan

koşullu programlama dilinin boş değere karşı bir karşılaştırma bulunmaktadır özel durumda bir Replace Conditional with Polymorphism üstlenmeden desteklemektir.

Car sınıflara driveCar yöntemi devrederek gerektirecektir video örnek doğru bir uygulanması. SlowCar ve FastCar sınıfları, muhtemelen bir temel sınıftaki paylaşılan bir uygulama aracılığıyla döngüyü gerçekleştirir ve NullCar hemen dönecektir. Java bağlamda

, NullCar.speed nitelik muhtemelen kutulanmamış int olurdu. Yani null'a ayarlamak bir seçenek değildir.Büyük olasılıkla accessor'un arkasındaki özniteliği gizlerim ve NullCar.getSpeed bir istisna artar. Bu istisnayı önlemek için bir sınava gerek duyan herhangi bir istemci kodu bunun yerine araba sınıflarına geçecektir.

doğrudan kod içinde boş desen entegrasyonu noktası olmalıdır ne philippe

0

tarafından bahsedilen nesne yönelimli tasarım Tell Don't Ask ilkesinin bir uygulamadır mevcut olan bir hız değerine bağlı tüm işlemleri devretme? Bence DAO nesneleri, bu tasarım deseninin veri tabanındaki bir nesneyi aradıkları ve basitçe geri getirdikleri fisrt seviyesi müşterisidir.

Bu nesnelerin geçersizlik denetimi, hizmet katmanında veya gerçekten erişilip kullanılmakta oldukları komut katmanındaki kodu kirletir.

Lütfen yorumunuzu yapın.

0

Aldığınız sınıfın boş nesnesini döndürmelidir. Örneğin, B sınıfının bir nesnesini döndüren bir alıcıya sahip bir A sınıfınız varsa, ilgili NullA alıcısı NullB'u döndürmelidir.