【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】浅谈关于代码的耦合性相关推荐

  1. 浅谈Python代码风格规范 PEP8

    浅谈Python PEP8 本文只简要谈及一下,python的编码风格指南-PEP8. PEP8 全称<Python Enhancement Proposal #8>译作:8号Python ...

  2. 【架构】软件代码的耦合性和内聚性,以几个简单小例子说明

    1. 起因 这篇文章应该算作前两篇文章的后续思考. 在前两篇文章中,考虑到了分层的方法,参考了别人的代码架构. [架构]工程代码结构(附带NXP.ST官方demo) [架构]嵌入式软件架构设计 模块化 ...

  3. js压缩代码后怎么生成source map_浅谈前端代码加密

    作者简介:于航,PayPal Senior Software Engineer,在 PayPal 上海负责 Global GRT 平台相关的技术研发工作.曾任职于阿里巴巴.Tapatalk 等企业.f ...

  4. java hexits,[Java]浅谈Java的异常体系

    为什么需要异常 理想的情况下,程序是不会有BUG的.但是现实的情况是:处处都可能引发BUG,比如一个糟糕的输入.需要访问的资源不存在.网络出现抖动.服务器资源不足等等.这就要求我们的程序需要一个机制来 ...

  5. 浅谈PHP代码执行的大致流程(opcode)

        说到这个代码执行流程啊,咱也不说太多,先给大家分享一张图片:     怎么样?有点了解了么.说实话,单看这个,我本人是有点懵的,不过,不要怕.咱们来慢慢地看下.     首先,在网上找的信息说 ...

  6. java浅谈线程安全之锁

    在java锁的知识中,我们首先要知道分布式锁和本地锁的概念. 1.本地锁: 在单进程的系统中,存在多个线程去同时操作某个共享变量时,就需要使用本地锁,最常用的关键字:synchronized 2.分布 ...

  7. 【代码注释】浅谈对于代码注释的理解

    楔子:"这里的山路十八弯,这里的水路九连环":智慧的古人就懂得,通过把山路修成九曲十八弯来战胜陡峭的高坡.看则舍近求远绕圈而行,实为拿路程换高度,为完成登顶而蓄势待发.这种螺旋上升 ...

  8. java:浅谈axis调用webservice接口

     [申明:此代码已经经过测试可以正确使用:但内容解释为个人见解,如有不准确之处,请指教.              阅读前请先仔细阅读"[]"中的说明文字,以免与您的需求不符而 ...

  9. 汇智动力学院——Java 浅谈数据结构和算法

    以前不管自己还是朋友在面试java工程师岗位的时候,都会被问到这样的问题: "介绍下java中的数据结构和算法", 很多朋友被问到的时候发现无从下口,甚至特别是一些初级java工程 ...

最新文章

  1. 狄斯奎诺算法 c语言,图的邻接表实现迪杰斯特拉算法(C语言).doc
  2. python如何引用txt_如何使用pip requirements.txt文件安装python模块附加组件
  3. 数据之光 · 安全未来 | 第四届中国数据安全治理高峰论坛圆满召开!
  4. python函数回顾:abs()
  5. java:数据库连接池
  6. Java中的Swing键盘绑定案例
  7. seay源代码审计系统的使用方式
  8. OpenCV-Python教程:色彩空间变换(cvtColor)
  9. linux系统怎么清理磁盘空间,分享5个如何给Ubuntu系统清理磁盘空间、清除垃圾的方法...
  10. Ubuntu 访问共享文件夹
  11. matlab脚本栏中间有条线,word中间有一根线 word中间有一条线如何去掉
  12. 软件下载地址链接收藏
  13. 《基于短时分数阶傅里叶变换的时频分析方法》
  14. Mongodb操作基础 分片
  15. 计算机术语我喜欢你,摩斯密码表白高级表白密码 摩斯密码我喜欢你数字
  16. 奥鹏计算机文化基础在线考试,奥鹏中国石油大学北京《计算机文化基础》在线考试客观题答案.doc...
  17. windows 如何查看、修改MAC地址?
  18. iOS 3DES加密无盐值加密
  19. 阿里巴巴fastjson下载
  20. webdriver启动浏览器、设置profile加载插件步骤详解

热门文章

  1. 如何安装NationalInstruments.NI4882
  2. web前端35个jQuery小技巧!
  3. 深度强化学习落地指南总结(二)-动作空间设计
  4. App自动化测试之Java平台下使用Appium测试App(二)
  5. Android 4.0 全屏显示,在我的原道n90 ICS 4.0.3版本实验通过
  6. 机器学习评价指标AUC计算公式
  7. mdx格式的词典用什么软件打开_别用百度翻译、有道查词典了?试试这个软件吧!...
  8. 航天院做程序员,是一种什么体验?
  9. 查询所有连接到ORACLE服务器的客户端IP地址的方法
  10. UNIX 网络编程第三版