飞云小侠 2005-7-23
http://www.jscud.com 转载请注明作者
【空接口的使用】
在接口使用的时候,空接口有2种情况:
1.类似Cloneable,Serializable,他们往往是做一个标记,表示需要某个功能.当然你也可以这么用,来表示你的类具有某个功能,实现了你的某个接口.
2.你的接口继承了别的接口(非空),你的接口本身没有声明函数.这种情况一般是你不希望用户使用父接口来作为参数类型,因为他们的用途可能不同,此时就可以用空接口来实现.
第一种情况我们不再多说,搜索一下关于Cloneable,Serializable的文章就会了解很多.
我们来看下面的代码:
public interface Text { String getText(); }
public interface SqlText extends Text { } |
可以看到,Text接口是用于返回一个字符串.而SqlText是一个空接口,它继承了Text接口.也就是说SqlText也是一种Text.但是我们可以知道,任何一个字符串不一定是Sql字符串,所以此时声明了一个SqlText接口来用于表名当前的字符串是一个Sql字符串.你的函数可以这样声明:
public void doQuery(SqlText aSqlText)
而不是这样
public void doQuery(Text aText)
避免用户产生歧义的想法,一眼看去,就明白应该传入一个Sql字符串.
【继承层次过多】
一般来说,继承的层次不要过多,否则使用者可能会讨厌,找一个函数会很麻烦.很多Java语言检查工具都建议你的继承层次不要超过3层.
【Has A ,Is A,不要滥用继承】
"我是一个Mp3","我有一个Mp3",其实很容易分辨.但是在实际应用中,往往存在把"我有一个Mp3"的情况当作"我是一个Mp3",或者是为了偷懒方便而放松了对自己的要求,甚至还沾沾自喜,感觉找到一个捷径.(scud以前也干过这种事情).
以前我曾经这样干过:我的逻辑类直接继承了我的数据库访问类,这样我可以直接在逻辑类里面访问:
public MyLogic extends MyDBA
aLogic.getInt("click"); aLogic.getString("name");
|
看起来是非常方便,但是你的逻辑类就牢牢绑在了DBA上,是一种非常不好的做法.现在我这样声明:
public MyLogic
MyDBA adba;
adba.getInt("click"); adba.getString("name");
|
其实代码改动不大,但是你的逻辑类不在牢牢绑在DBA身上了,何乐而不为.
其实这种现象在开发人员中间可能经常见到,我们要尽量避免.下面再来看一个例子:
//一个保存分页信息的类
public class PageInfo { private int page; private int pageCount; private int recPerPage; private int recCount;
//get,set method list... }
|
一般的情况是,在Dao中进行分页查询,计算总记录,总页数等等,所以需要把PageInfo传给Dao.而在逻辑类中,把传回来的分页信息数据推到FormBean或者是Action中.
也许你会这么想,如果我的Action或者FormBean继承了PageInfo,岂不是要省很多事.
千万别这么干.并不是所有的动作都需要分页信息,你的FormBean和PageInfo没有继承的关系.也就是说FormBean Has A PageInfo,但是不是Is A PageInfo.
【保持外观/行为一致】
外观一致其实很容易理解,例如你用size()表示得到一个List的大小,那么在所有的List类中你都用size()得到它的大小,这就是外观一致.
外观一致让用户更方便使用你的函数库,不用记住几个不同的表示同一个功能的函数名字.或者几个名字相同功能却不同的函数.那就很糟糕了.
行为一致相对外观一致就相对比较难做到,但是优秀的设计师肯定会让他的成果行为一致,而不是出人意料的行为,也不是一套强行规定的行为.
我们来看下面的代码:
import java.util.HashMap; import java.util.Map;
class UserInfo { private String realname;
public UserInfo(String sName) { this.realname = sName; }
public void setName(String sName) { this.realname = sName; } public String getName() { return this.realname; } }
public class MyTest {
Map userInfoMap = new HashMap();
public void setUserInfo(String sName,UserInfo aInfo) { userInfoMap.put(sName,aInfo);
userInfoMap.put(aInfo.getName(),aInfo); }
public UserInfo getUserInfo(String sName) { return (UserInfo)userInfoMap.get(sName); }
public static void main(String args[]) { MyTest aTest = new MyTest();
UserInfo aUserInfo = new UserInfo("王小二");
aTest.setUserInfo("儿童团团长",aUserInfo); aTest.setUserInfo("三班班长",aUserInfo);
UserInfo 儿童团团长 = aTest.getUserInfo("儿童团团长");
if(null!=儿童团团长) { System.out.println(儿童团团长.getName()); } else { System.out.println("儿童团团长 Not Found"); }
UserInfo 王小二 = aTest.getUserInfo("王小二");
if(null!=王小二) { System.out.println(王小二.getName()); } else { System.out.println("王小二 Not Found"); }
} }
|
可以看到,上面的代码运行结果是"王小二",也就是说儿童团团长是王小二,王小二本身也是王小二,这一切正常.
现在我们把setUserInfo里面的第一句注释掉:
public void setUserInfo(String sName,UserInfo aInfo) { //userInfoMap.put(sName,aInfo);
userInfoMap.put(aInfo.getName(),aInfo); }
|
再次运行上面的代码,我们发现儿童团团长不存在了,但是王小二还在.还可以看出,如果找"三班班长"的话,肯定也找不到,也就是说只有依据王小二的真名才能找到王小二,其他方法就不行了.
从上面的setUserInfo和getUserInfo分析,如果采用修改后的代码,我们的程序就出现了行为表现不一致,而这是令人迷惑不解的,我们set了半天,却找不到,岂不是令人恼火!
当然上面的代码比较简单,通过简单的修改就能做到行为一致,但在实际编程中,往往因为复杂的行为操作,经常会造成行为不一致,从而给开发人员带来困惑.
分享到:
相关推荐
### 库路径迷踪:在 CMake 中解决找不到库的终极指南 CMake 作为一款强大的跨平台构建工具,被广泛应用于各种类型的软件项目中,无论是开源还是商业项目。其核心优势在于高度的可定制性以及对不同平台的良好支持。...
综合来看,这个JavaWeb登录注册页面项目涵盖了Web开发中的多个关键点,包括用户认证、安全防护、数据库操作和项目管理,是学习和实践JavaWeb开发的一个良好实例。通过深入理解并实现这些功能,开发者可以提升自己的...
它利用了Web开发的主流技术和设计模式,为用户提供了便捷、高效的服务。同时,系统的可扩展性和灵活性也为其在实际应用中适应更多场景提供了可能。对于学习JavaWeb开发的人员来说,这样的项目既是对技术栈的实践,也...
4. 柠檬素材部屋.txt 和 迷踪魅影.txt:这些文本文件可能是关于皮肤设计过程的说明,或者是设计师对"魅影迷踪"风格的灵感来源和创作思路的记录。 5. ad:这个文件名可能是广告相关的,可能包含广告代码或者关于如何...
**MVC三层架构详解** 在软件开发中,MVC(Model-View-Controller)模式是一种广泛应用的架构设计,尤其在Web应用中。该模式将应用逻辑分为了三个主要部分...理解和实践这样的案例对于提升Java Web开发能力非常有帮助。
AICANS 2.0攻克安防机器人迷踪失明症.pdf 本资源文件主要介绍了机器人和智能安防系统的相关知识点。以下是从标题、描述、标签和部分内容中生成的相关知识点: 1. 机器人技术在安防行业的应用:随着机器人技术的...
《迷踪失路》是一款基于Unity引擎开发的第一人称恐怖迷宫游戏,它融合了惊悚元素和解谜挑战,为玩家带来独特的游戏体验。在这款游戏中,玩家将扮演主角,置身于一个阴森恐怖的迷宫之中,寻找出路的同时,还要面对...
-鼠标单击即可射击 -按住单击即可为光束充电,直到充电条充满电,松开即可射击 -WASD 键移动 -收集地图上分布的 3 颗宝石 -收集完 3 颗宝石后,进入位于地图中心的大门 -你需要玩得开心。 SJA 分析数据: ...
系统设计报告可能会详细涵盖需求分析、系统架构设计、数据库设计、界面设计、功能模块实现以及性能优化等多个方面。数据库文件可能包含了图书信息表、用户信息表等,用于存储系统运行所需的数据。 通过这个项目,...
JavaBean是Java开发中的一个组件模型,可以看作是封装了特定业务逻辑的对象,它们在JSP中被用作可重用的代码段,简化了开发过程。 【JavaBean】在这里可能被用来实现成绩计算、查询等功能。例如,一个JavaBean可能...
SSM整合是Java Web开发中常见的一种技术栈组合,由Spring、SpringMVC和MyBatis三个框架共同构成。这个组合在企业级应用中广泛使用,因为它提供了灵活的依赖注入、强大的MVC功能以及轻量级的数据访问能力。下面将详细...
通过卫星图片测算图片驻点步骤1:在定时时角和赤纬处,添加(0,0)处星星的时角和赤纬,可以用stellarium 步骤2:而在定义平面坐标处添加星星坐标,这里坐标可以用geogebra来测量,不过我是按照鬼蝉的计算方法来写的...
SpringBoot是一个由Pivotal团队开发的Java框架,它简化了初始化和配置过程,使得开发者可以更快地构建独立的、生产级别的基于Spring的应用。在瑞吉外卖项目中,SpringBoot可能被用来管理依赖、提供内嵌式Web服务器...
在生物学分类系统中,微生物的分类是按照一个严格的阶元体系进行的,这个体系包括了界(Domain)、门(Phylum)、纲(Class)、目(Order)、科(Family)、属(Genus)和种(Species)。这个阶元体系是生物学家为了...
【C/C++、easyX】一款迷宫类记忆力游戏——《暗夜迷踪》-附件资源
1. JDK(Java Development Kit):Java开发工具包,是编写、运行Java程序必不可少的工具。在Linux中,我们需要下载对应版本的JDK,并通过`sudo apt-get install`或`yum install`命令进行安装,然后设置环境变量,...
PNG图标和3D ICON是两种常见的图形资源,广泛应用于软件开发、网页设计、移动应用界面以及各种视觉传达项目。在本资源包中,包含了2100张128x128像素大小的PNG图标和38张3D效果的ICON,为设计师和开发者提供了丰富的...
【人教版小学二年级语文(下册)生字表】是针对中国小学生设计的一份教学材料,旨在帮助学生在二年级下学期学习并掌握基本的汉字书写和认读。这个生字表分为两个部分:生字表(一)和生字表(二),涵盖了多个主题,...
在标签中提到了"迷踪风暴",这可能是指一种特定的文本挖掘工具或技术,用于追踪和分析文本中的热点话题或趋势。然而,没有更详细的信息,我们只能推测它可能是一个用于实时监控和分析大规模文本流的系统。 "SMS3.1 ...