Bir itibaren KATI ilkeler perspektif jgauffin cevabı mantıklı. Ancak, genel tasarım ilkelerini unutmamalısınız, örneğin bilgi gizleme .
Verilen yaklaşımla ilgili birkaç problem görüyorum:
- Sizin de belirttiğiniz gibi, insanlar 'new' anahtar sözcüğünü kullanmayı beklemiyorlar, oluşturulan nesne herhangi bir durumu yönetmiyorsa . Tasarımınız amacını yansıtıyor. Sınıfınızı kullanan kişiler, hangi durumu yönettiğini ve sonradan yönteme yapılan çağrıların farklı davranışlarla sonuçlanıp sonuçlanmayacağı konusunda karışık olabilir.
- Sınıfı kullanan kişinin bakış açısından içsel durum oldukça gizlidir, ancak sınıfta değişiklikler yapmak veya basitçe anlamak istediğinizde, işleri daha karmaşık hale getiriyorsunuz. Ben zaten sadece onları küçültmek için ben bölme yöntemleri ile bakın problemler hakkında çok şey yazdım sınıf kapsamına durumunu hareketli, özellikle. API'nizin daha küçük fonksiyonlara sahip olması için nasıl kullanılması gerektiğini değiştiriyorsunuz! Bu bence kesinlikle çok ileri götürüyor.
İlgili bazı referanslar
Muhtemelen ana tartışma konusu, Tek Sorumluluk İlkesinin ne kadar gerileceğine yatar . “Eğer onu bu uç noktaya götürür ve varolan bir nedeni olan sınıfları inşa edersen, sınıf başına sadece bir yöntemle sonuçlanabilir. Bu, sistemin en basit süreçler için bile geniş bir sınıf yayılımına neden olur. anlaşılması zor ve değiştirilmesi zor. "
Bu konuyla ilgili bir başka ilgili referans: "Programlarınızı tanımlanabilir bir görevi yerine getiren yöntemlere bölün. Tüm işlemleri bir yöntemde aynı soyutlama düzeyinde tutun ." - Kent Beck Key burada "aynı soyutlama seviyesi" dir. Bu genellikle yorumlandığı için “bir şey” anlamına gelmez. Bu soyutlama seviyesi tamamen sizin tasarladığınız içeriğe bağlıdır .
Peki uygun yaklaşım nedir?
Somut kullanım durumunuzu bilmeden söylemek zor. Bazen (sık sık değil) benzer bir yaklaşım kullandığım bir senaryo var. Bir veri kümesini işlemek istediğimde, bu işlevselliği tüm sınıf kapsamı için kullanılabilir yapmak istemeden. Bununla ilgili bir blog yazısı yazdım, lambdaların kapsüllemeyi nasıl daha da geliştirebileceğini . Ben de Programcılar burada konu hakkında bir soru başlamıştır . Aşağıdaki, bu tekniği nerede kullandığımın son bir örneğidir.
new TupleList<Key, int>
{
{ Key.NumPad1, 1 },
...
{ Key.NumPad3, 16 },
{ Key.NumPad4, 17 },
}
.ForEach( t =>
{
var trigger = new IC.Trigger.EventTrigger(
new KeyInputCondition( t.Item1, KeyInputCondition.KeyState.Down ) );
trigger.ConditionsMet += () => AddMarker( t.Item2 );
_inputController.AddTrigger( trigger );
} );
İçindeki çok 'yerel' kod ForEach
başka bir yerde tekrar kullanılmadığından, sadece ilgili olduğu yerde tutmaya devam edebilirim. Kodu, birbirlerine dayanan kodun güçlü bir şekilde gruplanmış olduğu şekilde özetlemek bence daha kolay okunur kılar.
Muhtemel alternatifler
- C # 'da bunun yerine uzantı yöntemlerini kullanabilirsiniz. Yani argüman üzerinde doğrudan bu 'tek şey' yöntemine geçersiniz.
- Bu işlevin aslında başka bir sınıfa ait olmadığını görün.
- Statik bir sınıfta statik bir fonksiyon yapın . Bu en muhtemel yaklaşım, aynı zamanda atıfta bulunduğunuz genel API'lerde de yansıtıldığı gibi en uygun yaklaşımdır.
bool arrayContainsSomestring = new List<string>(stringArray).Contains("somestring");
umursadığım şeylerin belirli bir bilgi parçası olduğu ve LINQ genişletme yöntemlerinin mevcut olmadığı gibi şeyler yaptığıydı. İyi çalışır veif()
çemberin içinden atlamak zorunda kalmadan bir koşulun içine uyar . Tabii ki, eğer böyle bir kod yazıyorsanız, çöp toplanmış bir dil istiyorsunuz.