深入PHP面向对象、模式与实践(二)

八、模式原则

A.模式的启示

B.组合与继承

1.继承是就对变化的环境及上下文设计的有效方式,然而它会限制灵活性,尤其当类承担多重责任的时候

2.组合可以以多种方式动态地处理任务,不过可能导致代码可读性下降,但比使用继承更灵活

C.解耦

1.当系统中一个组件的改变迫使系统其他许多地方也发生改变的时候,就可诊断为紧耦合了。

2.最好的策略就是提取代码并将其组合在公共接口之后。这可以使类之间相互独立,通过在一个地方集中你的“入口”代码,就能更轻松地切换到一个新的平台而不会影响到系统中更大的部分

D.针对接口编程,而不是针对实现编程

1.把不同的实现隐藏在父类所定义的共同接口下,然后客户端代码需要一个父类的对象而不是一个子类的对象,从而使客户端代码可以不用关心它实际得到的是哪个具体的实现

2.从客户端代码的角度看,类方法参数为抽象或能用类型通常都是不错的主意。如果参数对对象类型要求过于严格,就会限制代码在运动时的灵活性

E.变化的概念

1.“把变化的概念封装起来”,根据一定条件,变化的元素可被提取出来形成子类,而这些元素共同拥有一个抽象父类。而这个新类型能被其他类使用

2.好处:专注于职责;通过组合提高灵活性;使继承层级体系更紧凑和集中;减少重复;

F.父子关系

1.“你还不需要他”,通常被应用在应用程序的功能

2.“用最简单的方式来完成任务”

G.模式

1.用于生成对象的模式

2.用于组织对象和类的模式

3.面向任务的模式

4.企业模式

5.数据库模式

九、生成对象

A.生成对象的问题和解决方法

1.对象创建有时会成为面向对象设计的一个薄弱环节

2.“工厂”(factory)就是负责生成对象的类或方法

B.单例模式

1.对象应该可以被系统中的任何对象使用

2.对象不应该被储存在会被覆写的全局变量中

3.系统中不应超过一个对象

4.定义一个私有的构造方法外部不可实例化

C.工厂方法模式

1.在代码运行时我们才知道要生成的对象类型

2.需要能够相对轻松地加入一些新的产品类型

3.每一个产品类型都可定制特定的功能

D.抽象工厂模式

1.将系统与实现的细节分离开来

2.对系统中功能相关的元素强制进行组合

3.添加新产品将会令人苦恼

E.原型模式

1.原型模式:使用PHP的clone关键词复制已存在的具体产品,然后具体产品类本身便成为它们自己生成的基础,使用该模式可以用组合代替继承

https://github.com/zhangyue0503/php/blob/master/shenruphpmianxiangduixiangmoshiyushijian/9.php

十、让面向对象编程更加灵活的模式

A.构造可灵活创建对象的类

1.为了使项目更爱具灵活性,我们需要将类按一定结构组织起来,以便它们的对象在代码运行时能被构建为有用的结构。

B.组合模式

1.组合模式定义了一个单根继承体系,使具有截然不同职责的集合可以并肩工作。组合模式中的类必须支持一个共同的操作集,以将其作为它们的首要职责。

2.原则是局部类和组合类具有同样的接口

3.缺点:复杂模型需要类型检查、操作成本、不适合关系型数据库保存适合XML等持久化

4.想像对待单个对象一样对待组合对象,组合对象本质上和局部对象相似,是树型结构 ,所以对整体的操作会影响到局部,通过组合,对客户端代码来说局部的数据又是透明的。组合模式使这些操作和查询对客户端代码透明。对象树可以方便地进行遍历

C.装饰模式

1.组合模式帮助我们聚合组件,而装饰模式则使用类似结构来帮助我们改变具体组件的功能。该模式同样体现了组合的重要性,但组合是在代码运行时实现的。继承是共享父类特性的一种简单的办法,但可能会使你将需要改变的特性硬编码到继承体系中,而这常会降低系统灵活性

2.组合和继承通过都是同时使用的。因为装饰对象作为子对象的包装,所以保持基类中的方法尽可能少是很重要的。

D.外观模式

1.外观模式是一个十分简单的概念,它只是为一个分层或一个子系统创建一个单一的入口。有助于分享项目中的不同部分、对于客户端开发者来说访问代码变得简洁方便。另外由于只在一个地方调用子系统,减少了出错的可能性,并因此可以预估子系统修改带来的问题所在。

https://github.com/zhangyue0503/php/blob/master/shenruphpmianxiangduixiangmoshiyushijian/10.php

十一、执行及描述任务

A.解释器模式

1.解释器类经常执行非常相似的任务,所以最好仔细检查创建的类是否重复

B.策略模式

1.当类必须支持同一个接口的多种实现时,最好的办法常常是提取出这些实现,并将它们旋转在自己的类型中,而不是通过继承原有的类去支持这些实现

C.观察者模式

1.观察者模式的核心是把客户元素(观察者)从一个中心类(主体)中分离开来。当主体知道事件发生时,观察者需要被通知到。同时,我们并不希望将主体与观察者之间的关系进行硬编码。

2.SPL中的SplObserver、SplSubject和SplObjectStorage,为观察者的3个元素,可以直接使用

D.访问者模式

E.命令模式

1.3部分组成:实例化命令对象的客户端(client)、部署命令对象的调用者(invoker)和接受命令的接收者(receiver)

https://github.com/zhangyue0503/php/blob/master/shenruphpmianxiangduixiangmoshiyushijian/11.php

十二、企业模式

A.架构概述

1.模式

  • 注册表:该模式用于使数据对进程对进程中所有的类都有效
  • 前端控制器:规模较大的系统中,该模式可用于尽可能灵活地管理各种不同的命令和视图
  • 应用控制器:创建一个类来管理视图连加和命令选择
  • 模板视图:创建模板来处理和显示用户界面,在显示标记中加入动态内容。尽量少使用原始代码
  • 页面控制器:满足和前端控制器相同的需求,但较为轻量级,灵活性也小一些
  • 事务脚本:通过简单的规划,用“过程式”的代码来实现程序逻辑
  • 领域模式:和事务脚本相反,可以为业务参考者和过程构建基于对象的模型

2.应用程序和层:解耦、测试方便、减少代码重复

  • 视图层包括系统用户实际看到和交互的界面,负责显示用户请求的结果及传递新的请求给系统
  • 命令和控制层处理用户的请求,委托业务逻辑层处理和满足请求,然后选择最适合的视图,将结果显示给用户。实际上,这个层和视图层常常合并为表现层。即使这样,显示的任务应当严格地与请求处理和业务逻辑调用分离开来
  • 业务逻辑层负责根据请求执行业务操作。它执行需要的计算并整理结果数据。
  • 数据层负责保存和获取系统中的持久信息。在某些系统中,命令和控制层使用数据层来获取它所需要的业务对象。但在其他系统中,数据层通常尽可能地被隐藏起来。

B.企业架构之外的基础模式

1.注册表(Registry)模式

  • 注册表类提供静态方法(或单例对象的实例化方法)来让其他对象访问其中的数据(通常是对象)。整个系统中的每个对象都可以访问这些数据对象。
  • 可以构建一个注册表类来模拟应用程序作用域

C.表现层

1.前端控制器

  • 缺点:需要大量的前期开发工作,每次请求都要加载所有的配置信息
  • 好处:集中了系统的表现逻辑,易于扩展

2.应用控制器:负责映射请求到命令,并映射命令到视图,可以使用各种机制来创建命令与视图之间的关系,给程序带来更大的灵活性

3.页面控制器:非常简单、极易理解

4.模板视图和视图助手

D.业务逻辑层

1.事务脚本:事务脚本(Transaction Script)模式:描述了不同系统的实现方式,简单易懂而高效,目的在于完成系统的业务目的

2.领域模型

https://github.com/zhangyue0503/php/blob/master/shenruphpmianxiangduixiangmoshiyushijian/12.php

十三、数据库模式

A.数据层

B.数据映射器

1.数据映射器是一个负责将数据映射到对象的类

2.创建用于将领域模型对象映射到关系型数据库的特定类

C. 标识映射:跟踪系统中的所有对象,以避免重复实例化或不必要的数据库操作

D.工作单元

1.工作单元可使你只保存那些需要保存的对象

2.自动保存对象到数据库,确保只将修改过的对象和新创建的对象插入数据库

3.延迟加载:延迟创建对象或数据库查询,直到确实需要

E.领域对象工厂:封装创建对象的功能

F.标识对象:允许客户端程序员自行组装数据库查询条件,而与底层数据库无关

G.选择工厂和更新工厂模式

1.包括选择工厂和更新工厂封装创建SQL查询的逻辑

2.领域对象组装器:创建一个在较高层次管理数据存取的控制器

十四、良好的糟糕的实践

A.超越代码

B.借一个轮子

1.PEAR(PHP Extension and Application Repository,PHP扩展与应用库)

2.高效率的程序员只把原创代码看做构建项目的一个工具

C.合作愉快:Subversion

D.为你的代码插上双翼:Phing

E.文档:phpDocumentor

F.测试

G.持续集成

十五、PEAR和Pyrus

A.什么是PEAR

1.PEAR的核心部分是许多“包”的集合,可以按功能分成不同的类别,库是集中管理的

2.PEAR的核心包(PEAR基础类,PEAR Foundation Classes)提供了整个类库的骨架—包括错误处理和对命令行参数的处理等核心功能

B.了解Pyrus

1.在http://pear2.php.net上下载pyrus.phar

C. 安装PEAR包

1.pear -o install xxx,-o自动安装依赖包,-a安装所有依赖包

D.使用PEAR包

1.直接require_once

2.官方的PEAR包都使用标准的PEAR错误处理类PEAR_Error,5.0版本后的PHP使用PEAR_Exception,将捕获异常而不是检测返回类型

E.创建自己的PEAR包

1.package.xml

https://github.com/zhangyue0503/php/blob/master/shenruphpmianxiangduixiangmoshiyushijian/15.php

十六、用phpDocumentor生成文档

A.为什么要使用文档

B.安装(phpDocumentor)

1.pear upgrade PhpDocumentor

C.生成文档

1.phpdoc -d 目录 -t 生成目录 -ti 项目标题 -dn 默认包名

D.DocBlock注释

1./**格式

2.@package 包名

E.类的文档

1. @author,@copyright

F.文件的文档

1.@license 指向许可文档的URL和描述性文字

G.属性的文档

1.@var 定义属性的类型

2.设置-pp on可显示私有属性

H.方法的文档

1.@param 参数名称 类型 简述

2.@return 返回值类型 简要描述

I.在文档中创建链接

1.@see 元素引用(如class::method())

2.@link,@uses

十七、使用Subversion进行版本控制

十八、 使用PHPUnit进行测试

A.功能测试与单元测试

1.功能测试:从一个项目的接口开始,为用可能使用系统的各种方式建模,也被称为验收测试(acceptance test),通常把系统看做一个黑盒——测试只针对产品功能,并不关注项目内部结构和处理过程

2.单元测试更加关注于类,并将测试方法组合到测试用例中。目标是尽可能地在隔离周边环境的情况下测试每个组件 。

B.手工测试

C.引入PHPUnit

1.用composer:composer require phpunit/phpunit

2.断言:指用来判断系统中某个假设是否成立的语句或方法

D.编写Web测试

1.PHPUnit方式

2.Selenium

E.警告

1.测试可以:

  • 帮助预防bug(开发和重构时)
  • 帮助发现bug(扩大测试覆盖范围时)
  • 鼓励你关注于系统设计
  • 使你不再害怕修改代码会导致比它们所解决的问题更多的问题,从而改进代码设计
  • 给你迁移代码的信心

https://github.com/zhangyue0503/php/blob/master/shenruphpmianxiangduixiangmoshiyushijian/18.php

十九、用Phing实现项目的自动构建

二十、持续集成

二十一、对象、模式与实践

A.对象

1.封装和委托

2.解耦

3.复用性

B.模式

1.经过实践检验

2.模式促进其他模式的使用

3.公共词汇表

4.模式改善设计

C.模式和设计原则

1.组合优于继承

2.避免紧耦合

3.面向接口编程,而不是面向实现编程

4.封装变化的概念

原文发布于微信公众号 - 硬核项目经理(fullstackpm)

原文发表时间:2019-06-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券