单一职责原则

1.1 阅读干吗不直接用手机?

电子阅读器比较专注,而手机功能比较多,影响专注。

1.2 手机不纯粹

手机确实很方便。但是现在的手机就是一台小型智能电脑。它不仅能打电话,还能听音乐、看电影电视、与个人交流、与一群人群聊,可以随时表达自己的情绪,开心时告诉别人、难过时告诉别人、别人开心时送上祝福、别人倒霉时也可以嗑上瓜子看热闹。

1.3 电子阅读器vs.手机


理想的阅读,不管是优秀的小说,还是专业的图书,经过一段适应时间,可以进入一种沉浸状态,达到'心流'的境界。在这样的状态下,我们仿佛在作者面前与他交流,听他讲故事、听他表达思想,忘记了外界的环境、忘记了时间……进入这样的状态,我们会非常专注,废寝忘食,会拥有很大的充实感。

智能手机功能太强了,而且它会不断地接收外界的消息,有可能是朋友给你的留言,有可能某些突发的新闻,更有可能只是一些商业广告和骚扰短信。你确实在阅读,但同时,你也在不断被打扰。虽然这样的打扰并像来个电话那样直接打断你的阅读,不是非常强烈,但你被不停骚扰的过程中,沉浸阅读基本就不太可能了。有的打扰可能直接就吸引了你的注意力,甚至占用了你的阅读时间。比如你看书时来了条八卦新闻,你完全有可能点过去追新闻而浪费了阅读时间。电子阅读器的确可以避免这一点,它除了阅读什么都干不了。电子阅读器是针对阅读来制作的电子墨水屏,它最大的特点就是保护眼睛,可以长时间观看也不累。这也是强化沉浸阅读体验的设计之一。总的来说,电子阅读器只针对阅读来设计产品,做到了功能上的纯粹。而这也是我们面向对象程序设计的最重要原则之一——单一职责原则。

1.4 单一职责原则

就一个类而言,应该仅有一个引起它改变的原因。

1.5 方块游戏的设计

"我们再来举些例子,比如就拿手机里的俄罗斯方块游戏为例。要是让你开发这个小游戏,你如何考虑?"
"我想想,首先它方块下落动画的原理是画四个小方块,擦掉,然后再在下一行画四个方块。不断地绘出和擦掉就形成了动画,所以应该要有画和擦方块的代码。然后左右键实现左移和右移,下键实现加速,上键实现旋转,这其实都应该是函数,当然左右移动需要考虑碰撞的问题,下移需要考虑堆积和消层的问题。"
"OK,你也说了不少了。如果就用Android的方式开发,你打算怎么开发呢?"


"那当然是先建立一个窗体,然后加一个用于游戏框的控件,一个按钮Button来控制'开始',最后计时器控制用于分时动画的编程。写代码当然就是编写计时器事件来绘出和擦除方块,并做出堆积和消层的判断。再编写控件的键盘事件,按了左箭头则左移,右箭头则右移等。对了,还需要用到些GDI+技术的方法来画方块和擦方块。"
"你能不能就这些代码划分一下类呢?"
"分类?这里好像关键在于各种事件代码如何写吧,这里有什么类可言呢?"
"看来你的面向过程开发已经根深蒂固了。你把所有的代码都写在了窗体.java这个类里,你觉得这合理吗?"
"可能不合理,但我实在没想出怎么分离它。"

"打个比方,如果现在还要你开发的是3D版的俄罗斯方块,或者是Web版或Windows窗体版俄罗斯方块程序,它们能运行Java语言编写的应用程序。那你现在这个代码有什么可以复用的吗?"
"你都已经说了,不能使用,我当然就没法使用了。Copy过去,再针对代码做些改进吧。"
"但这当中,有些东西是始终没变的。"
"你是说,下落、旋转、碰撞判断、移动、堆积这些游戏逻辑吧?"


"说得没错,这些都是和游戏有关的逻辑,和界面如何表示没有什么关系,为什么要写在一个类里面呢?如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当变化发生时,设计会遭受到意想不到的破坏[ASD]。事实上,你完全可以找出哪些是界面,哪些是游戏逻辑,然后进行分离。"
"但我还是不明白,如何分离开。"
"你仔细想想看,方块的可移动的游戏区域,可以设计为一个二维整型数组用来表示坐标,宽10,高20,比如'int[,] arraySquare=new int[10,20];',那么整个方块的移动其实就是数组的下标变化,比如原方块在arraySquare [7,2]上,则下移时变成arraySquare [7,3],如果下移同时还按了左键,则是arraySquare [6,3]。每个数组的值就是是否存在方块的标志,存在为1,不存在时默认为0。这下你该明白,所谓的碰撞判断,其实就是什么?"

"我知道了,是否能左移,就是判断arraySquare [x,y]中的x–1是否小于0,否则就撞墙了。或者arraySquare [x–1,y]是否等于1,否则就说明左侧有堆积的方块。所谓堆积,不过是判断arraySquare [x,y+1]是否等于1的过程,如果是,则将自己arraySquare [x,y]的值改1。那么消层,其实就是arraySquare [x,y]中循环x由0到9,判断arraySquare [x,y]是否都等于1,是则此行数据清零,并将其上方的数组值遍历下移一位。"
"那你就应该明白了,所谓游戏逻辑,不过就是数组的每一项值变化的问题,下落、旋转、碰撞判断、移动、堆积、消层这些都是在做数组具体项的值的变化。而界面表示逻辑,不过是根据数组的数据进行绘出和擦除,或者根据键盘命令调用数组的相应方法进行改变。因此,至少应该考虑将此程序分为两个类,一个是游戏逻辑的类,一个是窗体的类。当有一天要改变界面,或者换界面时,不过是窗体类的变化,和游戏逻辑无关,以此达到复用的目的。"
"这个听起来容易,真正要做起来还是有难度的哦!"
"当然,软件设计真正要做的许多内容,就是发现职责并把那些职责相互分离[ASD]。其实要去判断是否应该分离出类来,也不难,那就是如果你能够想到多于一个的动机去改变一个类,那么这个类就具有多于一个的职责[ASD],就应该考虑类的职责分离。"
"的确是这样,界面的变化是和游戏本身没有关系的,界面是容易变化的,而游戏逻辑是不太容易变化的,将它们分离开有利于界面的改动。"

1.6 电子阅读器与手机的利弊


这下你知道你的手机为什么不能让我们进行沉浸式阅读的原因了吧?
如果手机只用来接听电话,电子阅读器用来阅读,职责的分离是可以把事情做得更好。不过这其实不是一回事哦,现在的智能手机承担的职责多,并不等于就不可以做好,只不过产品的分工不同而已。整合当然是一种很好的思想。比如搜索引擎最初的理想就是将一切的需求都整合到一个文本框里提交,用干净的页面来吸引用户,导致互联网的一场变革。但现在分类信息、垂直搜索又开始流行,这却是单一职责的思想体现。现在智能手机整合了拍照、音视频播放、互联网等很多功能,携带方便,随时使用,也无须携带各种充电器,已经是非常好的产品。而电子阅读器功能纯粹,强化阅读体验,也是非常好的产品设计。不同的人会选择不同的产品满足自己的需要吧。对于我们编程来说,要在类的职责分离上多思考,做到单一职责,这样你的代码才是真正的易维护、易扩展、易复用、灵活多样。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/520167.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于java+SpringBoot+Vue的大学生入学审核系统设计与实现

基于javaSpringBootVue的大学生入学审核系统设计与实现 开发语言: Java 数据库: MySQL技术: SpringBoot VUE工具: IDEA/Eclipse、Navicat、Maven 系统展示 前台展示 入学办理模块:学生可以提交入学申请并跟踪入学办理进度。 后台展示 学生管理模块&#xff1…

【Docker系列】在 Linux 上安装 Docker Compose 的简明步骤

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

前端学习之DOM编程案例:抽奖案例

代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>抽奖案例</title><style>*{margin: 0;padding: 0;}</style> </head> <body><div id"container"&g…

【放假第3天】幻兽帕鲁 雾锁王国 我的世界 游戏云服务器选购指南 附最新价格对比表 新手、小白秒懂

更新日期&#xff1a;4月6日&#xff08;半年档 价格回调&#xff0c;京东云采购季持续进行&#xff09; 本文纯原创&#xff0c;侵权必究 【云服务器推荐】价格对比&#xff01;阿里云 京东云 腾讯云 选购指南视频截图 《最新对比表》已更新在文章头部—腾讯云文档&#xf…

LeetCode 1483.树节点的第 K 个祖先:树上倍增

【LetMeFly】1483.树节点的第 K 个祖先&#xff1a;树上倍增 力扣题目链接&#xff1a;https://leetcode.cn/problems/kth-ancestor-of-a-tree-node/ 给你一棵树&#xff0c;树上有 n 个节点&#xff0c;按从 0 到 n-1 编号。树以父节点数组的形式给出&#xff0c;其中 paren…

redis主从复制与哨兵模式

redis主从复制 Redis主从复制&#xff08;Redis replication&#xff09;是Redis提供的一种数据备份和故障转移机制。通过主从复制&#xff0c;可以将一个Redis服务器&#xff08;主节点&#xff09;的数据复制到一个或多个Redis服务器&#xff08;从节点&#xff09;。这样做…

【面经】interrupt()、interrupted()和isInterrupted()的区别与使用

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;面经 ⛺️稳中求进&#xff0c;晒太阳 interrupt方法 如果打断线程正在sleep&#xff0c;wait&#xff0c;join会导致被打断的线程抛出InterruptedException&#xff0c;并清除打断标记。如…

FebHost:什么是土耳其.TR域名?

当前互联网高速发展,一个国家的顶级域名已成为其网络形象的重要标识。近期,土耳其国家顶级域名”.TR”引起了广泛关注,成为业界热议的话题。 作为代表土耳其共和国的国家顶级域名(ccTLD),.TR域名于1991年首次引入,由土耳其科技和信息技术部负责管理。除了常见的”.com.tr”、”…

画图理解JVM相关内容

文章目录 1. JVM视角下&#xff0c;内存划分2. 类内存分布硬核详解1. 获取堆内存参数2. 扫描堆内存&#xff0c;定位实例3. 查看实例所在地址的数据4. 找到实例所指向的类信息的地址5. 查看class信息6. 结论 3. Java的对象创建流程4. 垃圾判别算法4.1 引用计数法4.2 可达性分析…

GD32F470_光敏电阻光照传感器模块移植手册

2.3 光敏电阻光照传感器 光敏电阻是用硫化隔或硒化隔等半导体材料制成的特殊电阻器&#xff0c;其工作原理是基于内光电效应。随着光照强度的升高&#xff0c;电阻值迅速降低&#xff0c;由于光照产生的载流子都参与导电&#xff0c;在外加电场的作用下作漂移运动&#xff0c;电…

如何从文本数据中提取子列表

提取文本数据中的子列表可以通过各种方式实现&#xff0c;具体取决于文本数据的结构和提取子列表的条件。例如&#xff1a;使用字符串操作和条件判断、使用正则表达式、使用自然语言处理工具、使用自定义解析器等几种模式&#xff0c;那么对于在日常使用中会有那些问题呢 &…

ssm基于HTML5的出租车管理系统论文

摘 要 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代&#xff0c;所以对于信息的宣传和管理就很关键。因此出租车信息的管…

知识融合:知识图谱构建的关键技术

目录 一、引言二、知识图谱基础2.1 知识表示三元组属性图 2.2 知识抽取实体抽取关系抽取属性抽取 三、知识融合的核心问题3.1 实体识别与链接实体识别实体链接 3.2 重复实体合并方法示例 3.3 关系融合挑战方法示例 四、知识融合技术深度解析4.1 基于规则的方法规则设计原则规则…

13 - 关于存储器读写的问题

---- 整理自B站UP主 踌躇月光 的视频 1. 存储器存在的问题 前面章节存储器存在问题&#xff0c;读取和写入分开&#xff0c;会造成读写冲突&#xff0c;所以设计要改成写时没法读。 1.1 单字节存储器 片选 CS1&#xff0c;WE1 时&#xff0c;EN0&#xff0c;写入 片选 CS1&am…

CLoVe:在对比视觉语言模型中编码组合语言

CLoVe:在对比视觉语言模型中编码组合语言 摘要引言相关工作CLoVe: A Framework to Increase Compositionality in Contrastive VLMsSynthetic CaptionsHard NegativesModel Patching CLoVe: Encoding Compositional Language inContrastive Vision-Language Models 摘要 近年来…

MySQL-排序与分页

1. 排序 如果没有使用排序操作&#xff0c;默认情况下查询返回的数据是按照添加数据的顺序显示的。 SELECT * FROM employees;1.1 基本使用 1&#xff09;使用 ORDER BY 对查询到的数据进行排序操作。 升序&#xff1a;ASC(ascend)降序&#xff1a;DESC (descend) 练习&am…

ARM汇编与逆向工程:揭秘程序背后的神秘世界

文章目录 一、ARM汇编语言&#xff1a;底层世界的密码二、逆向工程&#xff1a;软件世界的侦探工作三、ARM汇编与逆向工程的完美结合四、ARM汇编逆向工程的风险与挑战五、ARM汇编逆向工程的未来展望《ARM汇编与逆向工程 蓝狐卷 基础知识》内容简介作者简介译者简介ChaMd5安全团…

商标“五分法”,如何起名显著性更强通过率更高!

1976年在Abercrombie一案美国判例中提出的商标五分法&#xff0c; 基本上在全球范围内得到认可和共识&#xff0c;普推知产老杨平常检索时&#xff0c;我国一些专家相关的论文及专著和判例中也会经常涉及到。 商标五分法主要是把商标分成个五种类型&#xff0c; 通用的&#xf…

Linux 常用命令(持续更新中...)

1. ls 查看文件列表命令 语法&#xff1a; ls [-a -l -h] [Linux路径] -a -l -h 是可选的选项 &#xff08;-h需配合-l命令一起使用&#xff09;Linux路径是此命令可选的参数 ls #查看当前目录所有非隐藏文件(平铺方式显示) ls -a #查看当前目录下所有文件 …

多线程+互斥+条件变量题目

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;题目解析 目录 &#x1f449;&#x1f3fb; 完成两个线程通过条件变量实现交替打印错误代码加优化(c线程库版本)版本2&#xff08;使用phtread.h库&#xff…