今天在公司发现了一段很怪异的代码,为此还跟公司员工争执了一下,但由于自身是新员工,我只有无奈的屈服了,心里确实不爽,在这里发表一下自己的看法。先看一下代码,代码已经我已经简化了,只有两个类,一个是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编写的登录代码,只是一个很小的程序
在IT行业中,文本程序代码比较工具是开发人员和版本控制系统的不可或缺的一部分,它们能够帮助我们快速定位并理解两段代码之间的差异。这类工具对于代码审查、合并分支、追踪bug修复等任务至关重要。以下是对这个...
笔者精选了近300段JavaScript代码和400种解决方案,覆盖了几乎所有的脚本处理模块,最大程度地帮助读者学习、实践JavaScript的各个方面,让读者成为一个有代码实践、有思想品质、有技术深度的JavaScript高手。...
本文将介绍如何使用STM32F103R8T6上的定时器来计算一段代码的执行时间。 首先,了解STM32F103R8T6的定时器基本概念是必要的。该微控制器内置了多个通用定时器和高级控制定时器,每个定时器都可以配置为不同的模式。...
本资源是一个基于Java语言的源代码文件模板,总共六十页,每页五十行,主要涉及到嵌入式校园网网络质量监测系统的开发。以下是相关知识点的总结: 1. Java语言基础:该源代码文件模板使用Java语言编写,涉及到Java...
本资源提供了一款BIOS的源代码,对于那些想要深入理解BIOS工作原理或者进行BIOS开发的工程师来说,是一个极其宝贵的参考资料。 1. **BIOS源代码分析** - `bios.bin`:这是编译后的BIOS二进制文件,通常包含了执行...
- **原理**: GG机制通过定义一组规则来区分不同类型的G代码,确保在同一行中不会出现冲突的G代码指令。 - **算法**: 可以使用有限状态机(FSM)或其他逻辑算法来实现GG机制,确保每条G代码指令的正确性。 - **应用场景...
G代码由一系列指令组成,每个指令都代表一个特定的动作,例如G00表示快速定位,G01表示线性插补,G02和G03分别表示顺时针和逆时针圆弧插补等。理解并解析这些代码是实现G代码翻译的关键步骤。51单片机的内部结构包括...
这段描述强调了这个源代码包对于初学者的价值。在学习网站开发的过程中,参考现有的、功能完备的源代码可以帮助理解如何将理论知识应用到实际项目中。通过研究代码结构,开发者可以学习如何布局网页、如何处理用户...
在中国,组织机构代码由9位数字组成,包括一个校验码,确保每个代码的唯一性。生成器会按照这些规则生成符合标准的代码。 2. **自动化**:该工具应具备自动化功能,自动填充必要的信息,如机构名称、注册地等,减少...
在软件开发过程中,准确地统计代码量是一项重要的任务,它有助于评估项目的规模,跟踪开发进度,以及进行代码质量分析。Eclipse作为一个强大的Java集成开发环境(IDE),提供了丰富的插件支持,其中包括用于统计代码...
《重构:改善既有代码的设计》这本书由Martin Fowler撰写,是一本关于软件工程领域的经典著作。它详细介绍了如何通过一系列小步骤对现有代码进行改进,进而提升软件的整体质量和可维护性。作者不仅解释了重构的基本...
这些代码可以被用来创建富有创意且个性化的表白页面,为你的爱情增添一份特别的惊喜。这份资源包含了10个不同的效果,每个效果都有其独特的设计和互动体验,使用者可以根据个人喜好选择或参考,甚至可以进一步定制,...
在这个示例代码中,我们使用了一个简单的RNN模型,包含一个输入层、一个隐藏层和一个输出层。隐藏层使用sigmoid激活函数,输出层使用线性激活函数。 synapse_0、synapse_1和synapse_h 在RNN模型中,我们使用了三...
四元式序列由一系列的四元式组成,每个四元式包含四个部分:操作符、两个操作数以及一个结果变量。 为了实现该目标,我们设计了语法制导翻译算法,这一算法基于预定义的文法,能够针对输入的表达式生成对应的四元式...
EditPlus是一款功能强大的文本编辑器,尤其在编程领域广受欢迎,因为它提供了许多便捷的代码编辑功能,其中之一就是整段缩进。整段缩进在编程中扮演着至关重要的角色,它能够极大地提升代码的可读性和维护性。下面将...
《修改代码的艺术——Working Effectively with Legacy Code》是软件开发领域一本极其重要的著作,由Michael Feathers撰写。这本书深入探讨了如何在已有代码库(通常称为遗留代码)中进行有效的修改和维护工作,以...
在本资源包中,我们收集了一系列使用C语言编写的经典小游戏源代码,旨在帮助学习者深入理解和实践C语言编程。这些游戏包括双人贪吃蛇、别踩白方块、玫瑰花、矿井逃生以及超级玛丽游戏。让我们逐一探讨这些游戏的编程...
在现代软件开发过程中,源代码版本管理是一项至关重要的任务。良好的版本管理不仅能确保代码的完整性与安全性,还能提高团队协作效率,降低软件开发的成本。为此,本文档旨在规范公司的软件版本管理制度,明确开发源...
例如,当用户打开一个工作簿时自动运行一段代码。 6. **宏录制与编辑**:Excel的宏录制功能可以快速生成VBA代码,初学者可以通过查看和编辑宏代码来学习VBA。实例中可能包含宏的创建、修改和运行方法。 7. **对象...