今天在公司发现了一段很怪异的代码,为此还跟公司员工争执了一下,但由于自身是新员工,我只有无奈的屈服了,心里确实不爽,在这里发表一下自己的看法。先看一下代码,代码已经我已经简化了,只有两个类,一个是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;
}
}
或许并不是每个人都认同我这种做法,不过我个人觉得这样比较合理,软件设计的时候要讲究层次,各层应该干得事情,就应该在所在层做好,而不是有其下层来保证,这种强依赖下层保证是一种很恶心的做法,如果后续下层代码逻辑变更,还得去上层看看对其的影响,这就很无耻了!!!
分享到:
相关推荐
自定义每隔一段时间自动按下空格键,当然你可根据代码改变你要按的键。
.net代码生成器 C#代码生成器内置辅助类!!!一键生成含所有源码!!!
里面的代码包括VC++2008/VC++2010编写的完成端口服务器端的代码,还包括一个对服务器端进行压力测试的客户端,都是经过我精心调试过,并且带有非常详尽的代码注释的。当然,作为教学代码,为了能够使得代码结构清晰...
该程序是C++实现频谱分析的一段源代码,用到的方法是快速傅立叶变换(FFT)。
同时一个mail note将被发送给消息发送者,发送一个e-mail通知给由recipient参数确定的e-mail账号,查询mail 服务器的会话…… 还包括消息客户端程序,通过连接创建会话。创建发送者和映射消息。发送消息,同时对文本...
代码随想录-八股文 PDF 是一个涵盖了程序员学习必备的内容的知识星球精华,总结了包括 C++、Java、Go 在内的多种编程语言,数据结构和算法、操作系统、数据库、计算机网络、设计模式、Linux 等高频考点。该 PDF 由...
编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时, 在系统中有一个父进程和两个子进程活动。 让每一个进程在屏幕上显示一个字符:父进程显示“A”; 子进程分别显示字符“b”和“c”。试观察记录...
等等一系列问题。本资源就可以为你解决你所面临的这些问题,原始HTML+CSS+JS页面设计, web大学生网页设计作业源码,这是一个不错的网页制作资源合集,画面精美,非常适合初学者学习使用。 多套(HTML+CSS+JS)网页...
完整的OpenGL编程指南第八版源代码,
大部分取自《重构——改善既有代码》一书,部分取自其他书籍或者自编。 每一项重构对应一个package。 CodeRefactor 工程是重构前的代码 CodeRefactorExcise 是重构后的代码 里面的重构步骤与《重构》一书微有差异...
目前该版本可以支持mysql,oracle数据库,生成的代码包含bean文件Service文件还有jsp文件 template文件夹里面有四个模版文件(可以修改生成你想要的代码)。 具体配置步骤如下: 一、配置数据库基本信息,如...
一种残差加权的TDOA定位算法C语言代码。。
可用于对VC++、C++ Builder、Delphi、VB、C/C++、ASM、Java、C#、SQL 等程序源码进行详细的统计,可以准确的分析出程序中代码行、注释行和空白行的行数。程序会自动根据你选择的文件类型选择相应的统计方式,并将...
使用线程控制显示/隐藏按钮, 无操作一段时间后,隐藏显示的按钮
利用WMI代码生成器可以执行查询或者执行一个方法等,还可以查看当前或者远程电脑上的命名空间以及其下的类,并且还可以生成相关的代码(不然就不叫WMI代码生成器了),支持生成的代码类型包括VBS、C#及VB.NET,默认...
《代码大全》第二版中文pdf是一本非常有价值的编程书籍,涵盖了编程语言、软件设计、编程实践、代码质量、项目管理等多方面的知识点。下面是从该书籍中提取的相关知识点: 1. 编程语言:该书籍涵盖了多种编程语言,...
代码有两份,一份是在网上下载的,另一份是自己整理后编写的。编程环境为Python2.7。因为只是用来学习随机森林算法,所以在调参方法没下多少功夫,正确率可能不太高,当然数据集比较小也是一个原因。感兴趣的童鞋可以...
81个Python爬虫源代码,内容包含新闻、视频、中介、招聘、图片资源等网站的爬虫资源
一、实验题目 表达式中间代码生成 二、实验目的 熟悉算术表达式的语法分析与中间代码生成原理。 三、实验内容 1. 构造算术表达式的四元式翻译文法 2. 设计算术表达式的递归下降子程序分析算法 3. 设计算术表达的...