이 문제를 해결하는 데 어떤 디자인 패턴이 도움이 될지 잘 모르겠습니다.
'코디네이터'라는 클래스가 있는데, 여기에는 모든 유형의 작업자에 대해 몰라도 어떤 작업자 클래스를 사용해야하는지 결정합니다. 단지 WorkerFactory를 호출하고 공통 IWorker 인터페이스에 작용합니다.
그런 다음 적절한 Worker가 작동하도록 설정하고 'DoWork'메서드의 결과를 반환합니다.
이것은 지금까지 훌륭했습니다 ... 지금까지; 새로운 Worker 클래스 인 "WorkerB"에 대한 새로운 요구 사항이 있습니다. "WorkerB"에는 작업을 수행하기 위해 추가 정보가 필요합니다. 즉 추가 입력 매개 변수가 필요합니다.
추가 입력 매개 변수가있는 오버로드 된 DoWork 메소드가 필요하지만 ... 기존의 모든 작업자는 해당 메소드를 구현해야합니다. 이러한 작업자는 실제로 해당 메소드가 필요하지 않으므로 잘못 보입니다.
코디네이터가 사용중인 작업자를 인식하지 못하고 각 작업자가 자신의 업무를 수행하는 데 필요한 정보를 얻을 수 있지만 작업자가 필요하지 않은 작업을 수행하지 않도록하려면 어떻게 리팩터링 할 수 있습니까?
이미 많은 기존 근로자가 있습니다.
새로운 WorkerB 클래스의 요구 사항을 수용하기 위해 기존의 구체적인 Workers를 변경하고 싶지 않습니다.
데코레이터 패턴이 여기에서 좋을 것이라고 생각했지만 데코레이터가 동일한 방법으로 객체를 장식하는 것을 보지 못했습니다.
코드 상황 :
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
해당 GetWorkerResult
기능 에 해당 추가 매개 변수를 수용하도록 이미 변경해야 했습니다. 즉, SOLID의 공개 폐쇄 원칙을 위반했음을 의미합니다. 결과적으로 모든 코드 호출 Coordinator.GetWorkerResult
도 변경되어야했습니다. 따라서 해당 함수를 호출 한 장소를 살펴보십시오. 어떤 IWorker를 요청할지 어떻게 결정합니까? 더 나은 솔루션으로 이어질 수 있습니다.
IWorker
인터페이스는 이전 버전을 나열하거나이 추가 매개 변수와 함께 새로운 버전인가?