八、模式原则
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.测试可以:
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.封装变化的概念