今天在公司发现了一段很怪异的代码,为此还跟公司员工争执了一下,但由于自身是新员工,我只有无奈的屈服了,心里确实不爽,在这里发表一下自己的看法。先看一下代码,代码已经我已经简化了,只有两个类,一个是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编写的登录代码,只是一个很小的程序
G代码由一系列字母、数字和符号组成,每个代码或指令代表一个特定的动作,如移动刀具、设定速度、开始切割等。 C++ Builder是一款由Embarcadero Technologies开发的集成开发环境(IDE),它基于C++语言并提供了RAD...
在IT行业中,源代码是构建网站的基础,它是由程序员用编程语言编写的指令集合,用于告诉计算机如何执行特定任务。这个资源"25个经典网站源代码"提供了一个宝贵的参考资料库,适合初学者和经验丰富的开发者参考,以...
在中国,组织机构代码由9位数字组成,包括一个校验码,确保每个代码的唯一性。生成器会按照这些规则生成符合标准的代码。 2. **自动化**:该工具应具备自动化功能,自动填充必要的信息,如机构名称、注册地等,减少...
在描述中提到,很多科研工作者在发表文章时都需要查询PACS代码,这说明PACS代码在科研领域具有重要的应用价值。科研工作者在撰写文章时,根据研究的具体主题选择合适的PACS代码,可以方便读者根据代码快速检索到相关...
【旅游网站源代码】是一个专为学习和探索ASP编程技术而设计的项目,适用于那些希望了解或提升在旅游行业网站开发能力的人。这份源代码涵盖了旅游门户的基本功能和设计元素,为初学者提供了宝贵的实践资源。 ASP...
本文将详细解析"igh ethercat 台达电机控制代码"中的核心概念和技术要点,以及如何利用这段代码来驱动符合DS402协议的台达电机。 EtherCAT 主站是EtherCAT网络中的核心部分,它负责协调整个网络的操作,向从站设备...
7. **状态机实现**:为了管理复杂的协议流程,FPGA代码通常会包含一个状态机,根据协议的步骤和条件进行状态转换。 8. **验证**:在实现1553B协议的FPGA代码后,需要进行详尽的仿真和硬件验证,确保其在各种条件下...
本书是一本内容全面的恶意代码分析技术指南,其内容兼顾理论,重在实践,从不同方面为读者讲解恶意代码分析的实用技术方法。, 本书分为21章,覆盖恶意代码行为、恶意代码静态分析方法、恶意代码动态分析方法、恶意...
EditPlus是一款功能强大的文本编辑器,尤其在编程领域广受欢迎,因为它提供了许多便捷的代码编辑功能,其中之一就是整段缩进。整段缩进在编程中扮演着至关重要的角色,它能够极大地提升代码的可读性和维护性。下面将...
代码行数统计小工具是一款专为开发者设计的实用软件,主要功能是快速、准确地统计项目中的源代码行数。这个工具在软件开发过程中尤为重要,因为它可以帮助开发者了解项目的规模,评估工作量,以及进行代码质量分析。...
2. **逐行阅读代码**:仔细阅读每段代码,理解其功能和实现方法。 3. **分析注释**:注释是理解代码的关键,它解释了代码背后的思考过程。 4. **动手实践**:尝试修改和运行代码,理解各种变化对程序的影响。 5. **...
在本资源包中,我们收集了一系列使用VC++编写的经典游戏源代码,这些源代码提供了深入理解C++编程语言以及游戏开发基础的宝贵机会。通过分析和学习这些源码,开发者可以了解到如何利用C++来实现游戏逻辑、图形界面、...
Java2Pas是一个实用工具,主要用于将Java编程语言编写的源代码转换为Pascal语言的等效代码。这个工具对于那些需要在两种语言之间迁移代码或者理解不同编程语言语法的开发者来说非常有价值。Java和Pascal虽然都是面向...
你可以写出一段17位的指令代码,并放入ROM区,该CPU即可自动运行出结果。压缩包里是源代码和我们当时的设计要求。本源代码的最后调试时在地址0--17是放入的斐波纳契数字(Fibonacci Numbers)指令。通过modelsim仿真...
《Android第二行代码》是郭霖撰写的一本深入浅出的Android编程入门书籍,它旨在帮助初学者快速理解和掌握Android应用开发。这本书的全书源代码提供了丰富的实践示例,帮助读者通过动手实践来巩固理论知识。以下是...
文章中也提到了Matlab/Simulink模型到C/C++代码的自动实现,这进一步说明了Matlab/Simulink作为一个强大工具在自动化代码生成方面的应用。文中提到了相关的研究和开发,例如The MathWorks公司为Code Composer Studio...
代码注释是编程实践中至关重要的一个环节,它有助于提高代码的可读性和可维护性。注释率是指源代码中的注释行数占总代码行数的比例,通常用来衡量代码的文档质量。`linecount`是一款用于统计代码注释率的工具,其...
编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时, 在系统中有一个父进程和两个子进程活动。 让每一个进程在屏幕上显示一个字符:父进程显示“A”; 子进程分别显示字符“b”和“c”。试观察记录...
该项目的核心是一段用C++编写的源代码,它能够让开发者深入理解2D游戏设计与编程。游戏的源代码MC.cpp文件,包含了游戏的核心逻辑,例如游戏循环、用户输入处理、游戏状态更新、渲染逻辑等。在C++中,游戏循环是游戏...