开发一个可维护的程序

晚上回家的时候跟同事聊起来一些编程的工具。主要是三个东西「MVC」「Gitflow」和「unittest」。最近开发的一个程序正好这三个都在用,深感对于开发出一个可维护的程序来说这三者的重要。

MVC 是什么?

  1. MVC 是 model view controler 三者的缩写。
  2. Model 是数据模型,业务逻辑和业务规则,一般成品后不会改变,比如博客里的文章,注意发布、回收、评论等虽然也是对数据的操作,但也被归到 model 里面,一般表现为类的方法。
  3. View 是视图,对用户而言只有 view 是可见的,这是 MVC 种变化频繁的部分,也是经常要改来改去的部分。
  4. Controller 是 Model 和 View 的中间层,Model 不会输出任何用于表现的东西,如 HTML 代码等,view 也不会对 model 有任何操作,controller 决定使用哪些 model,对 model 执行什么操作,为视图准备哪些数据。
  5. MVC 并不是一种设计模式,而是观察者模式(Observer)(Pub/Sub), 策略模式(Strategy)和组合模式(Composite)的合体。

为什么要用 MVC?

  1. 因为将 MVC 区分开来,Model 就可以专注于数据处理而不必担心表现端的更新,View 也可以只管自己更新而不用担心对数据有什么副作用,Controller 其实更像是负责 Model 和 View 之间的胶水。这样功能分清之后开发起来能让后续的更新和维护的代价减少到最小。而且对于大项目来说,多人合作也只需要把接口做好就可以了。
  2. 为什么要轻 controller,重 model。因为比如我在 controller 里直接改某个 model 的数值,那么一个被频繁使用的数值很可能会在多处有修改的痕迹,而 model 本身对此一无所知。如果是 model 提供一个接口给 controller,加入这个值出了异常,我只需要在 model 里面写个log,就能知道 到底是哪个调用接口的程序引入的bug。

怎么用 MVC?

  1. Model 主要是保存事物信息,数据,行为,方法是 model 的主要内容,Model所提供的数据都是原始数据。也就是说,不带有任何表现层的代码。 注意与Controller区分开。Model是处理业务方面的逻辑,Controller只是简单的协调Model和View之间的关系, 只要是与业务有关的,就该放在Model里面。好的设计,应当是胖Model,瘦Controller。
  2. Model 的粒度要尽可能小,这样容易复用,也容易通过多对多的数据结构实现逻辑。
  3. View 的部分比较明确,就是负责显示。一切与显示界面无关的东西,都不应该出现在View里面。 因此,View 一般没有复杂的判断语句或运算过程,可以有简单的循环语句、格式化语句。
  4. Controller 主要是响应用户请求,决定使用什么视图,需要准备什么数据用来显示。用于处理用户请求。 因此,对于reqeust的访问代码应该放在Controller里面,比如 $_GET $_POST 等。 但仅限于获取用户请求数据,不应该对数据有任何操作或预处理,这些工作应该交由Models来完成。当涉及到多个Model时,有关的逻辑应当交给Model来完成。
  5. Model 和 View 一定要区分,Controller 则不一定要。

Gitflow 是什么?

  1. 是一种规范化使用 git branch 来管理分支代码的流程。
  2. 有develop、master两个主分支,此外还有 feature 分支系,release 分支系、和 hot-fix 分支系。
  3. develop 负责开发时使用,master 负责生产时使用,两者并不 merge。
  4. feature 从 develop 分支牵出来用于开发新特性。
  5. release 从 develop 分支牵出来用于发布前调试、文档、单元测试等,完成后由 release 分支合并到 master 分支。
  6. hot-fix 从 master 分支牵出来用于发布后改 bug,改完后立刻合并回 master 和 develop。
  7. 一图胜千言。


    gitflow.png

为什么要用Gitflow?

  1. 各个feature之间的代码是隔离的,可以独立地开发、构建、测试;
  2. 当feature的开发周期长于release周期时,可以避免未完成的feature进入生产环境。

要怎么用Gitflow?

  1. feature 分支只开发 feature,只能处理自己写的代码,不能对公用的接口代码做修改,否则多个 feature 同时开发时合并回去会很头痛。
  2. 如果要修改公用接口,用 hotfix 分支。
  3. 如果要重构,完成或放弃还在做的 feature 分支。

unittest 是什么?

  1. 单元测试是一堆测试断言,用来测试程序的接口有没有问题。

为什么要用 unittest?

  1. 因为测试驱动的开发能让你没开发一个新功能之后,方便地知道有没有引入新的 bug。

要怎么用 unittest?

  1. 每个测试都必须是独立的,在一个测试里有自己的上下文,测试的通过与否不应该受到其他测试的影响。
  2. 每次开发新功能都必须通过单元测试。
  3. 单元测试应该来测试那些你觉得很可能出错的地方,不需要覆盖到所有API。
  4. 每一次 bugfix 都应该更新单元测试,保证同样的 bug 不会再次发生。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容