Arka fon
Devam eden bir C # projesi üzerinde çalışıyorum. Ben bir C # programcı, öncelikle bir C ++ programcısı değilim. Bu yüzden temelde kolay ve yeniden düzenleyici görevler atandım.
Kod bir karmaşa. Bu büyük bir proje. Müşterimiz yeni özellikler ve hata düzeltmeleri ile sık sık yayınlanmasını istediğinden, diğer tüm geliştiriciler kodlama sırasında kaba kuvvet yaklaşımı almak zorunda kaldılar. Kod son derece sürdürülemez ve diğer tüm geliştiriciler buna katılıyor.
Doğru yapıp yapmadıklarını tartışmak için burada değilim. Yeniden düzenleme yaptığım için, yeniden düzenlenmiş kodum karmaşık göründüğü için doğru şekilde yapıyorum mu merak ediyorum! İşte basit örnek olarak görevim.
Sorun
Altı sınıfları vardır: A
, B
, C
, D
, E
ve F
. Tüm sınıfların bir işlevi vardır ExecJob()
. Altı uygulamanın hepsi çok benzer. Temel olarak, ilk başta A::ExecJob()
yazıldı. Ardından B::ExecJob()
, kopyala-yapıştır modifikasyonu ile uygulanan biraz farklı bir sürüm gerekli oldu A::ExecJob()
. Başka bir biraz farklı versiyon gerektiğinde, C::ExecJob()
yazıldı vb. Altı uygulamanın hepsinde bazı ortak kodlar, sonra bazı farklı kod satırları, sonra tekrar bazı ortak kodlar vb. Vardır. Uygulamalara basit bir örnek:
A::ExecJob()
{
S1;
S2;
S3;
S4;
S5;
}
B::ExecJob()
{
S1;
S3;
S4;
S5;
}
C::ExecJob()
{
S1;
S3;
S4;
}
SN
Tam olarak aynı ifadelerden oluşan bir grup nerede .
Onları ortak yapmak için başka bir sınıf oluşturdum ve ortak kodu bir işlevde taşıdım. Hangi ifade grubunun yürütülmesi gerektiğini denetlemek için parametre kullanma:
Base::CommonTask(param)
{
S1;
if (param.s2) S2;
S3;
S4;
if (param.s5) S5;
}
A::ExecJob() // A inherits Base
{
param.s2 = true;
param.s5 = true;
CommonTask(param);
}
B::ExecJob() // B inherits Base
{
param.s2 = false;
param.s5 = true;
CommonTask(param);
}
C::ExecJob() // C inherits Base
{
param.s2 = false;
param.s5 = false;
CommonTask(param);
}
Bu örnekte yalnızca üç sınıf ve basitleştirilmiş ifadeler kullanıldığını unutmayın. Pratikte, CommonTask()
fonksiyon tüm bu parametre kontrolleri ile çok karmaşık görünüyor ve daha birçok ifade var. Ayrıca, gerçek kodda, birkaç CommonTask()
görünümlü işlevler vardır.
Tüm uygulamalar ortak kod paylaşıyor ve ExecJob()
işlevler şirin görünüyor, ancak beni rahatsız eden iki sorun var:
- Herhangi bir değişiklik için
CommonTask()
altı özelliğin de (ve gelecekte daha fazla olabilir) test edilmesi gerekir. CommonTask()
zaten karmaşık. Zamanla daha karmaşık hale gelecektir.
Doğru şekilde mi yapıyorum?