Bazı cevaplara baktım ve Google'da arama yaptım, ancak yararlı bir şey bulamadım (yani, garip yan etkileri olmaz).
Benim sorunum, soyut olarak, bir nesnem var ve üzerinde uzun bir işlem dizisi yapmam gerekiyor ; Bunu bir araba yapımı gibi bir çeşit montaj hattı olarak düşünüyorum.
Bu nesnelere Yöntem Nesneleri deneceğine inanıyorum .
Yani bu örnekte bir noktada, daha sonra installBackSeat, installFrontSeat, installWoodenInserts'i çalıştırmam gereken bir CarWithoutUpholstery'ye sahip olurdum (işlemler birbirine müdahale etmez ve hatta paralel olarak yapılabilir). Bu işlemler CarWithoutUpholstery.worker () tarafından gerçekleştirilir ve daha sonra belki cleanInsides (), verifyNoUpholsteryDefects () vb. Çalıştıracağım CarWithUpholstery olacak yeni bir nesne verir.
Tek bir fazdaki işlemler zaten bağımsızdır, yani, herhangi bir sırayla çalıştırılabilecek bir alt kümesiyle boğuşuyorum (ön ve arka koltuklar herhangi bir sırayla monte edilebilir).
Mantığım şu anda uygulamanın basitliği için Reflection kullanıyor.
Yani, bir kez CarWithoutUpholstery var, nesne kendini performSomething () denilen yöntemler için denetler. Bu noktada tüm bu yöntemleri yürütür:
myObject.perform001SomeOperation();
myObject.perform002SomeOtherOperation();
...
hataları ve şeyleri kontrol ederken. İşlem sırası iken olduğu önemsiz, ben şimdiye kadar bazı sipariş sonuçta önemli olduğunu keşfetmek durumunda lexicographic düzeni atadınız. Bu , YAGNI ile çelişir , ancak çok az maliyetli - basit bir sıralama () - ve satırda yeniden adlandırma (veya test yapmak için başka bir yöntem, örneğin bir dizi yöntem) gibi büyük bir yöntem kaydedebilir.
Farklı bir örnek
Diyelim ki bir araba inşa etmek yerine birisi hakkında bir Gizli Polis raporu derlemeliyim ve bunu Evil Overlord'a sunmalıyım . Son hedefim bir ReadyReport olacak. İnşa etmek için temel bilgileri (ad, soyadı, eş ...) toplayarak başlıyorum. Bu benim A Aşamam. Bir eş olup olmamasına bağlı olarak, daha sonra B1 veya B2 aşamalarına ilerlemem ve bir veya iki kişi üzerinde cinsellik verileri toplamam gerekebilir. Bu gece hayatı, sokak kameraları, seks shop satış makbuzları ve ne kontrol farklı Evil Minions için birkaç farklı sorgu yapılır. Ve bu böyle devam eder.
Mağdurun ailesi yoksa, GetInformationAboutFamily aşamasına bile girmeyeceğim, ancak eğer öyleyse, önce babayı, anneyi veya kardeşleri (varsa) hedeflemem önemli değildir. Ancak bunu yapamam, bu nedenle daha önceki bir aşamaya ait bir FamilyStatusCheck gerçekleştirmedim.
Her şey harika çalışıyor ...
- bazı ek işlemlere ihtiyacım olursa yalnızca özel bir yöntem eklemem gerekir,
- eğer operasyon birkaç aşamada ortak ise bir üst sınıftan miras alabilirim,
- operasyonlar basit ve bağımsızdır. Bir operasyondan şimdiye dek hiçbir değer (operasyonların başkalarının herhangi gereklidir yok , farklı bir fazda gerçekleştirilir)
- çizginin altındaki nesneler , yaratıcıları nesneleri ilk etapta bu koşulları doğrulamamış olsalar bile var olamayacakları için birçok test yapmaları gerekmez . Yani, ekleri gösterge tablosuna yerleştirirken, gösterge tablosunu temizlerken ve gösterge tablosunu doğrularken, bir gösterge panelinin gerçekten orada olduğunu doğrulamam gerekmez .
- kolay test yapılmasını sağlar. Kısmi bir nesneyi kolayca alay edebilir ve üzerinde herhangi bir yöntemi çalıştırabilirim ve tüm işlemler belirleyici kara kutulardır.
...fakat...
Tüm modülün zorunlu karmaşıklık indeksini ("N özel yöntemden daha az") aşmasına neden olan yöntem nesnelerimden birine son bir işlem eklediğimde sorun ortaya çıktı .
Meseleyi daha önce yukarıda ele aldım ve bu durumda, özel yöntemlerin zenginliğinin bir felaketin göstergesi olmadığını önerdim. Karmaşıklığı olduğunu orada, ancak operasyon çünkü orada olduğunu karmaşık ve aslında o kadar da karmaşık değil - bu sadece uzun .
Kötü Overlord örneğini kullanarak, benim sorunum Evil Overlord (aka O Reddedilmeyecek O da ) tüm diyet bilgi istedi , Diyet Kölelerinin bana restoranlar, küçük mutfak, sokak satıcıları, lisanssız sokak satıcıları, sera sorgulamak gerektiğini söylüyor sahipleri vb. ve Evil (sub) Overlord - tanıdık O Olarak Reddedilmeyecek diye bilinen - GetDietaryInformation aşamasında çok fazla sorgu gerçekleştirdiğimden şikayet ediyor.
Not : Birkaç açıdan bakıldığında bunun hiç bir sorun olmadığını biliyorum (olası performans sorunlarını göz ardı etmek vb.). Tüm bunlar, belirli bir metriğin mutsuz olduğu ve bunun için bir gerekçe olduğu.
Ne yapabileceğimi düşünüyorum
İlki dışında, tüm bu seçenekler yapılabilir ve bence savunulabilir.
- Sinsi olabileceğimi ve yöntemlerimin yarısını beyan edebileceğimi doğruladım
protected
. Ama test prosedüründeki bir zayıflığı sömürecektim ve yakalandığında kendimi haklı çıkarmanın dışında, bunu sevmiyorum. Ayrıca, bir durma aralığı ölçüsüdür. Gerekli işlem sayısı iki katına çıkarsa ne olur? Olası değil, ama sonra ne olacak? - Bu aşamayı keyfi olarak AnnealedObjectAlpha, AnnealedObjectBravo ve AnnealedObjectCharlie'ye bölebilirim ve her aşamada gerçekleştirilen işlemlerin üçte birini alabilirim. Bunun aslında bir testi geçmek dışında hiçbir faydası olmadan karmaşıklık (N-1 sınıf daha) eklediğine inanıyorum . Tabii ki bir CarWithFrontSeatsInstalled ve bir CarWithAllSeatsInstalled mantıksal olarak birbirini takip eden aşamalar olabilir. Bir Bravo yönteminin daha sonra Alpha tarafından istenmesi riski küçüktür ve iyi oynarsam daha da küçüktür. Ama hala.
- Uzaktan benzer şekilde farklı işlemleri tek bir işlemde toplayabilirim.
performAllSeatsInstallation()
. Bu sadece bir durma aralığı ölçüsüdür ve tek işlemin karmaşıklığını artırır. A ve B işlemlerini farklı bir sırayla yapmam gerekiyorsa ve bunları E = (A + C) ve F (B + D) içine paketlediysem, E ve F'yi ayırmam ve kodu karıştırmam gerekecek . - Bir dizi lambda fonksiyonunu kullanabilir ve kontrolü tamamen kaldırırım, ancak bu hantal buluyorum. Ancak bu şimdiye kadarki en iyi alternatif. Yansımasından kurtulacaktı. Sahip olduğum iki sorun, muhtemelen sadece hipotetik değil, tüm yöntem nesnelerini yeniden yazmamın istenmesi
CarWithEngineInstalled
ve bu çok iyi bir iş güvenliği olsa da, gerçekten bu kadar cazip değil; ve kod kapsamı denetleyicisinin lambdas'la ilgili sorunları var (çözülebilir ancak yine de ).
Yani...
- Hangisi benim en iyi seçeneğim?
- Düşünmediğim daha iyi bir yol var mı? ( belki de temiz gelip doğrudan bunun ne olduğunu sorsam iyi olur. )
- Bu tasarım umutsuzca kusurlu mu ve yenilgi ve hendek - bu mimari tamamen mi kabul etmeliyim? Kariyerim için iyi değil, ama kötü tasarlanmış kod yazmak uzun vadede daha iyi olur mu?
- Mevcut seçimim aslında Tek Doğru Yol mu ve daha kaliteli metrikleri (ve / veya enstrümantasyonu) kurmak için savaşmam gerekiyor mu? Bu son seçenek için referanslara ihtiyacım var ... Mırıldanırken sadece @PHB'ye el sallayamıyorum Bunlar aradığınız metrikler değil . Ne kadar kazanmak istersem de