一个开发原则,永远不要返回NULL

看一篇文章:10个经典的java开发原则,里面一个原则:永远不要返回NULL。

为什么,因为很多代码都是 a.b(......).c(...) 这么连着调用。如果每层调用都要检查是否为空的话,代码就太难看了。

但是不返回null,返回什么呢?显然要反悔一个类的实例,但是怎么保证得到的结果是预期的呢,也就是说,怎么能保证这样虽然不会报“未交对象引用设置到对象的实例”(实际上就是空引用)这个错误,但是能得到“正确”的结果呢。显然,应该是nul但是没有返回null是得不到正确的结果,但是我们要保证结果是可控的,也就是说,虽然代码顺利执行下来了,但是我们要知道实际上啥也不应该做。或者,我们要针对这种情况,返回可以接受的结果。

至于什么事可以接受的结果,这个有么有一定的原则和规律呢,还是需要具体问题具体分析呢?体育老师教的语文,自己都觉得没说明白,绕!

一类里要有个标志,表示出“虽然是个非空的实例,但是它确实代表null”这个意思。问题接着追下去,如果是这个意思的话,那么他的方法应该做什么呢?也就是要解答:如果不存在这个实例,那么这个方法应该是什么业务逻辑。搞清楚了这个,就可以写这样的代码了:

假设那个标志命名为  nullInstance;

if ( nullINstance ) then {

不存在这个实例的业务逻辑;

}else{

正常的业务逻辑。

}

这么说太抽象了,我们举个实际的例子吧。

设计如下简单场景:删除员工所属的部门,

(1)员工类:employee,

(2)员工所属部门(我们用方法来表示吧,不用属性了,为了说明问题):getDepartment()

(3)部门类:department;

(4)部门的删除方法:delete();

那么:

getDepartment(){

if( nullINstance  ){ //如果员工类是空的话

       return new Department( nullInstance=true ); //创建一个”空“实例;

else{

return new department( thisd.deptID); //返回一个具体的部门类

}

}

那么:类department.delete()的实现:

delete(){

if( nullINstance  ){ //如果空的话

return ;

else

执行删除方法:delete from department where deptid = 2222;

}

考,这也够麻烦的啊!不过麻烦我一个,方便千万人。雷锋精神永垂不朽!

是这样吗?没有把握。

时间: 2024-10-12 15:28:16

一个开发原则,永远不要返回NULL的相关文章

Android开发:getViewById返回null的原因定位

最近在研究开发一些基于Android的App,遇到了一些问题,其中一个比较关键的是在Activity中的onCreate()方法中获取Button对象,代码大概如下: private Button mTrueButton; @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_quiz); mTr

【c语言】模拟实现strchr函数,功能:在一个字符串中查找一个字符第一次出现的位置,如果没有出现返回NULL

// 模拟实现strchr函数,功能:在一个字符串中查找一个字符第一次出现的位置,如果没有出现返回NULL #include <stdio.h> #include <assert.h> char const* my_strchr(char const *p,char c) { assert(p != NULL); while (*p) { if (*p == c) return p; else p++; } return NULL; } int main() { char *p =

给定一个二叉树的dfs遍历结果(NULL记为*),重构二叉树,返回头节点

给定一个二叉树的dfs遍历结果(NULL记为*),重构二叉树,返回头节点. 思路:第一遍先把*也插入到树中,第二遍把*改成NULL. 如果直接把*记录为NULL,那再来一个节点就不知道,到底是*赋值的NULL,还是本身自带的NULL. 1 #include <bits/stdc++.h> 2 using namespace std; 3 4 struct TreeNode{ 5 char val; 6 TreeNode* left; 7 TreeNode* right; 8 TreeNode(

SeaJS基本开发原则

SeaJS基本开发原则在讨论SeaJS的具体使用前,先介绍一下SeaJS的模块化理念和开发原则.使用SeaJS开发JavaScript的基本原则就是:一切皆为模块.引入SeaJS后,编写JavaScript代码就变成了编写一个又一个模块,SeaJS中模块的概念有点类似于面向对象中的类--模块可以拥有数据和方法,数据和方法可以定义为公共或私有,公共数据和方法可以供别的模块调用.另外,每个模块应该都定义在一个单独js文件中,即一个对应一个模块.下面介绍模块的编写和调用.模块的定义及编写模块定义函数d

C#操作xml SelectNodes,SelectSingleNode总是返回NULL 与 xPath 介绍

读取XML节点属性: XmlNode schoolNode = xmldoc.SelectSingleNode("/school"); string schoolName = schoolNode.Attributes["name"].Value; 一.SelectNodes,SelectSingleNode总是返回NULL 下面以一个简单的xml为例: <?xml version="1.0"?> <message xmlns=

Type.GetType()在跨程序集反射时返回null的解决方法

在开发中,经常会遇到这种情况,在程序集A.dll中需要反射程序集B.dll中的类型.如果使用稍有不慎,就会产生运行时错误.例如使用Type.GetType("BNameSpace.ClassName")在程序集A.dll获取程序集B.dll中的类型,就会返回Null. 关于跨程序集的反射,有两点需要注意: 1.如果使用typeof,编译能通过,则跨程序集的反射一定可以正常运行.可以说,typeof是支持强类型的.比如 1 Type supType = typeof(BNameSpace

敏捷软件开发原则

敏捷软件开发原则 ----<敏捷软件开发原则.模式与实践>学习笔记 最近在系统地学习并且有意地在工作中实践敏捷软件开发,文章乍看起来,都是一些说教性.理论性,比较无聊的东西. 但是如果静下心来结合自己自身的经历.思考地去阅读,可能会发现,有的观点确实很赞同,然而有的可能会有自己的想法. 以下是在<敏捷软件开发 原则.模式与实践>一些读书笔记,斜体字是直接摘录于书本,非斜体字是自己的一些理解.   一.尽早的,持续地交互有价值的软件来使客户满意.初期交付的系统功能越少,最终交付的系统

Android:解决view.getDrawingCache()返回null的问题

项目开发中,有时候需要将某个View的内容(包含其子View)以图片的方式保存下来(类似于截图),于是首先想到view.getDrawingCache()这个方法,它将返回一个Bitmap. 可是我在使用时,这个方法总是返回null,总网上查了下,需要设置一堆的参数,但依然不怎么好使. 突然想到换一个思路,既然获取View的内容这么困难,还不如将 View 的内容直接draw到另一个canvas上去!于是解决方案诞生了,亲测可用: public static Bitmap getViewBitm

开发原则&amp;设计模式

1.关于软件开发中的开发原则和设计模式: 1.1.开发原则 1.1.1.什么是开发原则? 开发原则就是开发的依据,只要依照这些原则进行开发,将来开发的软件具有很强的扩展力,很低的耦合度. 开发原则不属于java语言,也不属于任何一个编程语言,开发原则属于软件工程学的内容. 1.1.2.常见的开发原则? - 开闭原则:所有开发原则中有一个最基本的原则,该原则叫做:OCP[开闭原则],其它所有的原则都是围绕OCP开展的. * 连接数据库的信息编写到配置文件当中,不要编写到java源程序当中,这就是符