【Java】浅谈关于代码的耦合性
【Java】浅谈关于代码的耦合性
- 前言
- 一、需求
- 二、简单的实现
- 1.资源代码(项目提供)
- 2.对需求的普通实现
- 三、利用业务与逻辑分离的方式实现
- 改进
- 四、对需求改进后的同步项目改进(优点)
- 总结
前言
前几天一个在公司里的朋友对还正在Java的道路上的我说了一些关于代码耦合性的问题,刚好今天碰上一个很好的案例,就拿来运用一下,用这个简单的案例突出一下**业务与逻辑分离**的一种思想,希望能对大家有所帮助。
一、需求
根据用户选择从而获取网络资源或本地资源。(实现会非常的简单,此文章的意义在于利用反射突出 业务与逻辑分离 的优点)
二、简单的实现
1.资源代码(项目提供)
资源的父类:
public abstract class DataSource {public abstract void getData();
}
本地资源:
public class LocalDataSource extends DataSource{@Overridepublic void getData() {System.out.println("获取本地资源");}
}
网络资源:
public class NetworkDataSource extends DataSource{@Overridepublic void getData() {System.out.println("获取网络资源");}
}
2.对需求的普通实现
代码如下:
import java.util.Scanner;public class Test01 {public static void main(String[] args) {Scanner scan = new Scanner(System.in);System.out.println("请选择资源: 1.本地资源 2.网络资源");int num = scan.nextInt();LocalDataSource localDataSource = new LocalDataSource();NetworkDataSource networkDataSource = new NetworkDataSource();if(num == 1) {localDataSource.getData();//获取本地资源}else if(num == 2){networkDataSource.getData();//获取网络资源}scan.close();}
}
实现的截图:
简单的实现结束,但是大家有没有想过,如果客户针对需求改进,增加其他的资源,程序编写者将做何改变呢?在源码上修改输出?重新实例化一个对象然后再增加一个判断方式?也许一个你觉得简单,如果客户增加了多种资源的获取途径呢?这只是个简单的项目,如果后续的项目涉及到更多的关联,改变源码会变成一个很不明智的行为。
接下来将 利用反射体现一下 业务与逻辑分离 的思想,以及这样编写的优势。
三、利用业务与逻辑分离的方式实现
改进
首先编写配置文件:
import java.util.ArrayList;
import java.util.List;//配置文件
public class Config {public static List<String> nameList = new ArrayList<>();public static List<String> classPathList = new ArrayList<>();static{nameList.add("本地资源");nameList.add("网络资源");classPathList.add("packet.class.LocalDataSource");classPathList.add("packet.class.NetworkDataSource");}}
对测试代码的改进:
import java.util.List;
import java.util.Scanner;public class Test01 {public static void main(String[] args) throws Exception {/*** 利用反射 -- 传达 业务与逻辑分离 的思想*/Scanner scan = new Scanner(System.in);System.out.println("请选择资源: ");printMenu(); //后续更新的资源会自动填补打印int num = scan.nextInt();DataSource dataSource = getDataSource(num);dataSource.getData();scan.close();}//根据用户的选择,创建出对应的数据对象public static DataSource getDataSource(int num) throws Exception{List<String> classPathList = Config.classPathList;String classPath = classPathList.get(num-1);Class<?> c = Class.forName(classPath);DataSource dataSource = (DataSource) c.newInstance();return dataSource;}//打印菜单public static void printMenu(){List<String> nameList = Config.nameList;StringBuilder sb = new StringBuilder();for (int i = 0; i < nameList.size(); i++) {sb.append(i+1);sb.append(".");sb.append(nameList.get(i));sb.append(" ");}System.out.println(sb.toString());}
}
虽然代码增多了,但耦合性也降低了,如果客户提供了新的需求,更改会非常的方便,更改如下:
四、对需求改进后的同步项目改进(优点)
新需求:在原先功能上增加一个其他类资源。
这是新增的其他资源:
//其他资源
public class OtherDataSource extends DataSource{@Overridepublic void getData() {System.out.println("获取其他资源");}
}
该如何改进呢?很简单!我们只需要在配置文件里增加一个新的类名和类路径,不需要对源码做任何修改。如图所示:
让我们看一下运行结果:
总结
通过这个简单的案例,相信大家也对业务与逻辑分离的思想有了一定的认识。能降低耦合性就降低耦合性,情愿写麻烦一点也不要让耦合性太高,耦合性太高的代码,移植和改造都很不容易。
【Java】浅谈关于代码的耦合性相关推荐
- 浅谈Python代码风格规范 PEP8
浅谈Python PEP8 本文只简要谈及一下,python的编码风格指南-PEP8. PEP8 全称<Python Enhancement Proposal #8>译作:8号Python ...
- 【架构】软件代码的耦合性和内聚性,以几个简单小例子说明
1. 起因 这篇文章应该算作前两篇文章的后续思考. 在前两篇文章中,考虑到了分层的方法,参考了别人的代码架构. [架构]工程代码结构(附带NXP.ST官方demo) [架构]嵌入式软件架构设计 模块化 ...
- js压缩代码后怎么生成source map_浅谈前端代码加密
作者简介:于航,PayPal Senior Software Engineer,在 PayPal 上海负责 Global GRT 平台相关的技术研发工作.曾任职于阿里巴巴.Tapatalk 等企业.f ...
- java hexits,[Java]浅谈Java的异常体系
为什么需要异常 理想的情况下,程序是不会有BUG的.但是现实的情况是:处处都可能引发BUG,比如一个糟糕的输入.需要访问的资源不存在.网络出现抖动.服务器资源不足等等.这就要求我们的程序需要一个机制来 ...
- 浅谈PHP代码执行的大致流程(opcode)
说到这个代码执行流程啊,咱也不说太多,先给大家分享一张图片: 怎么样?有点了解了么.说实话,单看这个,我本人是有点懵的,不过,不要怕.咱们来慢慢地看下. 首先,在网上找的信息说 ...
- java浅谈线程安全之锁
在java锁的知识中,我们首先要知道分布式锁和本地锁的概念. 1.本地锁: 在单进程的系统中,存在多个线程去同时操作某个共享变量时,就需要使用本地锁,最常用的关键字:synchronized 2.分布 ...
- 【代码注释】浅谈对于代码注释的理解
楔子:"这里的山路十八弯,这里的水路九连环":智慧的古人就懂得,通过把山路修成九曲十八弯来战胜陡峭的高坡.看则舍近求远绕圈而行,实为拿路程换高度,为完成登顶而蓄势待发.这种螺旋上升 ...
- java:浅谈axis调用webservice接口
[申明:此代码已经经过测试可以正确使用:但内容解释为个人见解,如有不准确之处,请指教. 阅读前请先仔细阅读"[]"中的说明文字,以免与您的需求不符而 ...
- 汇智动力学院——Java 浅谈数据结构和算法
以前不管自己还是朋友在面试java工程师岗位的时候,都会被问到这样的问题: "介绍下java中的数据结构和算法", 很多朋友被问到的时候发现无从下口,甚至特别是一些初级java工程 ...
最新文章
- 狄斯奎诺算法 c语言,图的邻接表实现迪杰斯特拉算法(C语言).doc
- python如何引用txt_如何使用pip requirements.txt文件安装python模块附加组件
- 数据之光 · 安全未来 | 第四届中国数据安全治理高峰论坛圆满召开!
- python函数回顾:abs()
- java:数据库连接池
- Java中的Swing键盘绑定案例
- seay源代码审计系统的使用方式
- OpenCV-Python教程:色彩空间变换(cvtColor)
- linux系统怎么清理磁盘空间,分享5个如何给Ubuntu系统清理磁盘空间、清除垃圾的方法...
- Ubuntu 访问共享文件夹
- matlab脚本栏中间有条线,word中间有一根线 word中间有一条线如何去掉
- 软件下载地址链接收藏
- 《基于短时分数阶傅里叶变换的时频分析方法》
- Mongodb操作基础 分片
- 计算机术语我喜欢你,摩斯密码表白高级表白密码 摩斯密码我喜欢你数字
- 奥鹏计算机文化基础在线考试,奥鹏中国石油大学北京《计算机文化基础》在线考试客观题答案.doc...
- windows 如何查看、修改MAC地址?
- iOS 3DES加密无盐值加密
- 阿里巴巴fastjson下载
- webdriver启动浏览器、设置profile加载插件步骤详解
热门文章
- 如何安装NationalInstruments.NI4882
- web前端35个jQuery小技巧!
- 深度强化学习落地指南总结(二)-动作空间设计
- App自动化测试之Java平台下使用Appium测试App(二)
- Android 4.0 全屏显示,在我的原道n90 ICS 4.0.3版本实验通过
- 机器学习评价指标AUC计算公式
- mdx格式的词典用什么软件打开_别用百度翻译、有道查词典了?试试这个软件吧!...
- 航天院做程序员,是一种什么体验?
- 查询所有连接到ORACLE服务器的客户端IP地址的方法
- UNIX 网络编程第三版