单一职责原则:就一个类而言,应该只有一个引起它变化的原因。

在iOS开发中,我们会很自然的给一个类添加各种各样的功能,比如随便写一个简单的应用程序,一般都会生成一个viewController类,于是我们将各种各样的代码,商业运算的算法、http请求的参数(params)封装、使用FMDB、coreData时的数据库访问语句都放在这个类里面,这就意味着,无论任何需求变化,都要来修改viewController这个类,这其实是很糟糕的,维护麻烦、复用不可能、缺乏灵活性。

也许上面说的略微夸张,因为只要是稍微有iOS开发经验的朋友都知道,在iOS开发中,是采用MVC模式的,数据处理、封装放入model中,视图展示、操作放入view中,而controller只是负责将model提供的数据展示到view上去。从而保证各个模块各自独立、分工明确,容易维护。

但仅仅只是这样还不够,像发起http请求的代码、各种逻辑业务的代码、使用数据库做离线缓存的代码,与view\model无关,难道就全部放在controller里面?如果这样做,那controller里面代码将非常多,且杂乱。

就比如说,实现一个iphone上的俄罗斯方块游戏(请勿完全参照图片):

  1. 方块形状有不同的种类,需要代码生成
  2. 各方块在下落的时候,应该是通过动画下落,左右平移也应该是通过动画,并且还需要控制每次下落一格的时间,随着时间的推移(玩家等级的提高),格子单位时间下落的行数是不同的
  3. 在什么时间碰触到底部的方块?碰触到了该怎样停止运动?停止运动后,该不该消除这一行?等

如果将上面提到的这些全部写在一个viewController里面,这是非常不合理的,代码复用性也很差。

所以需要将之分离出来,上面提到的三点,1和3是和游戏逻辑相关的,和界面控制以及如何展示并没有多大联系,为什么要写到ViewController里面?正确的关系应该是这样的,用一个类来生成不同种类的方块,一个类来控制方块的动画,一个类来控制方块的平移、碰撞等操作。这样就可以就各个与界面逻辑无关的业务逻辑抽出来,将来如果要维护,只需要找到对应的类的功能区修改即可,而不需要改动viewController里面的东西。

如果一个类的职责过多,就等于把这些职责耦合在一起了,一个职责的变化可能会抑制或者削弱这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当变化发生时,设计会遭受意想不到的破坏。

软件设计要做的许多内容就是发现职责,并把那些职责相互分离。其实要去判断是否能分离出类来,也不难,如果可以想到多于一个动机去改变一个类,那么这个类就具有多于一个的职能,这个时候就该考虑职责分离。总的来说,在编程过程中,我们要在类的职责上多思考,做到单一职责,这样的代码才是易维护、易扩展、易复用、灵活多样的。

设计模式之单一职责原则(iOS开发,代码用Objective-C展示)的更多相关文章

  1. 北风设计模式课程---单一职责原则(Single Responsibility Principle)

    北风设计模式课程---单一职责原则(Single Responsibility Principle) 一.总结 一句话总结: 一个类应该有且只有一个变化的原因:单一职责原则(SRP:Single Re ...

  2. 深入浅出系列第一篇(设计模式之单一职责原则)——从纯小白到Java开发的坎坷经历

    各位看官大大们,晚上好.好久不见,我想死你们了... 先说说写这个系列文章的背景: 工作了这么久了,每天都忙着写业务,好久没有好好静下心来好好总结总结了.正好这段时间公司组织设计模式的分享分,所以我才 ...

  3. 设计模式之单一职责原则(SRP)

    自己之前写过一些关于设计模式的博客,但是大部分都写得比较匆忙.现在正好趁年前有时间,笔者打算好好地整理一下自己这块知识结构.开篇的第一个原则就是设计原则里面最简单的一个原则--单一职责原则. 想必大家 ...

  4. 【设计模式】单一职责原则(SRP)

    单一职责原则是面向对象原则五大原则中最简单,也是最重要的一个原则, 他的字面定义如下: 单一职责原则(Single Responsibility Principle, SRP): 一个类只负责一个功能 ...

  5. JAVA设计模式之单一职责原则

    概念: 就一个类而言应该只有一个因其他变化的原因. 流程: 问题由来:设类或接口类C负责两个不同不同的职责:职责T1,职责T2.当由于职责T1需求改变进而需要修改类C时,可能导致职责T2收到不可预知的 ...

  6. 《javascript设计模式与开发实践》--- (单一职责原则)

    看的这本书叫<JavaScript设计模式与开发实践> 先规划一下看书的顺序,基础知识我已经大概的浏览了一遍了,没有留下笔记,以后有时间还会补上.本来打算顺着看的.但是我感觉我很难短时间内 ...

  7. IOS设计模式的六大设计原则之单一职责原则(SRP,Single Responsibility Principle)

    定义 就一个类而言,应该仅有一个引起它变化的原因. 定义解读 这是六大原则中最简单的一种,通俗点说,就是不存在多个原因使得一个类发生变化,也就是一个类只负责一种职责的工作. 优点 类的复杂度降低,一个 ...

  8. Java设计模式(2:单一职责原则和依赖倒置原则详解)

    一.单一职责原则 不要存在多于一个导致类变更的原因.简单来说,就是一个Class/Interface/Method只负责一项职责. 这句话最为重要的就是这一段:一个Class/Interface/Me ...

  9. 敏捷软件开发:原则、模式与实践——第8章 SRP:单一职责原则

    第8章 SRP:单一职责原则 一个类应该只有一个发生变化的原因. 8.1 定义职责 在SRP中我们把职责定义为变化的原因.如果你想到多于一个的动机去改变一个类,那么这个类就具有多于一个的职责.同时,我 ...

随机推荐

  1. ruby的sort方法的重新认识

    ruby中的sort方法,这个方法可以加一个两个参数的block,这个block可以返回1 0 -1来表示这两个参数大于 等于 小于示例: str = ["192.160.175" ...

  2. windows下安装phpredis模块 (转)

    1.下载: http://pecl.php.net/package/redis/2.2.7/windows 2.下载后 由于里面有两个模块分别是vc6,vc9编译的,我们需要知道我们的Php是vc6还 ...

  3. php封装数据库函数

    从Thinkphp里面抽离出来的数据库模块,感觉挺好用 common.php <?PHP /** * 通用函数 */ //包含配置文件 if (is_file("config.php& ...

  4. JetBrains PyCharm专业版激活

    PyCharm最新2018激活码 激活时选择License server 填入 http://idea.imsxm.com 然后点击Active即可 PS:在线激活有一个过期时间,这个时间一过就必须再 ...

  5. [转]使用Runtime.getRuntime().exec()方法的几个陷阱

    Process 子类的一个实例,该实例可用来控制进程并获得相关信息.Process 类提供了执行从进程输入.执行输出到进程.等待进程完成.检查进程的退出状态以及销毁(杀掉)进程的方法. 创建进程的方法 ...

  6. fcitx五笔的安装[zz]

    Fcitx──小企鹅输入法:Free Chinese Input Toy for X是国产软件的精品,是一个以GPL方式发布的.基于XIM的简体中文输入法集合(原为G五笔),包括五笔.五笔拼音.二笔. ...

  7. iconv 使用方法封装

    std::string iconv_exec(const std::string& in, const char* fromcode, const char* tocode) { char b ...

  8. android:ellipsize="end" 失效或者 相关的Bug

    其实这文章有点傻逼. 相关的问题 TextView android:ellipsize=“end”超出一个字符时不显示…的解决 http://www.pocketdigi.com/20140122/1 ...

  9. 【iOS XMPP】使用XMPPFramewok(二):用户登录

    转自:http://www.cnblogs.com/dyingbleed/archive/2013/05/10/3069397.html 用户登录 准备工作 比较知名的开源XMPP服务器:一个是Ope ...

  10. C/C++中的volatile关键字

    volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据. 如果没有volatile关键字,则编译器可能优化读取和存 ...