Hangi tasarım modelinin bu sorunu çözmeme yardımcı olabileceğinden emin değilim.
Hangi İşçi sınıfının kullanılması gerektiğini belirleyen - Koordinatör ”adlı bir sınıfım var - tüm farklı İşçi türleri hakkında bilgi sahibi olmak zorunda kalmadan - sadece bir WorkerFactory'yi çağırıyor ve ortak IWorker arabirimi üzerinde hareket ediyor.
Daha sonra çalışmak için uygun İşçiyi ayarlar ve 'DoWork' yönteminin sonucunu döndürür.
Bu iyi oldu ... şimdiye kadar; yeni bir İşçi sınıfı için yeni bir gereksinimimiz var, "İşçiB", işini yapabilmesi için ek miktarda bilgi yani ek bir giriş parametresi gerektirir.
Ekstra giriş parametresi ile aşırı yüklenmiş bir DoWork yöntemine ihtiyacımız var ... ama sonra mevcut tüm İşçiler bu yöntemi uygulamak zorunda kalacaktı - ki bu İşçiler gerçekten bu yönteme ihtiyaç duymadığı için yanlış görünüyor.
Koordinatörü hangi İşçinin kullanıldığından habersiz tutmak ve yine de her İşçiye işini yapmak için ihtiyaç duyduğu bilgileri almasına izin vermek, ancak herhangi bir İşçinin ihtiyaç duymadığı şeyleri yapmamasına izin vermek için bunu nasıl yeniden düzenleyebilirim?
Halihazırda çok sayıda Çalışan var.
Yeni WorkerB sınıfının gerekliliklerini karşılamak için mevcut somut İşçilerinden hiçbirini değiştirmek istemiyorum.
Belki bir Dekoratör deseninin burada iyi olacağını düşündüm ama herhangi bir Dekoratörün daha önce aynı yöntemle ama farklı parametrelerle bir nesneyi süslediğini görmedim ...
Koddaki durum:
public class Coordinator
{
public string GetWorkerResult(string workerName, int a, List<int> b, string c)
{
var workerFactor = new WorkerFactory();
var worker = workerFactor.GetWorker(workerName);
if(worker!=null)
return worker.DoWork(a, b);
else
return string.Empty;
}
}
public class WorkerFactory
{
public IWorker GetWorker(string workerName)
{
switch (workerName)
{
case "WorkerA":
return new ConcreteWorkerA();
case "WorkerB":
return new ConcreteWorkerB();
default:
return null;
}
}
}
public interface IWorker
{
string DoWork(int a, List<int> b);
}
public class ConcreteWorkerA : IWorker
{
public string DoWork(int a, List<int> b)
{
// does the required work
return "some A worker result";
}
}
public class ConcreteWorkerB : IWorker
{
public string DoWork(int a, List<int> b, string c)
{
// does some different work based on the value of 'c'
return "some B worker result";
}
public string DoWork(int a, List<int> b)
{
// this method isn't really relevant to WorkerB as it is missing variable 'c'
return "some B worker result";
}
}
Coordinator
zaten bu ekstra parametreyi GetWorkerResult
işlevine uyacak şekilde değiştirmeliydi - yani SOLID'in Açık-Kapalı-Prensibi ihlal edildi. Sonuç olarak, tüm kod çağrısı Coordinator.GetWorkerResult
da değiştirilmeliydi. Bu işlevi çağırdığınız yere bakın: hangi IWorker'ı talep edeceğinize nasıl karar veriyorsunuz? Bu daha iyi bir çözüme yol açabilir.
IWorker
Arabirim eski sürümü listeledi mi , yoksa ek parametre içeren yeni bir sürüm mü?