前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >深入PHP面向对象、模式与实践(二)

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

作者头像
硬核项目经理
发布2019-08-07 15:33:31
1.1K0
发布2019-08-07 15:33:31
举报

八、模式原则

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.封装变化的概念

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-06-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码农老张 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档