您的位置:首页 > 编程语言

代码规范 : 格式编排

2017-12-21 13:31 232 查看

感觉写代码没有激情怎么办?

或许这是你要的激情…

好了不开玩笑, 现在扯扯写代码时的排版

当你在阅读报纸的时候,或者是该文章的时候,你会首先看到最上面吸引眼球的部分, 然后就是一些的主要标题, 内容会跟随着标题逐渐展开.

那么在编写的程序的时候, 为什么不这样做, 要在混乱无章的代码迷宫中找到出口, 那确实是一件挺费心的事. 所以在这一节,教你如何对代码的格式进行编排

顺序

在阅读报纸的时候, 开始是整个故事的大纲>副标题>第一段内容>然后是细节展开,自上而下

就像在阅读报纸一样,编写代码时,可以按照固定的顺序进行编写,

类内方法定义顺序依次是(只是推荐):

公共静态常量
V
私有静态常量
V
公共变量
V
私有实体变量
V
构造函数
V
公有函数或保护函数
V
私有函数
V
getter/setter 函数


函数的排列

外部:

被调用函数应该放在调用它的函数的下面

构造方法 : 同名构造方法的顺序 从无参数到多参数,便于阅读

内部:

排列一: 按照 初始化- 输入-修改-输出的顺序进行排列

排列二: 将有关联的方法或定义放到一起

排列三: 将状态或出错之后的变量放在最后

不要将子程序的参数用做工作变量:应该在开始处创建一个新的对象

String getCode(String code){
String insideCode = code;
// 对 insideCode 进行操作
}


getter/setter

列表内容setter 方法中,参数名称与类成员变量名称一致, this.成员名=参

在getter/setter 方法中,尽量不要增加业务逻辑,增加排查问题的难度。

语句顺序

必须有明确顺序的语句

设法组织代码,是依赖关系变得非常明显(依赖关系,下一条子句依赖于上一条子句的结果)

// 下面的代码下一条子句依赖于上一条子句,这种就是依赖关系
List<String> addressCodes = getAddressCodes();
boolean doSuccess = setAddress( addressCodes );


顺序无关语句

使代码易于自上而下地阅读

将相关的语句组织到一起,

// 例子:

private String addressCode;
private String addressName;
private int age;
private int tall;

// 反例:混乱

private String addressCode;
private int tall;
private int age;
private String addressName;


空白行

用空白行隔开思路或者函数,因为人在往下阅读的时候,目光总在空白的行

函数和函数之间使用空白行隔开,这已经是约定俗成

函数内部个人认为不同的逻辑之间也可以用空白行隔开,便于理解

(且不说下面的代码写得好与不好,主要是演示了空白行和留空白隔开逻辑的作用)

public List< Map<String, Object> > getdata(String pk) {
List< Map<String, Object> > listarr = new ArrayList<>();
List<DataRoleClassVO> list = smdatarole.getlist(pk);

for(int i = 0; i < list.size(); i++){
Map<String,Object> json=new HashMap<String,Object>();
json.put("id", list.get(i).getPkDataroleclass());
json.put("number", i+1);

List<DataRoleVO> dto = smdatarole.getlists(list.get(i).
getPkBusiorg(),list.get(i).getPkDataroleclass());
List<Map<String,Object>> arr=new ArrayList<>();

for(int j = 0; j < dto.size(); j++){
Map<String,Object> js = new HashMap<String,Object>();
js.put("id", dto.get(j).getPkDatarole());
js.put("number", (i+1)+"."+(j+1));
arr.add(js);
}

if( arr.size() > 0 ){
json.put("children", arr);
}

l
b43d
istarr.add(json);
}
return listarr;
}


代码宽度

书上的种种分析表明,代码的宽度应该在 80-120个字符之间,

但是随着现代液晶显示器的发展,我们的屏幕变得更 ‘逼格’(big),就不用说按照书上来, 你只要觉得你的电脑屏幕容得下,300个字符的宽度也没有问题 .

但是

我个人推荐是 120-200 之间

你的代码有可能在别的地方用到,或者是别人会去欣赏你的代码, 当你的代码格式切换与不同尺寸的屏幕之间, 你能保证自己长长的一条语句能很好的展示么?

所以,还是要限制下宽度

变量的位置

变量在类开始处定义, 可以在靠近变量第一次使用的位置初始化,目的是为了更好的找到, 也是为了对象的’存活’时间更短, 更快被回收

private String address ;

//... 冗长的语句过后

address = null; // 在第一使用之前初始化;
private void setAddress(){
address = .....
}


作用域

使变量引用局部化:尽可能把对一个变量的引用局部化,将引用点尽可能的集中在一起

让关系”紧密”: 有关系的内容应该在垂直方向上紧密一点,从上往下阅读起来能够容易找到

1  跨度: 衡量一个变量的不同引用点的靠近程度的一种方法是计算该变量的 跨度


2  计算跨度:  相隔多少行,就是多少个跨度;
对一个引用的 跨度的平均值 越小越好,可以提高程序可读性


3  减小跨度 :尽可能缩短变量的"存活"时间
第一条语句 和 最后一条语句的距离行数 ,是变量的存活时间;如果对变量的多次引用靠的非常近,那么相关的代码片段重构为单独的子程序就非常容易;
如何 遵循代码的规范,和满足跨度以及缩短变量的存活时间:
例如:在类开始的地方做声明,但是不做初始化(上面的小节)


减小作用域原则:

直到变量即将被使用时再为其赋值

将相关语句放到一起

将具有相关语句组提炼成单独的子程序

开始时采用最严格的可见性,然后根据需要扩展变量的作用域

有关缩小变量作用域的说明 : 程序员采用哪种缩小变量作用域的方法,取决于它如何看待”方便性”和”智力上”的可管理性

持续性: 数据的使用或变动的持续性

绑定时间: 变量和它的值绑定在一起的时间,绑定时间越短越有利(这里和存活时间那一小节差不多)

注意: 绑定时间越早,灵活性越差,但是复杂度会降低. 代码越灵活,复杂度越高,那么要靠程序员来平衡两者.

为变量制定单一用途

每一个变量只用于单一用途:

避免让代码具有隐含含义:宁愿用两个变量保存两种信息,带来更多的清晰度,也不要吝惜用的那一点存储空间

确保使用了所有已声明的变量

补充

内聚: 内聚性高,意味着类中的方法和变量互相依赖,互相结合成一个逻辑整体,

例如 集合类的数据结构,里面的变量会被多个函数使用到,这就是内聚性高的体现.

关于内聚还是解耦, 就由各位看官去自行取舍了

最后

你可以调整好自己的IDE的快速格式化代码的模板控制

或者去网上找一些能够快速编排代码的工具
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息