代码规范 : 格式编排
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的快速格式化代码的模板控制或者去网上找一些能够快速编排代码的工具
相关文章推荐
- Java编码规范,让你的代码赏心悦目--格式
- afnetworking中,规范json格式的代码---这样打印出来errormessage就非常的方便了,呵呵呵呵
- Java编码规范,让你的代码赏心悦目--格式
- C++代码格式规范引导(二):头文件
- 如何声明HTML代码为过渡性,严格型,框架型来规范代码格式
- Java编码规范,让你的代码赏心悦目--格式
- Java代码格式规范个人推荐(带范例)
- 给通用格式(T)字典赋值的代码规范举例
- JAVA代码格式规范
- C/C++代码命名和格式规范
- C/C++ 代码规范: 命名规则、注释、格式
- VC++中如何快速地规范代码的缩进格式? 自动缩进 快捷键
- Java代码格式规范个人推荐
- 关于前端代码基本命名规范与格式规范
- Java编码规范,让你的代码赏心悦目--格式
- [Dynamic Language] Pylint 分析Python代码格式规范
- Java编码规范,让你的代码赏心悦目--格式
- Subsonic.exe 生成数据访问层代码,报“从索引 0 处开始,初始化字符串的格式不符合规范”错误解决办法
- Java编码规范,让你的代码赏心悦目--格式
- C/C++代码命名和格式规范