java编程规范,抽象,继承,封装
2017-06-18 09:14
211 查看
1)名副其实的功能描述
变量、参数、函数、类、包等等的命名,要清晰地体现所代表对象的语义
例如:maxScore代表最高成绩,如果代表最低成绩就让人难以理解了;a[]这种没有自然语义的,也不可取
2)有意义的区分
命名应该能够区分在相同场景中同类型的不同对象
例如打印结婚证方法如下:
两个参数person1、person2这两个参数就没有区分性,哪个表示男性,哪个表示女性,把参数命名改为
3)遵循惯例
在同一个软件项目或者团队中,同样的概念用同样的名称,不容易让人产生误解
4)添加有意义的语境
命名应该根据代码所在的语境确定
5)命名符合自然语言的语法
5.1)单复数:如果要命名的对象是在数量上复数,就要复数形式。集合类型的变量命名经常是复数形式。
5.2)时态:在代码编写时主要涉及到一般现在时、过去时、现在进行时、将来时等时
态,通常命名是用一般现在时,当如果强调已经完成的状态就需要用过去时,如果需要强调正在进行,就需要要现在进行时。
5.3)词性:在命名时主要用到的词性有:名词、动词、形容词,不同对象的命名应该使用不同词性的词或者短语,类的名称需要使用名词或者名词短语,方法的名称应该是动词或者动词短语,变量、参数、属性的命名应该使用名词或者形容词。
6)缩略词
单词的缩略方法应该遵循英语的惯例
1、拿掉所有元音
2、保留前几个字母
3、保留开头和结尾个发音字母
4、根据发音
7)函数的单一功能
函数的单一功能是指一个函数制作一件事情,实现一个功能,承担一个责任
如果能用一句话描述函数的功能,并且不使用并且(and)、或者(or)等连接词,函数的功能就是单一的
8)抽象层次
函数中所有的实现语句应该在同一个抽象层次上。在每一个抽象层次上,功能都是一些简单的逻辑构成,如果函数由多层嵌套的条件语句、循环语句构成,说明函数的实现代码不是工作在同一个抽象层次上
下面的例子就把多层嵌套的条件语句,分开了
9)函数长度
在写代码时,发现一部分代码感觉需要以注释来说明其功能时,就可以把这部分代码封装为函数,无论语句的长度
例如:
10)避免重复
代码重复是指一个函数内、多个函数之间有相同的代码和相同模式的代码。重复代码将增加维护的工作量
解决方法是把重复的部分抽象为函数,如果部分代码相同,部分不同,就需要使用抽象,把相同的部分抽象为更高层的函数,而不同的部分由低一级抽象层次的函数来实现
11)抽象
从众多的事物中抽取出共同的、本质性的特征,而舍弃其非本质的特征
12)继承
基于抽象的“分层治之”机制,可以从两个方面来理解:
从数据抽象的角度来说,类的继承能够为现实世界进行静态建模;
从过程抽象的角度来说,类的继承体现了分层解决问题的思想
13)封装
封装是指把数据与行为结合成一个整体,并对外隐藏行为的实现细节,仅通过公开的接口与对象通信
目的是增强安全性和简化编程
13.1)为什么要把数据和行为结合在一起
在现实世界中,状态(数据)与行为是事物对外的的整体表现。对现实世界的事物建模,就应该把数据和行为结合在一起,这样构件的类才有高聚性
13.2)为什么要隐藏行为的实现细节
对使用者来说,只需要了解类的功能和使用法法,不需要了解实现细节,使得学习成本更小
对类本身来说,有更高的安全性
13.3)为什么只能通过对外接口与对象进行通信
类的对外接口是指类的公共(public)方法,公共方法是对对象的通信的唯一接口,而把不希望外部访问的数据与实现过程设置为私有(private)或者保护(protected)
类的任何对外接口函数必须首先对条用的合法性和参数的合法性进行验证
只能通过对外接口访问对象的状态、向对象发送指令的目的是为了保证对象本身的安全。
变量、参数、函数、类、包等等的命名,要清晰地体现所代表对象的语义
例如:maxScore代表最高成绩,如果代表最低成绩就让人难以理解了;a[]这种没有自然语义的,也不可取
2)有意义的区分
命名应该能够区分在相同场景中同类型的不同对象
例如打印结婚证方法如下:
void printMarriageCertificate(Person person1,Person person2) { System.out.println(“丈夫姓名:”+person1.getName); System.out.println(“妻子姓名:”+person2.getName); //… }
两个参数person1、person2这两个参数就没有区分性,哪个表示男性,哪个表示女性,把参数命名改为
void printMarriageCertificate(Person husband,Person wife) { System.out.println(“丈夫姓名:”+ husband.getName); System.out.println(“妻子姓名:”+ wife.getName); //… }
3)遵循惯例
在同一个软件项目或者团队中,同样的概念用同样的名称,不容易让人产生误解
4)添加有意义的语境
命名应该根据代码所在的语境确定
public class Student { private string name; private string state; //表示学生居住的国家 private string street; //表示学生居住的街道 }修改后代码为:
public class ResidenceAddress { private string state; private string street; } public class Student { private string name; private ResidenceAddress residenceAddress; }
5)命名符合自然语言的语法
5.1)单复数:如果要命名的对象是在数量上复数,就要复数形式。集合类型的变量命名经常是复数形式。
5.2)时态:在代码编写时主要涉及到一般现在时、过去时、现在进行时、将来时等时
态,通常命名是用一般现在时,当如果强调已经完成的状态就需要用过去时,如果需要强调正在进行,就需要要现在进行时。
5.3)词性:在命名时主要用到的词性有:名词、动词、形容词,不同对象的命名应该使用不同词性的词或者短语,类的名称需要使用名词或者名词短语,方法的名称应该是动词或者动词短语,变量、参数、属性的命名应该使用名词或者形容词。
6)缩略词
单词的缩略方法应该遵循英语的惯例
1、拿掉所有元音
2、保留前几个字母
3、保留开头和结尾个发音字母
4、根据发音
7)函数的单一功能
函数的单一功能是指一个函数制作一件事情,实现一个功能,承担一个责任
如果能用一句话描述函数的功能,并且不使用并且(and)、或者(or)等连接词,函数的功能就是单一的
8)抽象层次
函数中所有的实现语句应该在同一个抽象层次上。在每一个抽象层次上,功能都是一些简单的逻辑构成,如果函数由多层嵌套的条件语句、循环语句构成,说明函数的实现代码不是工作在同一个抽象层次上
下面的例子就把多层嵌套的条件语句,分开了
9)函数长度
在写代码时,发现一部分代码感觉需要以注释来说明其功能时,就可以把这部分代码封装为函数,无论语句的长度
例如:
if( ((this.职称.equals(“教授”) or (this.职称.equals(“副教授”)) and this.学历.equals(“硕士”) ) or this.学历.equals(“博士”) ) { this.工资 += Salary.高级人才津贴; }条件中的复合条件虽然由三个逻辑表达式,但没有清晰说明其功能语义是什么,复合表达式的功能是判断对象是不是代表高级人才,因此可以把这个复合条件封装为函数:
private boolean 是高级人才() { return (this.职称.equals(“教授”) or (this.职称.equals(“副教授”)) and this.学历.equals(“硕士”) ) or this.学历.equals(“博士”); } 上面的语句就可以重构为: if( this.是高级人才()) { this.工资 += Salary.高级人才津贴; }
10)避免重复
代码重复是指一个函数内、多个函数之间有相同的代码和相同模式的代码。重复代码将增加维护的工作量
解决方法是把重复的部分抽象为函数,如果部分代码相同,部分不同,就需要使用抽象,把相同的部分抽象为更高层的函数,而不同的部分由低一级抽象层次的函数来实现
11)抽象
从众多的事物中抽取出共同的、本质性的特征,而舍弃其非本质的特征
12)继承
基于抽象的“分层治之”机制,可以从两个方面来理解:
从数据抽象的角度来说,类的继承能够为现实世界进行静态建模;
从过程抽象的角度来说,类的继承体现了分层解决问题的思想
13)封装
封装是指把数据与行为结合成一个整体,并对外隐藏行为的实现细节,仅通过公开的接口与对象通信
目的是增强安全性和简化编程
13.1)为什么要把数据和行为结合在一起
在现实世界中,状态(数据)与行为是事物对外的的整体表现。对现实世界的事物建模,就应该把数据和行为结合在一起,这样构件的类才有高聚性
13.2)为什么要隐藏行为的实现细节
对使用者来说,只需要了解类的功能和使用法法,不需要了解实现细节,使得学习成本更小
对类本身来说,有更高的安全性
13.3)为什么只能通过对外接口与对象进行通信
类的对外接口是指类的公共(public)方法,公共方法是对对象的通信的唯一接口,而把不希望外部访问的数据与实现过程设置为私有(private)或者保护(protected)
类的任何对外接口函数必须首先对条用的合法性和参数的合法性进行验证
只能通过对外接口访问对象的状态、向对象发送指令的目的是为了保证对象本身的安全。
相关文章推荐
- java中,什么是封装,继承,多态和抽象,好处与用法
- JAVA的抽象、封装、继承、多态
- java四大特性理解(封装继承多态抽象)
- java 面向对象三大特性(封装,继承,多态)以及抽象、接口的介绍
- 译:C#面向对象的基本概念 (Basic C# OOP Concept) 第二部分(封装,抽象,继承)
- Java中的继承、封装、多态、抽象
- java四大特性理解(封装继承多态抽象)
- 详解vb.net类的封装,继承,多态,抽象
- 封装、多态、抽象、继承、接口
- 以MyBatis+SpringMVC3.0实现的,借鉴了Hibernate设计思想,采用封装、抽象、继承的设计思想,做到了数据与相应的操作的高内聚低耦合的实现
- Java面向对象-(封装,继承,多态复习)+抽象
- 向对象的的基本特征:抽象,封装,继承,多态
- 封装 继承 多态 抽象的一点点理解
- PHP面向对象三大特点学习(充分理解抽象、封装、继承、多态)
- java面向对象编程(OOP):封装、抽象、多态和继承
- JavaSE review -- 面向对象、封装、继承、多态、抽象
- 七:Java之封装、抽象、多态和继承
- 面向对象特性,包括继承、封装、多态、抽象、访问控制
- Java的抽象、封装、继承、多态
- 抽象、封装、继承、多态