坚实原则:单一责任原则

单一责任原则是首字母缩写词的第一原则。

“一个班级只有一个改变的理由。”

每个模块或类都应对软件提供的功能的单个部分负责,并且该责任应由类完全封装。

例如,想象一下导航软件的场景。
我们根据给定的方向(北,南,西,东)改变了位置。

Position类包含有关x和y轴位置的值。

package com.gkatzioura.solid.single;public class Position {private Integer xAxis;private Integer yAxis;public Position(Integer xAxis, Integer yAxis) {this.xAxis = xAxis;this.yAxis = yAxis;}public Integer getxAxis() {return xAxis;}public void setxAxis(Integer xAxis) {this.xAxis = xAxis;}public Integer getyAxis() {return yAxis;}public void setyAxis(Integer yAxis) {this.yAxis = yAxis;}
}

这个方向是一个枚举,代表朝北,向东,向南和向西的方向。

package com.gkatzioura.solid.single;public enum Direction {N,W,S,E
}

最后有一个Navigator类,负责根据方向和位置的变化进行导航。

public class Navigator {public Position navigate(Position position, Direction direction) {....}}

为了正确导航,导航器应根据方向解析下一个位置。 同样,导航器应在值小于0的情况下固定位置。

public class Navigator {public Position navigate(Position position, Direction direction) {Position nextPosition = resolve(position,direction);Position fixedPosition =fix(nextPosition);return fixedPosition;}public Position resolve(Position position,Direction direction) {switch (direction) {case N:return new Position(position.getxAxis(),position.getyAxis()+1);case S:return new Position(position.getxAxis(),position.getyAxis()-1);case W:return new Position(position.getxAxis()-1,position.getyAxis());case E:return new Position(position.getxAxis()+1,position.getyAxis());default:throw new IllegalArgumentException();}}public Position fix(Position position) {return new Position(position.getxAxis()<0?0:position.getxAxis(),position.getyAxis()<0?0:position.getyAxis());}}

这种方法的问题在于,如果位置有效性标准发生更改,我们必须更改Navigator类。 位置移动机构变更的情况也相同。 导航器不仅要导航,而且还要解决下一个位置并确定新位置。

不违反单一职责原则的方法是创建一个将解决下一个职位的类,并负责确定新职位。

NextPositionResolver类将根据给定的方向解析下一个位置。

package com.gkatzioura.solid.single;public class NextPositionResolver {public Position resolve(Position position,Direction direction) {switch (direction) {case N:return new Position(position.getxAxis(),position.getyAxis()+1);case S:return new Position(position.getxAxis(),position.getyAxis()-1);case W:return new Position(position.getxAxis()-1,position.getyAxis());case E:return new Position(position.getxAxis()+1,position.getyAxis());default:throw new IllegalArgumentException();}}}

如果无效的x或y值,PositionRepairer类将固定位置。

package com.gkatzioura.solid.single;public class PositionRepairer {public Position fix(Position position) {return new Position(position.getxAxis()<0?0:position.getxAxis(),position.getyAxis()<0?0:position.getyAxis());}}

Navigator类将具有NextPositionResolver和PositionRepairer类作为依赖项,以便正确执行导航。

package com.gkatzioura.solid.single;public class Navigator {private NextPositionResolver nextPositionResolver;private PositionRepairer positionRepairer;public Navigator(NextPositionResolver nextStepResolver,PositionRepairer positionRepairer) {this.nextPositionResolver = nextStepResolver;this.positionRepairer = positionRepairer;}public Position navigate(Position position, Direction direction) {Position nextPosition =  nextPositionResolver.resolve(position,direction);Position fixedPosition = positionRepairer.fix(nextPosition);return fixedPosition;}}

您可以在github上找到源代码。 下一个原则是开放/封闭原则。

另外,我还编写了备忘单,其中包含一些扎实的原则。
在链接中注册以接收它。

翻译自: https://www.javacodegeeks.com/2018/02/solid-principles-single-responsibility-principle.html

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

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

相关文章

rust的项目管理

cargo cargo是rust的包管理工具 创建的一个项目 cargo new expr编写完代码之后记得编译一下&#xff0c;然后运行 cargo build运行项目cargo run 当我们觉得项目编译起来太慢了的时候可以将项目编辑成release版本 cargo run --releasecrate 在 Rust 里&#xff0c;一个项目…

宋利兵 mysql_《MySQL 5.7 Replication新特性》分享之互动问题解答

分享主题《MySQL 5.7 Replication新特性》嘉宾介绍宋利兵&#xff0c;MySQL研发工程师。2009年加入MySQL全球研发团队,从事MySQL复制相关功能的开发。主题介绍主要分享在MySQL 5.7中&#xff0c;Replication(复制)相关的一些新特性&#xff0c;比如多源复制、增强半同步复制、并…

使用Eclipse Deeplearning4j构建简单的神经网络

神经网络导论 深度学习既包含深度神经网络又包含深度强化学习&#xff0c;这是机器学习的子集&#xff0c;而机器学习本身就是人工智能的子集。 广义上讲&#xff0c;深度神经网络执行机器感知&#xff0c;该机器感知从原始数据中提取重要特征&#xff0c;并对每个观察结果做出…

mysql 注入 绕过防火墙_绕过阿里云防火墙继续扫描探测和SQL注入

前言如今的互联网&#xff0c;WAF泛滥的年代&#xff0c;实在让我等脚本小子苦恼ing&#xff0c;尤其是阿里云服务器的自带防护&#xff0c;那不是一般的叫人牙疼&#xff0c;十个站8个站都是阿里云....最近遇到几个站都是阿里云的服务器&#xff0c;比如&#xff1a;泛微e-col…

坚实原则:依赖倒置原则

到目前为止&#xff0c;我们只研究了单一职责 &#xff0c; 打开/关闭 &#xff0c; liskov替换和接口隔离原则。 依赖倒置是我们要研究的最后一个原理之一。 该原则指出 答&#xff1a;高级模块不应依赖于低级模块。 两者都应依赖抽象。 B.抽象不应依赖细节。 细节应取决于…

python处理中文字符串_python字符串中的中文处理

LeetCode 374&period; Guess Number Higher or LowerWe are playing the Guess Game. The game is as follows: I pick a number from 1 to n. You have to gues ...【HDU】1693 Eat the Treeshttp://acm.hdu.edu.cn/showproblem.php?pid1693 题意:nm的棋盘求简单回路(可以…

java创建类的三个步骤_3个简单步骤即可测试Java 8

java创建类的三个步骤即将发布的Java 8版本为Java开发人员带来了许多新功能&#xff0c;但是升级时始终存在代码破裂的风险。 我们都记得Java 7出厂时有一系列非常严重的错误 。 当然&#xff0c;我们所有人都可以帮助避免在Java 8中出现相同的问题。我今天要介绍的方法是使用…

mybatis嵌套查询和嵌套结果有什么区别_Java面试专题之九:Mybatis面试5个大概率被问到的问题...

1、为什么说 Mybatis 是半自动 ORM 映射工具&#xff1f;它与全自动的区别在哪里&#xff1f;Hibernate 属于全自动 ORM 映射工具&#xff0c;使用 Hibernate 查询关联对象或者关联集合对象时&#xff0c;可以根据对象关系模型直接获取&#xff0c;所以它是全自动的。而 Mybati…

使用Pargon-neo进行5G sync相关的测试

前言 Paragon-neo是Calnex旗下的一款测试仪器&#xff0c;主要用于5G的高精度场景下的PTP与SyncE的测试&#xff0c;它可以提供高达100GbE的测试速度&#xff0c;可以用在ITU-T G.8273.2 C/D类边界时钟测试&#xff0c;符合O-RAN的O-DU和O-RU设备&#xff0c;以及设计和部署5G…

功能Java示例 第1部分–从命令式到声明式

函数式编程&#xff08;FP&#xff09;的目的是避免重新分配变量&#xff0c;避免可变的数据结构&#xff0c;避免状态并全程支持函数。 如果将功能性技术应用于日常Java代码&#xff0c;我们可以从FP中学到什么&#xff1f; 在这个名为“ Functional Java by Example”的系列…

python怎样使用各个日期赤纬_python--日期操作

import datetimedatetime有几个常用类:date time datetime timedelta1. 今天日期时间(今天时间)>>> import datetime>>> now datetime.datetime.now()>>> print now2014-06-04 21:08:32.952591(今天日期)>>> print datetime…

常用的光电模块SFP、QSFP等解析

前言 学习记录 BNC 是用来接同轴电缆的接口&#xff0c;好处是降低了信号之间的相互干扰&#xff1b;主要市场是安防行业以及一些使用同轴电缆作为传输介质的令牌以太网。举个例子就是小时候的电视机后面经常能够看见这种线&#xff0c;BNC接头中间有一个凸起来的针&#xff…

python最短路径例子_Python实现的多叉树寻找最短路径算法示例

本文实例讲述了Python实现的多叉树寻找最短路径算法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;多叉树的最短路径&#xff1a;思想&#xff1a;传入start 和 end 两个 目标值1 找到从根节点到目标节点的路径2 从所在路径&#xff0c;寻找最近的公共祖先节点&#…

零分钟即可在容器开发套件(CDK)上实现云运营

尽管这很有趣&#xff0c;但实际上并不可行&#xff0c;很快就遇到了使用限制。前一段时间&#xff0c; 我逐步完成了在容器中安装称为CloudForms的云管理解决方案。 真正的解决方案是将这个示例放入Red Hat Demo Central集合中&#xff0c;并将其放在基于开放技术的Cloud解决…

NTPv4协议解析

前言 本文的撰写基于RFC5905.NTP 是时间网络控制协议&#xff0c;V4版本相交V3版本&#xff0c;修复了V3存在的一些问题。尤其是NTPV4的拓展时间戳鼓励使用浮动双数据类型&#xff0c;这样使得NTP能够更好的支持1ns的场景&#xff0c;轮询间隔也从上一代的最多1024s拓展到了36…

c++中的引用和python中的引用_【总结】C++、C#、Java、Javascript、Python中引用的区别...

首先分两大阵营&#xff1a;C中引用是一块阵营&#xff0c;C#、Java、Javascript、Python中引用是另一块阵营。之所以这样分是因为同一阵营中引用使用方法基本一样。C引用本质是个常量指针&#xff0c;而其他语言引用本质是个普通指针。也就意味着C的引用一旦初始化(指向确定了…

看完这篇还不会化简卡诺图?你来打我

最通俗易懂的的卡诺图化简教程 首先我们来介绍一下什么是卡诺图&#xff1a; 卡诺图是逻辑函数的一种图形表示。一个逻辑函数的卡诺图就是将此函数的最小项表达式中的各最小项相应地填入一个方格图内&#xff0c;此方格图称为卡诺图。 卡诺图的构造特点使卡诺图具有一个重要性…

javabean 连接mysql_连接mysql的javabean实例+简单分页

连接mysql的javabean实例简单分页rs.getString(user_id)rs.getString(user_name)rs.getString(user_mail)rs.getString(user_adds)int Cint(String cint){try {int n;n Integer.parseInt(cint);return n;}catch (NumberFormatException e) {return 0;}}%>int PageSize5; //设…

java 工厂方法模式_Java中的工厂方法模式

java 工厂方法模式在上一篇有关模板方法模式的文章中 &#xff0c;我展示了如何利用lambda表达式和默认方法 。 在本文中&#xff0c;我将探讨工厂方法模式&#xff0c;并了解如何利用方法引用&#xff0c;这是Java 8中与lambda表达式一起添加的另一项功能。 让我们考虑一个Ve…

几种常见的集成触发器(D、T、JK)

同步RS触发器存在“空翻”现象&#xff0c;即触发器存在多次翻转的现象&#xff0c;空翻破坏了“时序电路按时钟节拍工作&#xff0c;每个时钟脉冲作用下电路的状态只发生一次转换”的基本原则 解决方法&#xff1a;将电平触发改为边沿触发&#xff0c;使得触发器旨在时钟脉冲…