单一职责原则

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 电子阅读器与手机的利弊


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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Unity+Vue3通信交互的WebGL项目发布实践

基于UnityVue3通信交互的WebGL项目发布实践 实践路线 基于UnityVue3通信交互的WebGL项目发布实践问题背景准备工作解决方案项目实践小目标搭建Unity测试项目 创建Vue3测试项目运行项目验证unity和vue通信功能总结与展望 问题背景 我们最近需要把unity开发的pc项目迁移到web端&…

设计方案-定时任务接口数据存储及更新策略

前言 在没有使用ETL工具且不考虑多数据源的情况下,我们需要从别的系统获取数据时,一般会选择分页接口查询并存储。本文算是我对类似场景代码的提炼,旨在总结相关套路,提升自我对数据库和模块的设计能力。 ETL(英文 Extract-Trans…

Prometheus +Grafana +node_exporter可视化监控Linux + windows虚机

1、介绍 背景:需要对多台虚机进行负载可视乎监控,并进行及时的报警 2、架构图 node_exporter :主要是负责采集服务器的信息。 Prometheus :主要是负责存储、抓取、聚合、查询方面。 Grafana : 主要是…

JMeter 测试脚本编写技巧

JMeter 是一款开源软件,用于进行负载测试、性能测试及功能测试。测试人员可以使用 JMeter 编写测试脚本,模拟多种不同的负载情况,从而评估系统的性能和稳定性。以下是编写 JMeter 测试脚本的步骤。 第 1 步:创建测试计划 在JMet…

5.6 物联网RK3399项目开发实录-Android开发之U-Boot 编译及使用(wulianjishu666)

物联网入门到项目实干案例下载: https://pan.baidu.com/s/1fHRxXBqRKTPvXKFOQsP80Q?pwdh5ug --------------------------------------------------------------------------------------------------------------------------------- U-Boot 使用 前言 RK U-B…

首个基于SSM-Transformer混合架构,开源商业大模型Jamba

3月29日,知名AI研究实验室AI21在官网开源了,首个基于SSM-Transformer混合架构的商业大模型——Jamba。 目前,ChatGPT、Stable Difusion 、Lyria等产品使用的皆是Transformer架构,虽然在捕捉序列内长距离依赖关系、泛化能力、特征…

【数据结构】新篇章 -- 顺序表

🌈 个人主页:白子寰 🔥 分类专栏:python从入门到精通,魔法指针,进阶C,C语言,C语言题集,C语言实现游戏👈 希望得到您的订阅和支持~ 💡 坚持创作博文…

今天起,Windows可以一键召唤GPT-4了

ChatGPT狂飙160天,世界已经不是之前的样子。 新建了人工智能中文站https://ai.weoknow.com 每天给大家更新可用的国内可用chatGPT资源 发布在https://it.weoknow.com 更多资源欢迎关注 微软 AI 大计的最后一块拼图完成了? 把 Copilot 按钮放在 Window…

【算法】01背包问题(代码+详解+练习题)

题目: 有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。 第 i 件物品的体积是 vi,价值是 wi。 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。 输出最大价值。 输入格式 第一行两个整…

基于LEAP模型的能源环境发展、碳排放建模预测及不确定性分析

在国家“3060”碳达峰碳中和的政策背景下,如何寻求经济-能源-环境的平衡有效发展是国家、省份、城市及园区等不同级别经济体的重要课题。根据国家政策、当地能源结构、能源技术发展水平以及相关碳排放指标制定合理有效的低碳能源发展规划需要以科学准确的能源环境发…

Nessus【部署 01】Linux环境部署漏洞扫描工具Nessus最新版详细过程分享(下载+安装+注册+激活)

Nessus最新版详细部署过程分享 1. 获取激活码2.主程序下载安装启动2.1 下载2.2安装2.3 启动 3.许可证及插件3.1 许可证获取3.2 插件安装 4.安装总结 Nessus官方网站: https://www.tenable.com/products/nessus/nessus-essentials 及介绍: 国际数据公司&…

MyBatis——Dao代理服务

MyBatis框架提供一个用用来降低开发人员进行Dao层开发负担技术,开发人员只需要书写SQL映射文以及用于推送sql语句的Dao接口即可 此时由MyBatis框架负责在内存中创建Dao接口的实现类并生成其实例对象 MyBatis框架作者提供Dao代理服务是面对的问题: 如何确认Dao接口与…

【面试专题】Spring高频面试题

1.Spring应该很熟悉吧?来介绍下你的Spring的理解 有些同学可能会抢答,不熟悉!!! 好了,不开玩笑,面对这个问题我们应该怎么来回答呢?我们给大家梳理这个几个维度来回答 1.1 Spring的发展历程 先介绍Spring是怎么来的…

vue3组合式函数

vue3的组合式函数的作用是封装和复用响应式状态的函数。只能在setup 标签的script标签汇总或者setup函数中使用。 普通的函数只能调用一次,但是组合式函数接受到响应式参数,当该值发生变化时,也会触发相关函数的重新加载。 如下 定义了一个…

【docker】Dockerfile自定义镜像

📝个人主页:五敷有你 🔥系列专栏:中间件 ⛺️稳中求进,晒太阳 1.Dockerfile自定义镜像 常见的镜像在DockerHub就能找到,但是我们自己写的项目就必须自己构建镜像了。 而要自定义镜像,就…

嵌入式网络硬件方案

一. 简介 本文来了解一下嵌入式有些网络中,涉及的网络硬件方案。 注意:本文说明的是有些网络。 提起网络,我们一般想到的硬件就是“网卡”,“网卡”这个概念最早从电脑领域传出来,顾名思义就是能上网的卡。在电脑领…

如何使用剪映专业版剪辑视频

1.操作界面功能介绍 2.时间线的使用 拖动前端后端缩减时长,有多个素材可以拖动调节前后顺序拼接。 分割视频 删除

【数据结构】——二叉树堆的实现

大佬们点点关注,点点赞?! 前言 在上篇博客中我们已经介绍了树和二叉树的相关概念,相信大家都已经清楚了树和二叉树的基本思想,下面我们就来着重看看二叉树堆的实现。 在看堆的实现,我们先看看二叉树的顺…

《QT实用小工具·一》电池电量组件

1、概述 项目源码放在文章末尾 本项目实现了一个电池电量控件,包含如下功能: 可设置电池电量,动态切换电池电量变化。可设置电池电量警戒值。可设置电池电量正常颜色和报警颜色。可设置边框渐变颜色。可设置电量变化时每次移动的步长。可设置…

脑部肿瘤检测YOLOV8

脑部肿瘤检测,采用YOLOV8训练得到PT模型,然后转换成ONNX,OPENCV调用,支持C/PYTHON/ANDORID开发脑部肿瘤检测YOLOV8