【发布时间】:2016-03-03 04:05:02
【问题描述】:
我对在保持 SOLID 原则的同时将控制器与存储库模式一起使用有些困惑。考虑一下,我有两种类型的报价
- 商业报价
- 私人报价
而且未来很有可能出现新的报价类型。每个报价都有不同的领域、业务逻辑,但它们共享许多共同的功能。所以我创建了一个 QuotationInterface
报价界面
interface QuotationInterface
{
public function save(array $data);
}
实现接口的引用类
class CommercialQuotation implements QuotationInterface
{
public function(array $data)
{
// save commercial quotation
}
}
class PrivateQuotation implements QuotationInterface
{
public function(array $data)
{
// save Private quotation
}
}
报价库
class QuotationRepository
{
public function save(array $data, QuotationInterface $quotation)
{
$quotation->save($data);
}
}
QotationController
public function store(Resource $resource)
{
$inputs = $resource->all();
/**
* Clearly here Open/Close Principle is broken
*/
if ($inputs['type'] == 'private'){
$quotation = new PrivateQuotation;;
}
else if($inputs['type'] == 'commercial'){
$quotation = new CommercialQuotation;
}
$this->repo->save($inputs, $quotation);
}
在我的 QuotationController 中,显然违反了 Open/Close 原则..
为每种类型的报价创建一个控制器是个好主意(有一天可能会超过 10 个,谁知道?)以避免违反 OCP 或我的设计是错误的?欢迎任何建议、设计更改提示、资源。
注意:我的报价控制器除了保存之外还有许多其他功能。
【问题讨论】:
标签: oop laravel design-patterns dry solid-principles