2013-02-08 15 views
6

Oldukça büyük bir ürün üzerinde çalışıyorum. .Net 1.0 hala devam eden bir çalışmadı ve bu yüzden çok sayıda kötü kalite koduna sahipti ve ünite testleri ile yazılmamıştı. Şimdi kaliteyi geliştirmeye çalışıyoruz ve her özellik ve hata düzeltmesi için testler uyguluyoruz. Şu an yaşadığımız en büyük sorunlardan biri bağımlılık cehennem ve tanrı nesneler. Özellikle bir tanrı nesnesi var, bu kötü: Session. Temel olarak, programın mevcut oturumu ile ilgili herhangi bir şey bu nesnede. Başka birkaç tanrı nesnesi de var. Her neyse, bu tanrı nesnesini Resharper'ı kullanarak "alay edilemez" hale getirdik. Bununla birlikte, bu hala test etmeyi zorlaştırır çünkü çoğu zaman 100 farklı yöntem ve özellikten uzak durmanın neye ihtiyaç duyduğunu anlamak için yazdığınız koda bakmanız gerekir.Tanrısal nesnelerin parçalanması için arabirim mirası?

Sadece bu sınıfa ayırmak şu anda soruların dışındadır çünkü bu sınıfa binlerce referans olmasa bile yüzlerce kelimenin tam anlamı vardır.

Çünkü bir arabirimim var (ve hemen hemen tüm kod arabirimi kullanmak için yeniden kodlanmıştır), ilginç bir fikrim vardı. ISession arayüzünü diğer arayüzlerden miras bıraktıysam ne olur? güncelleştirilmesi olmazdı ISession kullanarak kod mevcut, bu sayede

interface IBar 
{ 
    string Baz{get;set;} 
} 

interface IFoo 
{ 
    string Biz{get;set;} 
} 

interface ISession: IFoo, IBar 
{ 
} 

, ne de fiili uygulama güncellenmesi var: Biz böyle bir şey olsaydı Örneğin

. Ancak, yeni kodda yazdığımız ve yeniden düzenleyeceğimiz daha ayrıntılı IFoo veya IBar arayüzlerini kullanabiliyoruz, ancak bir İdaleye geçebiliyoruz.

Ve sonunda, ben muhtemelen daha kolay sonunda size Şimdi asıl ISession ve Oturum tanrı arayüzü/nesne

kırmak için yapım görüyoruz. Bu, bu tanrı nesnelerine karşı test etmenin ve sonunda onları kırmanın iyi bir yolu mu? Bu belgelenmiş bir yaklaşım ve/veya tasarım deseni mi? Hiç böyle bir şey yaptın mı?

+3

+1: Adım adım refactoring yapmak için mantıklı bir yol gibi geliyor. –

+0

Eğer kontrol etmediyseniz, Michael Feathers'ın [http://amzn.com/B005OYHF0A], [Legacy Code With Legacy Code ile Çalışıyor] değerli olduğunu kanıtlayabilir. Test altında böyle bir proje oluşturmanıza yardımcı olacak birçok strateji içerir. Birçoğu apaçık, ama onları baskıda görmek size zorlamak ve bunu yapmak için güven verir. –

+1

@AnthonyPegram aslında benim liste – Earlz

cevap

6

Benim bakış açımdan bu iyi ve doğru bir yaklaşımdır. Daha sonra, ISession yerine IFoo/IBar gibi daha spesifik hizmet örneklerini de enjekte edebilirsiniz, bunun bir tanrı sınıfından birçok özel hizmete ders çıkarmak için daha iyi bir değişiklik yapmadan önce iyi bir ara adım olduğunu söyleyebilirim.

Bazı uzmanları görüyorum:

İlk aşama:

  • Bir süper (tanrı) sınıfı tipi
  • Kod az bütünleşmiş olacaktır arayüzleri tarafından çekilen edilir özü arayüzleri

    tek fonksiyonu dayanır beri sorumlu arabirimler (hizmetler)
  • Daha ileriye taşınmak ve bir tanrı sınıfını çok sayıda hizmete bölmek zorundasınız. API

İkinci aşama: akılda Single Responsibility principle tutulması ile birçok küçük hizmetlerine bir tanrı sınıfını bölmek

Üçüncü aşama: Birlikte etrafında tümünden ziyade hizmet tipine göre gruplandırılmış testler böylece yapılandırılmakta mevcut birim testleri Bir tanrı sınıfı