这篇文章主要介绍了关于对PHP面向对象设计五大原则(SOLID)的总结,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下
PHP设计原则梳理,参考《PHP核心技术与最佳实践》、《敏捷开发原则、模式与实践》,文章PHP面向对象设计的五大原则、设计模式原则SOLID
单一职责原则(Single Responsibility Principle, SRP)
定义/特性
-
仅有一个引起类变化的原因
-
一个类只承担一项职责(职责:变化的原因)
-
避免相同的职责分散到不同的类,功能重复
问题
-
一个类承担的职责过多,多个职责间相互依赖,一个职责的变换会影响这个类完成其他职责的能力,当引起类变化的原因发生时,会遭受到意想不到的破坏
遵守SPR原则优势
-
减少类之间的耦合:当需求变化时,只修改一个类,从而隔离了变化带来类对其他职责的影响
-
提高类的复用性:按需引用,一个类负责一个职责,需求的变动只需要修改对应的类或增加某一职责
-
降低类的复杂度:职责单一,功能分散开降低一个类多个职责类的复杂度
代码示例
class ParseText{ private $content; public function decodeText(String $content) { // TODO: decode content } public function saveText() { // TODO:: save $this->content; }}/*问题思考:解析的文本类型会有多种-html、xml、json保存的文本也会有多种途径-redis、mysql、file客户端只需要解析文本时必须会引入saveText不需要的方法两个职责之间没有强烈的依赖关系存在任意职责需求变化都需要更改这个类*//*符合SRP的设计职责拆分*/class Decoder{ private $content; public function decodeText(String $content) { // TODO: decode content } public function getText() { return $this->content; }}class Store{ public function save($content) { // TODE: save }}
总结
软件设计所做的许多内容就是发现职责并合理的分离职责间的关系。如果应用程序的变化总是同时影响多个职责,就没必要分离职责。
接口隔离原则(Interface Segregation Principle ISP)
问题
设计应用程序时,类的接口不是内聚的。不同的客户端只包含集中的部分功能,但系统会强制客户端实现模块中所有方法,并且还要编写一些哑方法。这样的接口成为胖接口或者是接口污染,这样的接口会给系统引入一些不当的行为,资源浪费,影响其他客户端程序增强了耦合性等
ISP定义/特性
-
不应该强迫客户端依赖与他们不需要的方法/功能
-
一个类对一个类的依赖应该建立在最小的接口上
-
接口的实现类应该只呈现为单一职责原则
遵循ISP原则优势
-
将胖接口分离,每一组接口提供特定功能服务于特定一组的客户端程序
-
对一组接口的更改不会/较小的影响到其他的接口/客户端程序,保证接口的纯洁性
解决方式
-
胖接口分解成多个特定客户端的接口/多重接口分离继承
-
使用委托分离接口,两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象处理
代码示例
/** 公告接口*/interface Employee{ public function startWork(); public function endWork();}/** 定义特定客户端接口*/interface Coder{ public function writeCode();}interface Ui{ public function designPage();}class CoderClient implements Employee, Coder{ public function startWork() { //TODO:: start work time } public function endWork() { //TODO:: end work time } public function writeCode() <a>本2文来*源gao($daima.com搞@代@#码(网</a><strong>搞gaodaima代码</strong> { //TODO:: start write code return 'hellow world'; }}$c = new CoderClient();echo $c->writeCode();