Java'da yazılmış, çok karmaşık gerçek dünyadaki iş nesnelerine karşılık gelen bazı sınıflarımız olan dağıtılmış bir sistem projesindeyim. Bu nesneler, kullanıcının (veya başka bir ajanın) söz konusu nesnelere uygulayabileceği eylemlere karşılık gelen birçok yöntem içerir. Sonuç olarak, bu sınıflar çok karmaşık hale geldi.
Sistem genel mimari yaklaşımı, birkaç sınıfa odaklanan birçok davranışa ve birçok olası etkileşim senaryosuna yol açmıştır.
Örnek olarak ve işleri kolay ve net tutmak için Robot ve Araba'nın projemde sınıf olduğunu varsayalım.
Yani, Robot sınıfında aşağıdaki modelde birçok yöntemim olurdu:
- uyku(); isSleepAvaliable ();
- uyanık(); isAwakeAvaliable ();
- (Yön) yürümek; isWalkAvaliable ();
- sürgün (Yön); isShootAvaliable ();
- turnOnAlert (); isTurnOnAlertAvailable ();
- turnOffAlert (); isTurnOffAlertAvailable ();
- () Şarj; isRechargeAvailable ();
- Kapat(); isPowerOffAvailable ();
- stepInCar (Car); isStepInCarAvailable ();
- stepOutCar (Car); isStepOutCarAvailable ();
- kendini imha(); isSelfDestructAvailable ();
- ölmek(); isDieAvailable ();
- yaşıyor(); isAwake (); isAlertOn (); getBatteryLevel (); getCurrentRidingCar (); getAmmo ();
- ...
Araba sınıfında, benzer olurdu:
- aç(); isTurnOnAvaliable ();
- kapat(); isTurnOffAvaliable ();
- (Yön) yürümek; isWalkAvaliable ();
- () Yakıt ikmali; isRefuelAvailable ();
- kendini imha(); isSelfDestructAvailable ();
- () Kilitlenmesine; isCrashAvailable ();
- isOperational (); Ison (); getFuelLevel (); getCurrentPassenger ();
- ...
Bunların her biri (Robot ve Araba), bazı eyaletlerde bazı eylemlerin mümkün olduğu ve bazılarının mümkün olmadığı bir durum makinesi olarak uygulanır. Eylemler nesnenin durumunu değiştirir. İşlem yöntemleri IllegalStateException
geçersiz bir durumda çağrıldığında atar ve isXXXAvailable()
yöntemler o sırada eylemin mümkün olup olmadığını söyler. Bazıları devletten kolayca çıkarılabilir olsa da (örneğin, uyku durumunda, uyanık mevcuttur), bazıları yoktur (ateş etmek, uyanık, canlı, cephaneye sahip olmak ve araba kullanmamak).
Ayrıca, nesneler arasındaki etkileşimler de karmaşıktır. Örneğin, Araba sadece bir Robot yolcuyu tutabilir, bu yüzden başka bir tane girmeye çalışırsa, bir istisna atılmalıdır; Araba düşerse, yolcu ölmelidir; Robot bir aracın içinde ölmüşse, arabanın kendisi iyi olsa bile dışarı çıkamaz; Robot bir arabanın içindeyse, dışarı çıkmadan başka bir tanesine giremez; vb.
Bunun sonucu, daha önce de söylediğim gibi, bu sınıflar gerçekten karmaşık hale geldi. İşleri daha da kötüleştirmek için Robot ve Araba etkileşime girdiğinde yüzlerce olası senaryo var. Ayrıca, bu mantığın çoğunun diğer sistemlerde uzak verilere erişmesi gerekir. Sonuç olarak birim testi çok zorlaştı ve bir sürü test problemimiz var, bunlardan biri kısır döngüde diğerine neden oluyor:
- Testcases kurulumları çok karmaşıktır, çünkü egzersiz yapmak için önemli ölçüde karmaşık bir dünya yaratmaları gerekir.
- Test sayısı çok fazla.
- Test paketinin çalışması birkaç saat sürer.
- Test kapsamımız çok düşük.
- Test kodu, test ettikleri koddan haftalar veya aylar sonra yazılır veya hiç yazılmaz.
- Birçok test de kırıldı, çünkü test edilen kodun gereksinimleri değişti.
- Bazı senaryolar o kadar karmaşıktır ki, kurulum sırasında zaman aşımına uğramadan başarısız olurlar (her testte bir zaman aşımı yapılandırdık, en kötü durumlarda 2 dakika uzunluğunda ve bu süre boyunca zaman aşımına uğradığında bile, sonsuz bir döngü olmamasını sağladık).
- Hatalar düzenli olarak üretim ortamına girer.
Bu Robot ve Araba senaryosu, gerçekte sahip olduğumuz şeyin aşırı basitleştirilmesidir. Açıkçası, bu durum yönetilemez. Yani, yardım ve öneriler istiyorum: 1, sınıfların karmaşıklığını azaltmak; 2. Nesnelerim arasındaki etkileşim senaryolarını basitleştirin; 3. Test süresini ve test edilecek kod miktarını azaltın.
EDIT:
Bence devlet makineleri konusunda net değildim. Robot devletler "uyku", "uyanık", "şarj", "ölü", vb ile bir devlet makinesidir. Araba başka bir devlet makinesidir.
DÜZENLEME 2: Sistemimin gerçekte ne olduğunu merak ediyorsanız, etkileşimde bulunan sınıflar Sunucu, IPAdresi, Disk, Yedekleme, Kullanıcı, Yazılım Lisansı vb. Şeylerdir. Robot ve Araba senaryosu bulduğum bir durum bu benim sorunumu açıklamak için yeterince basit olurdu.