有一种观点认为,当使用责任链模式时(https://refactoring.guru/design-patterns/chain-of-responsibility/php/example),应该使用简单工厂创建请求。在这种情况下,工厂本身就必须通过DI来。争论的焦点是为解决方案编写单元测试更容易。请分享您对此事的看法。 Php、symfony 3 框架
当前实施:
$createRequest = new CreateRequest($input);
$updateRequest = UpdateRequest::createFromRequest($createRequest);
$updateRequest->status = 2;
$createHandler = new CreateHandler($createRequest);
$updateHandler = new UpdateHandler($updateReques);
$createHandler->setNext($updateRequest);
$createHandler->handle();
争论的焦点是为解决方案编写单元测试更容易。
是的,确实如此,而且它还增强了关注点分离。我的意思是一个班级只有一个目标。
抱歉我对 PHP 不熟悉。让我通过 C# 展示一个示例。假设我们有一些应该根据用户输入调用的各种 API。
因此用户输入的代码如下所示:
public enum UserInput
{
One, Two, Three
}
BaseApi 的抽象类看起来像这样:
public abstract class BaseApi
{
public DateTime StartDateTime { get; set; } = DateTime.Now;
public abstract string Get();
}
具体的实现是这样的:
public class WeatherApi : BaseApi
{
public override string Get() => "I am weather API. Object created: "
+ StartDateTime.ToString();
}
public class TemperatureApi : BaseApi
{
public override string Get() => "I am temperature Api. Object created:"
+ StartDateTime.ToString();
}
然后 APIFactory 看起来像这样:
public class ApiFactory
{
private Dictionary<UserInput, BaseApi> _apiByUserInput;
public ApiFactory()
{
_apiByUserInput = new Dictionary<UserInput, BaseApi>()
{
{ UserInput.One, new WeatherApi() },
{ UserInput.Two, new TemperatureApi() }
};
}
public BaseApi GetInstance(UserInput userInput) => _apiByUserInput[userInput];
}
所以可以看出,您可以轻松测试您的
ApiFactory
,而且实现起来非常简单。