• 什么是设计模式?

design pattern是一个通用的,可以被重用的关于一个常见的问题的解决方案。

  • 为什么要用设计模式?

引入设计模式的理论基础非常简单。我们每天都会碰到问题。我们可能碰到决定使用何种算法的问题,什么是最合适的design,使用什么技术,什么模块等等。。。同样种类的问题很有可能已经被我们的前辈所碰到,如果其他人已经碰到过我们的问题,那么他们已经有效解决了该问题是很有可能的。这样的话,我们最好直接借鉴别人已经成熟的解决方案,而不是从头来过。

然而,每一个问题都是唯一的,这样每一个解决方案也都是唯一的。那么我们又如何能够使用别人的解决方案到我们的问题中呢?使用设计模式的理论基础并不是直接照抄别人现成的解决方案。design pattern指导我们如何去解决一个问题。当我们将一个大的问题不断拆分,当拆分到一个可以管理的小问题时,我们会发现这些小的问题似曾相识。比如我们需要在显示他们之前必须做好排序。这时分解后的小问题就有一个为排序。你要知道排序是一个常见的问题,而该问题的解决有多种pattern可以遵循和借鉴。

  • M-V-C 设计模式

MVC是一个指导我们隔离具有用户界面的应用程序中的presentation, logic, data三个方面的有效模式。

在很多应用中,我们需要从数据库中取得数据并且展示给用户。如果用户更改这些数据,应用程序就应该在数据库中保存这些数据。由于信息是在数据库及用户界面中流动,我们经常倾向于将数据库访问及UI界面绑定在一起。这种模式虽然可以降低代码量和提高性能,但是这种设计模式也存在重大的问题:UI和data access相比更加频繁地变更,我们应该可以经常地变更UI的逻辑,但是却不用担心数据访问这一块。比如,data access和ui presentation logic都放在一个PHP文件中,我们连接数据库,查询获取数据,显示在表格中。你首先声明表格header,然后是数据库访问逻辑,最后将查询到的数据通过一个loop打印在data table elements中。负责显示数据在表格中的Presentation logic和负责数据库查询获取数据的database access logic都放在一个PHP文件中,我们需要非常小心地处理:一旦修改了presentation logic,绝对不能因此影响到data access logic.像这种将两个方面的逻辑混为一体使得变更维护非常不变。另外应用程序倾向于加入更多的比简单数据存储访问复杂的多的业务逻辑(business logic),我们也希望能够隔离business logic以便能够坦然应对将来软件越来越多的复杂要求。

我们应该如何模块化我们的UI,business logic,data storage呢?

一个成熟的模式MVC可以帮助我们解决这个划分领域的问题

Model:

模型代表了引用将操作的数据data。model管理应用的数据。他回应来自view的请求并且回应来自controller的数据更新请求。在PHP中,这个model对应着database schema和映射的class

View:

视图view将来自model的数据展示在浏览器中以便于浏览和操作。view管理display of information.在PHP中,这个对应着将被deliever到浏览器的HTML

Controller:

控制器响应事件,典型的比如用户的交互,这些交互可能引起model或者view的变化。在PHP中,controller就是执行业务逻辑控制的php代码,它也和HTTP逻辑相耦合。

view和controller都依赖于model.然而,model并不依赖于view和controller。这是这种separation of concern的最大的一个好处。这种隔离允许model可以在和visual presentation分离的情况下独自开发和测试。在web应用中,view和controller的分离是非常好定义的。比如,展示view给用户的浏览器是和处理http请求的后端完全隔离的。所以即使这些展示在浏览器中的ui interface是由server端产生的,这些UI(the html page prepared to be sent to the browser)和处理和计算这些被用于ui中的数据的PHP代码是完全隔离的。

根据MVC的pattern,我们需要把系统分割成Model, View和Controller,对应的,我们在组织结构上也可以分为数据库,view,controller三个大的小组,每个小组内部人员任务划分可以根据个人能力来做匹配

  • View

view将具有如下方面的功能领域:reports(pages), output filtering, forms, input validation, ajax and dhtml, interfacing with control and model,presentation templates, graphics and styling, ui testing.

一种简单计量view的复杂度的指标为:form/page数

  • Model

model通常有如下的功能: database design, queries and stored procedures, object class map to data objects(比如laraveld的orm),data access layer, interface to the business logic and presentation layers.

  • Controller

business logic或者controller通常具有一下方面的功能: data validation, providing itnerface to the presentation layer, using the database layer interface, algorithms, business domain specific processing. 控制器负责访问和更新数据。在这一层,对业务逻辑的知识是非常重要的。

MVC框架的必要性:

MVC模式帮助我们应付软件系统的复杂性,基于presentation, business logic(control),and data来分割关注(seperating concern)使得我们更好的聚焦于软件模块上。

我们可以遵循上述MVC功能分割原则来设计系统,但是当我们忙于我们的PHP代码开发时,很有可能我们就会偏离方向。正因为此,我们不应一切从头开始,我们应该寻找一些现成的工具或者软件来帮助我们在design, implementation和deployment流程中始终保持正确的航向。 MVC框架(frameworks)就是一个能够简化我们开发,帮助我们以MVC模式来轻松开发的工具。框架提供一个项目的框架

  • The process matters

如果我们希望我们所开发的软件项目能够按时成功交付,那么我们做事的方法是有很大影响的。

比如,我们能够通过一次测验的能力依赖于我们平时是如何上课的:参加课堂学习,阅读附加材料,测验前复习。。。这个过程从我们第一次参加课堂学习开始。只有上述过程做的好了,我们才能真正达成考试成功的目标。同样地,这个现象也适用于软件开发。软件产品的质量由开发流程的质量来决定。

比如,对于需求本身,和用户一起工作,尽早做出prototype要求用户review反馈,这个流程是保证我们的产出和用户的要求是完全匹配的。

一个软件流程是一套一系列的产出软件功能的行动。每一个行动都有一个相应的结果输出。当这些每个行动产生的结果按照一定的顺序堆放在一起时,便最终形成了我们的产品。

  • 简单的PHP项目工作流程

design pattern及其使用的更多相关文章

  1. 说说设计模式~大话目录(Design Pattern)

    回到占占推荐博客索引 设计模式(Design pattern)与其它知识不同,它没有华丽的外表,没有吸引人的工具去实现,它是一种心法,一种内功,如果你希望在软件开发领域有一种新的突破,一个质的飞越,那 ...

  2. 设计模式(Design Pattern)系列之.NET专题

    最近,不是特别忙,重新翻了下设计模式,特地在此记录一下.会不定期更新本系列专题文章. 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结. 使用 ...

  3. [转]Design Pattern Interview Questions - Part 4

    Bridge Pattern, Composite Pattern, Decorator Pattern, Facade Pattern, COR Pattern, Proxy Pattern, te ...

  4. [转]Design Pattern Interview Questions - Part 2

    Interpeter , Iterator , Mediator , Memento and Observer design patterns. (I) what is Interpreter pat ...

  5. [转]Design Pattern Interview Questions - Part 3

    State, Stratergy, Visitor Adapter and fly weight design pattern from interview perspective. (I) Can ...

  6. [转]Design Pattern Interview Questions - Part 1

    Factory, Abstract factory, prototype pattern (B) What are design patterns? (A) Can you explain facto ...

  7. design pattern

    1. visitor design pattern http://butunclebob.com/ArticleS.UncleBob.IuseVisitor

  8. Design Pattern: Observer Pattern

    1. Brief 一直对Observer Pattern和Pub/Sub Pattern有所混淆,下面打算通过这两篇Blog来梳理这两种模式.若有纰漏请大家指正. 2. Use Case 首先我们来面 ...

  9. Scalaz(10)- Monad:就是一种函数式编程模式-a design pattern

    Monad typeclass不是一种类型,而是一种程序设计模式(design pattern),是泛函编程中最重要的编程概念,因而很多行内人把FP又称为Monadic Programming.这其中 ...

  10. 为什么要提倡“Design Pattern呢

    为什么要提倡“Design Pattern呢?根本原因是为了代码复用,增加可维护性. 那么怎么才能实现代码复用呢?面向对象有几个原则:开闭原则(Open Closed Principle,OCP).里 ...

随机推荐

  1. PowerDesigner(六)-物理数据模型(PDM逆向工程)(转)

    物理数据模型PDM 物理数据模型(Physical Data Model,PDM):在数据库的逻辑结构设计好之后,就需要完成其物理设计,PDM就是为实现这一目的而设计的. 物理数据模型是以常用的DBM ...

  2. 用fabric部署维护kle日志收集系统

    最近搞了一个logstash kafka elasticsearch kibana 整合部署的日志收集系统.部署参考lagstash + elasticsearch + kibana 3 + kafk ...

  3. jQuery1.9.1源码分析--Events模块

    var rformElems = /^(?:input|select|textarea)$/i, rkeyEvent = /^key/, rmouseEvent = /^(?:mouse|contex ...

  4. JQuery的ajax方法

    1.使用方式: 由于是全局方法,所以调用简单:$.ajax(); 2.可输入参数: 最好是写成一个json形式,个人不建议用链式,那样看上去不太好. 参数名称 类型 描述 dataType strin ...

  5. POJ1474 Video Surveillance(半平面交)

    求多边形核的存在性,过了这题但是过不了另一题的,不知道是模板的问题还是什么,但是这个模板还是可以过绝大部分的题的... #pragma warning(disable:4996) #include & ...

  6. Python并发与并行的新手指南

    点这里 在批评Python的讨论中,常常说起Python多线程是多么的难用.还有人对 global interpreter lock(也被亲切的称为“GIL”)指指点点,说它阻碍了Python的多线程 ...

  7. 数据库链接 mysql,sqlserver

    1.生成对象工厂 /// <summary> /// 生成对象工厂 /// </summary> public class DBFactory { /// <summar ...

  8. lintcode:最长公共子序列

    题目 最长公共子序列 给出两个字符串,找到最长公共子序列(LCS),返回LCS的长度. 样例 给出"ABCD" 和 "EDCA",这个LCS是 "A& ...

  9. C++运算符重载——重载一元运算符

    0.重载一元操作符的方法 一元运算符即只需要一个操作用的运算符,如取地址运算符(&).复数(-).自减(--).自加(++)等. 运算符重载可以分为3种方式:类的非静态成员函数.类的友元函数. ...

  10. ios开发--编码格式

    1.url编码 ios中http请求遇到汉字的时候,需要转化成UTF-8,用到的方法是: NSString * encodingString = [urlString stringByAddingPe ...