今天在公司发现了一段很怪异的代码,为此还跟公司员工争执了一下,但由于自身是新员工,我只有无奈的屈服了,心里确实不爽,在这里发表一下自己的看法。先看一下代码,代码已经我已经简化了,只有两个类,一个是action层,另一个是Service层,具体如下:
Action:
package com.yf.test;
import java.util.List;
public class Action {
public void excute(){
List list=null;
list=Service.doSomething();
if(list.isEmpty()){
/*
*此处省略其他操作
*/
}
}
}
Service
package com.yf.test;
import java.util.ArrayList;
import java.util.List;
public class Service {
public static List doSomething() {
List list = new ArrayList();
if(1==2){
/*
* 此处省略对list的其他操作
* list=.....
*/
}
return list;
}
}
当我看到if(list.isEmpty()){时,发现潜在产生空指针异常的可能,然后就给同事说了一下,这里应该先判断List是否为null,然后他让我看Service层,说Service不会返回null,我看了一下,确实不会返回为null,但是关于这段代码,我觉得写的实在太烂,为什么烂,主要有一下几个原因:
1、在Service层,每次调用doSomething方法时,都实例化一个List,虚拟机都会在堆中为这个list开辟内存,这无疑实在浪费内存和虚拟机的,而且这个list只有在if条件成立时,才需要,如果if不成立,虚拟机还得在方法调用结束后,回收这块内存,这难道不是没事找事吗??
2、在Action层,action不对返回的list做非null判断,这也是一种很恶心的做法,首先,根据面向对象的封装性,Service层中的实现对Action而言,应该是不可见的,Action层应该对其返回值的可能情况做判断,即list!=null必须在Action做,如果后续Service层单独抽出,以API提供Jar包的形式,即我们无法知道里面的具体细节,这时,Action层还得做非空判断。因此,本人觉得,这段代码应该做如下重构
Action:
package com.yf.test;
import java.util.List;
public class Action {
public void excute(){
List list=null;
list=Service.doSomething();
if(list!=null&&list.isEmpty()){
/*
*此处省略其他操作
*/
}
}
}
Service
package com.yf.test;
import java.util.ArrayList;
import java.util.List;
public class Service {
public static List doSomething() {
List list=null;
if(1==2){
list= new ArrayList();
/*
* 此处省略对list的其他操作
* list=.....
*/
}
return list;
}
}
或许并不是每个人都认同我这种做法,不过我个人觉得这样比较合理,软件设计的时候要讲究层次,各层应该干得事情,就应该在所在层做好,而不是有其下层来保证,这种强依赖下层保证是一种很恶心的做法,如果后续下层代码逻辑变更,还得去上层看看对其的影响,这就很无耻了!!!
分享到:
相关推荐
一段由java编写的登录代码,只是一个很小的程序
谨慎运行啊,死机了别怪我!这个用来对付那些动不动就喜欢来测测你的... 您可能感兴趣的文章:一段非常简单的让图片自动切换js代码一段js小代码,计算距春节还有多少天一段多浏览器的复制到剪贴板javascript代码Discuz
笔者精选了近300段JavaScript代码和400种解决方案,覆盖了几乎所有的脚本处理模块,最大程度地帮助读者学习、实践JavaScript的各个方面,让读者成为一个有代码实践、有思想品质、有技术深度的JavaScript高手。...
《超实用的jQuery代码段》是由周敏编著的一部汇集了众多实用jQuery代码的资源集合,旨在帮助开发者提升在Web开发中的效率和效果。jQuery是一个强大的JavaScript库,它简化了HTML文档遍历、事件处理、动画制作以及...
在中国,组织机构代码由9位数字组成,包括一个校验码,确保每个代码的唯一性。生成器会按照这些规则生成符合标准的代码。 2. **自动化**:该工具应具备自动化功能,自动填充必要的信息,如机构名称、注册地等,减少...
G代码,也称为RS-274代码,是一种标准化的编程语言,由一系列字母、数字和符号组成,用于指示机床执行各种动作,如直线切割、圆弧运动、刀具更换等。 在“数控G代码解释器”中,以下几个关键知识点是必不可少的: ...
7. **状态机实现**:为了管理复杂的协议流程,FPGA代码通常会包含一个状态机,根据协议的步骤和条件进行状态转换。 8. **验证**:在实现1553B协议的FPGA代码后,需要进行详尽的仿真和硬件验证,确保其在各种条件下...
四元式序列由一系列的四元式组成,每个四元式包含四个部分:操作符、两个操作数以及一个结果变量。 为了实现该目标,我们设计了语法制导翻译算法,这一算法基于预定义的文法,能够针对输入的表达式生成对应的四元式...
【标题】"一个大型门户网站源代码"所涉及的知识点涵盖了多个方面,主要集中在ASP.NET框架的应用上,这是一项用于构建动态网站、Web应用程序和Web服务的技术。ASP.NET是由微软开发的,它基于.NET Framework,提供了...
本书是一本内容全面的恶意代码分析技术指南,其内容兼顾理论,重在实践,从不同方面为读者讲解恶意代码分析的实用技术方法。, 本书分为21章,覆盖恶意代码行为、恶意代码静态分析方法、恶意代码动态分析方法、恶意...
EditPlus是一款功能强大的文本编辑器,尤其在编程领域广受欢迎,因为它提供了许多便捷的代码编辑功能,其中之一就是整段缩进。整段缩进在编程中扮演着至关重要的角色,它能够极大地提升代码的可读性和维护性。下面将...
《修改代码的艺术——Working Effectively with Legacy Code》是软件开发领域一本极其重要的著作,由Michael Feathers撰写。这本书深入探讨了如何在已有代码库(通常称为遗留代码)中进行有效的修改和维护工作,以...
例如,当用户打开一个工作簿时自动运行一段代码。 6. **宏录制与编辑**:Excel的宏录制功能可以快速生成VBA代码,初学者可以通过查看和编辑宏代码来学习VBA。实例中可能包含宏的创建、修改和运行方法。 7. **对象...
你可以写出一段17位的指令代码,并放入ROM区,该CPU即可自动运行出结果。压缩包里是源代码和我们当时的设计要求。本源代码的最后调试时在地址0--17是放入的斐波纳契数字(Fibonacci Numbers)指令。通过modelsim仿真...
《Android第二行代码》是郭霖撰写的一本深入浅出的Android编程入门书籍,它旨在帮助初学者快速理解和掌握Android应用开发。这本书的全书源代码提供了丰富的实践示例,帮助读者通过动手实践来巩固理论知识。以下是...
代码注释是编程实践中至关重要的一个环节,它有助于提高代码的可读性和可维护性。注释率是指源代码中的注释行数占总代码行数的比例,通常用来衡量代码的文档质量。`linecount`是一款用于统计代码注释率的工具,其...
编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时, 在系统中有一个父进程和两个子进程活动。 让每一个进程在屏幕上显示一个字符:父进程显示“A”; 子进程分别显示字符“b”和“c”。试观察记录...
- **初始化阶段**:这一阶段可能涉及设置处理器的工作模式、清除BSS段、设置堆栈指针等基本任务,为后续的代码执行提供稳定的环境。 #### u-boot中.lds连接脚本文件的分析 **.lds**文件是链接器脚本(Linker ...
matlab不运行一段代码点评:Ndepend 2017.3 抽象的 Ndepend提供CQLINQ,即对C#代码的LINQ请求,以提供开放的,可编辑的,记录的,可自定义的指标,并以不同的方式(图形,矩阵,树形列表)呈现它们,因此开发人员,...
总的来说,"eclipse4.4代码高亮插件"的安装和使用是一个简单但有效的方式,它提升了Eclipse 4.4的用户体验,使得开发者在编程过程中能够享受到更加美观和舒适的环境。通过调整和个性化代码颜色方案,开发过程变得...