• 什么是设计模式?

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. Codeforces Round #231 (Div2) 迟到的解题报告

    题目A: 给一个火柴等式,可以从左边移动一根到右边,也可以从右边移到左边,但是不能移动“+”,”=“的火柴, 而且加法里面的数都要大于0(很重要的条件),基本上注意到这点的都过了,没注意的都被HACK ...

  2. Unity动态加载和内存管理(三合一)

    原址:http://game.ceeger.com/forum/read.php?tid=4394#info 最近一直在和这些内容纠缠,把心得和大家共享一下: Unity里有两种动态加载机制:一是Re ...

  3. asp.net 认证与授权

    1.下面的例子在web.config文件中配置网站使用asp.net forms 身份认证方式: <configuration> <system.web> <authen ...

  4. 异步等待的 Python 协程

    现在 Python 已经支持用协程进行异步处理.但最近有建议称添加协程以全面完善 Python 的语言结构,而不是像现在这样把他们作为生成器的一个类型.此外,两个新的关键字---异步(async)和等 ...

  5. lightoj 1408 Batting Practice (概率问题,求期望,推公式)

    题意:一个人若连续进k1个球或连续不进k2个球,游戏结束,给出这个人不进球的概率p(注意:是不进球!!!),求到游戏结束时这个投球个数的期望. 不进球概率为p,进概率 q=1-p.设 f[i] 表示连 ...

  6. React.js 样式组件:React Style

    点这里 React Style 是 React.js 可维护的样式组件.使用 React Native StyleSheet.create一样的样式. 完全使用 JavaScript 定义样式: ? ...

  7. hdu 4259 Double Dealing

    思路: 找每一个数的循环节,注意优化!! 每次找一个数的循环节时,记录其路径,下次对应的数就不用再找了…… 代码如下: #include<iostream> #include<cst ...

  8. Good Bye 2015 B. New Year and Old Property 计数问题

    B. New Year and Old Property   The year 2015 is almost over. Limak is a little polar bear. He has re ...

  9. OnClientClick="return confirm('确定要删除吗?')"

    OnClientClick="return confirm('确定要删除吗?')"   -----------------------前台代码 OnClientClick用于执行客 ...

  10. lintcode:单词切分

    单词切分 给出一个字符串s和一个词典,判断字符串s是否可以被空格切分成一个或多个出现在字典中的单词. 样例 s = "lintcode" dict = ["lint&qu ...