1. Statik ve örnek
Bence iyi OO tasarımı ve neyin olmadığı konusunda çok açık yönergeler var. Sorun, blogosferin iyiyi kötü ve çirkinden ayırmayı zorlaştırmasıdır. Sen bulabilirsiniz bazı aklınıza gelebilecek hatta en kötü uygulamayı kaldırdı referans tür.
Ve aklıma gelen en kötü uygulama, bahsettiğiniz statikler ve herkesin en sevdiği Singleton da dahil olmak üzere Küresel Devlettir. Misko Hevery'nin konuyla ilgili klasik makalesinden bazı alıntılar .
Bağımlılıkları gerçekten anlamak için, geliştiricilerin her kod satırını okuması gerekir. Uzakta Ürkütücü Harekete neden olur: test paketlerini çalıştırırken, bir testte mutasyona uğramış genel durum, sonraki veya paralel testin beklenmedik şekilde başarısız olmasına neden olabilir. Manuel veya Guice bağımlılığı enjeksiyonu kullanarak statik bağımlılığı kırın.
Uzaktaki Ürkütücü Eylem, izole olduğuna inandığımız bir şeyi yürüttüğümüzde (herhangi bir referans geçmediğimizden), ancak nesneye bahsetmediğimiz sistemin uzak konumlarında beklenmedik etkileşimler ve durum değişiklikleri meydana gelir. Bu sadece küresel devlet aracılığıyla olabilir.
Daha önce bu şekilde düşünmemiş olabilirsiniz, ancak statik durumu her kullandığınızda gizli iletişim kanalları oluşturuyorsunuz ve API'da netleştirmiyorsunuz. Uzaktaki Ürkütücü Eylem, geliştiricileri potansiyel etkileşimleri anlamak için her kod satırını okumaya zorlar, geliştirici verimliliğini azaltır ve yeni ekip üyelerini karıştırır.
Bunun kaygılanması, bir çeşit depolanmış durumu olan herhangi bir şeye statik referanslar vermemenizdir. Statiği kullandığım tek yer numaralandırılmış sabitler içindir ve bu konuda bile endişelerim var.
2. Giriş parametreleri ve dönüş değerleri olan yöntemler ve hiçbiri olmayan yöntemler
Fark etmeniz gereken şey, giriş parametresi ve çıkış parametresi olmayan yöntemlerin dahili olarak depolanmış bir durumda çalıştığı garantilidir (aksi halde ne yapıyorlar?). Orada tüm diller saklanan durumu engellenmiş fikri üzerine inşa edilmiştir.
Durumunuzu her kaydettiğinizde, yan etki olasılığınız vardır, bu nedenle her zaman dikkatli bir şekilde kullandığınızdan emin olun. Bu, tanımlı giriş ve / veya çıkışlara sahip işlevleri tercih etmeniz anlamına gelir .
Aslında, girişleri ve çıkışları tanımlayan işlevleri test etmek çok daha kolaydır - burada bir işlev çalıştırmanız ve ne olduğunu görmek için oraya bakmanız gerekmez ve bir yerde bir özellik ayarlamanız gerekmez test edilen fonksiyonu çalıştırmadan önce.
Bu tür işlevleri güvenli bir şekilde statik olarak da kullanabilirsiniz. Ancak, yapmazdım, çünkü daha sonra yeni uygulama ile farklı bir örnek sunmak yerine, bir yerde bu işlevin biraz farklı bir uygulamasını kullanmak istersem, işlevselliği değiştirmenin hiçbir yolu yoktu.
3. Çakışan ve Farklı
Soruyu anlamıyorum. Örtüşen 2 yöntemde avantaj ne olur?
4. Özel ve Kamu
Maruz kalmanıza gerek olmayan hiçbir şeyi ifşa etmeyin. Ancak ben de özel bir hayran değilim. C # geliştiricisi değilim, ActionScript geliştiricisiyim. Adobe'nin 2007 dolaylarında yazılan Flex Framework kodunda çok zaman geçirdim. Ve ne özel yapmak için bazı kötü seçimler yaptılar, bu da Sınıflarını genişletmeye çalışan bir kabus yapıyor.
Bu nedenle, 2007'deki Adobe geliştiricilerinden daha iyi bir mimar olduğunuzu düşünmüyorsanız (sorunuzdan, bu iddiayı yapma şansınız olmadan birkaç yılınız olduğunu söyleyebilirim), muhtemelen varsayılan olarak korunmak istersiniz .
Kod örneklerinizde iyi tasarlanmış olmadıkları anlamına gelen bazı sorunlar vardır, bu nedenle A veya B'yi seçmek mümkün değildir.
Bir kere, muhtemelen nesne yaratımınızı kullanımından ayırmalısınız . Yani genellikle new XMLReader()
nerede kullanıldığının yanında hakkınız olmazdı .
Ayrıca, @djna'nın dediği gibi, XML Okuyucunuzda kullanılan yöntemleri kapsüllemelisiniz, böylece API'niz (örnek örneği) aşağıdakiler için basitleştirilebilir:
_document Document = reader.read(info);
C # nasıl çalıştığını bilmiyorum, ancak bir dizi web teknolojisi ile çalıştığımdan, her zaman hemen bir XML belgesi döndüremeyeceğinizden şüphelenirim (belki bir söz veya gelecek türü hariç) ), ancak C # 'da bir Asenkron yükün nasıl ele alınacağı konusunda size tavsiyede bulunamam.
Bu yaklaşımla, bir XML nesnesinin nerede / ne okunacağını / döndürüleceğini söyleyen bir parametre alabilen ve proje gereksinimlerinize göre bunları değiştirebileceğiniz birkaç uygulama oluşturabileceğinizi unutmayın. Örneğin, doğrudan bir veritabanından, yerel bir mağazadan veya orijinal örneğinizde olduğu gibi bir URL'den okuyor olabilirsiniz. Statik bir yöntem kullanıyorsanız bunu yapamazsınız.