Saya tidak yakin pola desain mana yang dapat membantu saya mengatasi masalah ini.
Saya memiliki kelas, 'Koordinator', yang menentukan kelas Pekerja mana yang harus digunakan - tanpa harus tahu tentang semua jenis Pekerja yang ada - hanya memanggil WorkerFactory dan bertindak berdasarkan antarmuka IWorker yang umum.
Kemudian menetapkan Pekerja yang sesuai untuk bekerja dan mengembalikan hasil metode 'DoWork'.
Ini baik-baik saja ... sampai sekarang; kami memiliki persyaratan baru untuk kelas Pekerja baru, "WorkerB" yang membutuhkan sejumlah informasi tambahan yaitu parameter input tambahan, agar dapat melakukan tugasnya.
Seperti kita membutuhkan metode DoWork yang kelebihan beban dengan parameter input ekstra ... tapi kemudian semua Pekerja yang ada harus menerapkan metode itu - yang tampaknya salah karena Pekerja itu benar-benar tidak memerlukan metode itu.
Bagaimana saya bisa menolak ini agar Koordinator tidak mengetahui Pekerja mana yang sedang digunakan dan masih memungkinkan setiap Pekerja untuk mendapatkan informasi yang diperlukan untuk melakukan tugasnya tetapi tidak ada Pekerja yang melakukan hal-hal yang tidak perlu?
Sudah banyak Pekerja yang ada.
Saya tidak ingin harus mengubah salah satu Pekerja beton yang ada untuk mengakomodasi persyaratan kelas WorkerB baru.
Saya pikir mungkin pola Penghias akan baik di sini, tetapi saya belum melihat Penghias menghiasi objek dengan metode yang sama tetapi parameter yang berbeda sebelum ...
Situasi dalam kode:
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
sudah harus diubah untuk mengakomodasi parameter tambahan dalam GetWorkerResult
fungsinya - itu berarti bahwa Prinsip Terbuka-Tertutup dari SOLID dilanggar. Sebagai akibatnya, semua panggilan kode Coordinator.GetWorkerResult
harus diubah juga. Jadi lihat di tempat Anda memanggil fungsi itu: bagaimana Anda memutuskan IWorker untuk meminta? Itu mungkin mengarah pada solusi yang lebih baik.
IWorker
antarmuka terdaftar versi lama, atau apakah itu versi baru dengan parameter yang ditambahkan?