1 背景概述

作为程序员大军中的一员,笔者工作于沈阳数通畅联软件技术有限公司。在任职工作的第一天就听领导强调开发规范的重要性,但是笔者心里还想为什么开发规范是最重要的,难道是不应该是实现功能就万事大吉了?

随着时间的推移,笔者也经历了几个软件项目,越来越意识到开发规范的重要。今天笔者将自己的所听、所学以及个人的总结汇总出来与大家分享,希望可以为大家提供帮助。

2 目的意义

在团队协作开发的情况下,一套鲜明的编程风格,可以让协作者、后继者和自己一目了然,在很短的时间内看清程序的结构,理解设计的思路。提高代码的可读性、可重用性、程序健壮性、可移植性和可维护性。制定开发规范的目的是为了提高软件开发效率及所开发的软件的可维护性,提高软件的质量。通过开发规范的约束提升自身的逻辑思维能力,也侧面的提升个人编码能力及水平。

3 开发规范

作为软件项目的开发人员而言,对于功能代码,首要的要求是代码必须正确的,能够保证功能是可运行的,并且能够满足客户的需求。第二个的要求是代码必须清晰易懂,方便于其他的程序员能够容易理解代码的原理,增强代码的可读性,保证代码统一一致的编程风格。下面我们通过格式、命名、权限、性能等几个方面来明确开发规范。

3.1 统一格式

  • 整体风格
  1. 采用阶梯层次组织程序代码。每层次缩进为4格,括号位于下一行。要求相匹配的大括号在同一列,对下一行同样要再缩进4格。参考代码如下:
  2. 对变量的定义,尽量位于函数的开始位置,对于全局变量/静态变量要定义与类名与构造函数之间。
  3. 空格表示分割,用一个空格运算符两边用一个空格隔开。如a + b = c,不能a+b=c;如果逗号语句后不还行,则需要在逗号后紧跟一个空格如:call(a, b, c);不能call(a,b,c)。
  • 方法定义
  1. 对于统一方法风格的定义,单个函数的有效代码长度当尽量在100行以内,进一步可以保证代码逻辑清晰可见。
  2. 逻辑上相关序代码与其前后之程序代码间应以空白行加以分隔;在注释段与程序 段、以及不同程序段插入空行。提高可读性。
  3. 单个类不宜过大,当出现此类过大时当将相应功能的代码重构到其他类中,通过组合等方式来调用,建议单个类的长度包括注释行不超过1500行。尽量避免使用大类和长方法。
  • 嵌套关系
  1. IF语句的嵌套层数尽量保证在3层以内,FOR/WHILE循环尽量为两层循环。如果超过了限定层数应该考虑自己的代码逻辑是存在可调整性。
  2. 在同一个IF判断条件中布尔表达式中的布尔运算符(&&,||)的个数不超过10个。

3.2 命名规范

  • 包名定义
  1. 包名的前几个为固定名称,通常为公司的域名/项目的固定名称然后承接项目名称,如果域名还没有确定的话,采用公司固定的几个名称。如:com.agileai.wm
  2. 在包名的接下来一个单词为模块的名称。如:用户模块,包名为com.agileai.wm.user
  3. 所有包的命名必须采用小写英文字母。命名均含有业务语义,可以快速地传达该类的用途。关于模块的访问操作,采用分层形式,一般分为:

模型(model)层操作:一般定义在com.agileai.wm.user.module.service中,其中user为模块名称。

控制器(controller)层操作:一般定义在com.agileai.wm.user.module.handler中。

视图(view)层操作:一般定义在文件路径与对应的报名保持一致中。

  • 类名定义
  1. 参照java驼峰命名法,类名的首字母必须采用大写的形式,如果类名为多词组合而成的话,那么每个词的首字母必须采用大写。如:ForumManagePostPortlet.java
  2. 选择命名具有业务语义,能快速地传达该类的用途。参考模型如下:

模型(model)层操作:一般定义为,接口类:ForumProvider.java   接口实现类:ForumProviderImpl.java。

控制器(controller)层操作:一般定义为XXXHandler,如:ForumPostLocatorHandler。

视图(view)层操作:一般定义为:XXX.jsp,如:ForumUserEdit.jsp。

  • 方法命名
  1. 选择有意义的名字,能快速地传达该方法的用途。参照java驼峰命名法,首字母以小写开头,每个单词首字母大写(第一个单词除外)。
  2. 对数据操作的方法命名通常以insert(插入),delete(删除),update(更新),select(查找),count(统计)开头。获取批量数据通常定义为findXXXRecords(),获取单条记录通常为getXXXRecord()。
  3. 在进行方法名名师通常会根据方法的行为命名,描述方法的意义,而不采用方法的目的命名。如:系统的添加新用户,用户可以前台注册,也可以管理员后台添加,方法会被重用,最好不要用使用register,采用add会更好写。
  • 变量命名
  1. 驼峰命名法,当变量名或函式名是由一个或多个单字连结在一起,而构成的唯一识别字时,首字母以小写开头,每个单词首字母大写(第一个单词除外)
  2. 静态变量通常采用全部大写的形式来书写,对于采用多词合成的变量采用“_”来连接各单词。如:USER_LIST
  3. 除非是在循环中,否则一般不推荐使用单个字母作为变量名,i、j、k等只作为小型循环的循环索引变量。
  4. 如果需要对变量名进行缩写时,一定要注意整个代码中缩写规则的一致性。例如,如果在代码的某些区域中使用intCnt,而在另一些区域中又使用intCount,就会给代码增加不必要的复杂性。建议变量名中尽量不要出现缩写。

3.3 权限定义

  1. public修饰符:它具有最大的访问权限,可以访问任何一个在CLASSPATH下的类、接口、异常等。它往往用于对外的情况,也就是对象或类对外的一种接口的形式。通常在通用调用、跨模块调用时选择public修饰符。
  2. protected修饰符:它主要的作用就是用来保护子类的。它的含义在于子类可以用它修饰的成员,其他的不可以,它相当于传递给子类的一种继承的东西。通常在需要继承时选择。
  3. default修饰符:什么都不写就是default,它是针对本包访问而设计的,任何处于本包下的类、接口、异常等,都可以相互访问,即使是父类没有用protected修饰的成员也可以。
  4. Private修饰符:它的访问权限仅限于类的内部,是一种封装的体现,例如,大多数的成员变量都是修饰符为private的,通常不希望被其他任何外部的类访问时选择private。

4 代码封装

作为面向对象的语言-JAVA,其三大基本特征就是封装、继承以及多态。其中封装是继承与多态的基础。通过封装不仅可以使代码逻辑更加清晰,同时也可以实现最小调整达到全局调整的目的。通过程序的代码的封装也可以提升复用率减少代码的冗余程度。下面我们介绍常见的需要封装的几种场景如:本类复用、多类调用等。

4.1 本类复用

  1. 在实现代码封装之前需要明确不同修饰符的访问权限,其中public为公共调用,private为私有调用,protected为继承调用。
  2. 在本类中多次引用相同处理逻辑的程序代码,需要将其统一进行提取封装为公共调用的方法,并将其的访问权限定义为private最大程度的确保程序的安全性。
  3. 在本类中多次引用的相同的变量值(通常为用于比较的固定字符串或者静态的变量值)需要将其定义在类名与构造函数之间,保证在后续维护过程中可以实现最小调整即可调整全局的目的。

4.2 多类调用

  1. 对于被多处引用的结果属性,通常将其封装为对象类,将其属性定义为变量,并初始set、get方法对齐赋值或者取值。
  2. 对于某些属性变量值被多处调用,我们通常将被调用的属性变量值定义在一个公共类中,并将其定义为static变量,保证在其他环境引用是可以直接使用类名.变量名进行调用。
  3. 在实现业务功能需求如Excel导入、导出,打印等功能,其功能可为单独提取实现,通常我们将撰写Helper帮助类(XXXHelperHandler)提供实现功能,以便业务功能调用实现需求。

4.3 代码重构

  1. 无论是在项目中还是日常的工作中,对于代码的重构均是不可缺少的,通常我们可以将公共的方法提取出来放在一个新的Handler中利用新的Handler继承BaseHandler原有的Handler继承新创建的Handler。
  2. 如果公共方法不能完全复用,可以将公共的逻辑提取出来放在新的XXXHelperHandler中,在Handler中进行调用方法即可。

5 优势说明

5.1 降低成本

  • 好的开发规范可以尽可能的减少一个软件的维护成本,虽然在开发过程中要符合开发规范的条条框框看似浪费时间,但是从长远的软件代码维护来看更清晰的代码逻辑更节省交接以及维护是时间。降低了项目/产品的维护成本。
  • 好的开发规范可以增强软件代码的可读性,良好的编程规范可以实现代码的自注释,可以让产品/项目的后续开发人员直观明确的了解代码的逻辑,较大幅度的降低了因代码逻辑混乱造成的工作交接困难,进一步影响了整个项目/产品的开发(运维)周期。通过周期的缩短减少人力的投入降低项目/产品的人员成本。

5.2 提高效率

好的开发规范可以最大限度的提高团队开发的效率;良好的开发规范可以保证代码风格的统一,保证整个项目/产品的开发风格是一致的,即使人员变更维护或者进行排错推断也可以减少因编程风格不统一造成的时间浪费。

5.3 能力提升

长期的规范性编码还可以促使开发人员养成良好的编程习惯,通过代码的逻辑性也可体现出开发人员的逻辑思维,不断提升自己的开发的规范性也可以从侧面提升个人逻辑思维能力。

6 个人总结

笔者作为数通畅联软件技术有限公司中的一名技术人员,从开始参加工作个人对公司强行要求开发规范的不理解至今深度认知开发规范的重要性。笔者在数通畅联这个大家庭中,每天耳濡目染学习java常见的开发规范如:命名、权限、格式等。通过自身的调整以及认知的提升也逐步提升了个人的编码能力。

笔者认为一个良好的编码习惯不仅体现出个人的能力水平,也体现出其所在环境,所在团队的整体风气。希望大家今后都可以培养自己的编码习惯使开发规范中的硬性要求成为自己的下意识习惯。

Java常见开发规范的更多相关文章

  1. JAVA 代码开发规范

    一.开发工具规范: 1. 开发工具经项目负责人调试后统一确定. 2. 开发工具一经确定不允许集成任何非统一插件,若有需要,经项目负责人同意后统一为 项目组成员添加. 3. 开发工具的编码格式不允许修改 ...

  2. 转:Java项目开发规范参考

    Java项目开发规范参考 - KevinLee的博客 - 博客频道 - CSDN.NEThttp://blog.csdn.net/u011383131/article/details/51227860 ...

  3. 规范——Java后端开发规范

    Java后端开发规范 一.技术栈规约 二.命名规范 三.Java代码规范(注释规范.异常与日志.代码逻辑规范) 四.Mybatis与SQL规范 五.结果检查(单元测试及代码扫描) 六.安全规范 一.技 ...

  4. IDEAL葵花宝典:java代码开发规范插件 p3c

    前言: P3C插件 是阿里巴巴p3c项目组进行研发.这个项目组是阿里巴巴开发爱好者自发组织形成的虚拟项目组,根据<阿里巴巴Java开发规范>转化而成的自动化插件,并且实现了部分自动编程. ...

  5. Java后端开发规范

    基于阿里巴巴JAVA开发规范整理 一.命名风格 [强制]类名使用 UpperCamelCase 风格,必须遵从驼峰形式,但以下情形例外:DO / BO / DTO / VO / AO 正例:Marco ...

  6. java & android 开发规范手册

    阿里巴巴Java开发手册(终极版)https://pan.baidu.com/s/1c1UQM7Q 阿里巴巴Java开发规约插件p3cGitHub:https://github.com/alibaba ...

  7. IDEAL葵花宝典:java代码开发规范插件 checkstyle、visualVM、PMD 插件

    前言: visualVM: 运行java程序的时候启动visualvm,方便查看jvm的情况 比如堆内存大小的分配:某个对象占用了多大的内存,jvm调优必备工具. checkstyle: CheckS ...

  8. IDEAL葵花宝典:java代码开发规范插件:GsonFormat插件将JSONObject格式的String 解析成实体

    前言: GsonFormat插件主要用于使用Gson库将JSONObject格式的String 解析成实体,该插件可以加快开发进度,使用非常方便,效率高. 这个教程主要是学习IntelliJ IDEA ...

  9. IDEAL葵花宝典:java代码开发规范插件 FindBugs-IDEA

     前言: 检测代码中可能的bug及不规范的位置,检测的模式相比p3c更多,写完代码后检测下 避免低级bug,强烈建议用一下,一不小心就发现很多老代码的bug. 使用步骤: 1):打开 Settings ...

随机推荐

  1. 【算法】BM算法

    目录 BM算法 一. 字符串比较的分析 二.BM算法的思想 三.算法实现 BM算法 @ 一. 字符串比较的分析 如果要判定长度为\(n\)两个字符串相等,比较中要进行\(n\)比较,但是如果要判定两个 ...

  2. Codeforces Round #553 (Div. 2) A题

    题目网址:http://codeforces.com/contest/1151/problem/A 题目大意:给定一个由大写字母构成的字符串和它的长度,有这样的操作,使任意一个字母变成与其相邻的字母, ...

  3. SQL Server 2008 通过C# CLR 使用正则表达式

    参考文章 MSSQLSERVER接入c#clr程序集,使c#函数变sql函数 正则表达式30分钟入门教程 SQL中采用Newtonsoft.Json处理json字符串 操作步骤 1.新建项目-> ...

  4. session cookie简介

    会话机制:Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身 ...

  5. 自定义扩展实现相对于addRoutes的removeRoutes方法——vue-router

    使用vue-router的addRoutes方法做登录权限控制,当用户推出登录回到login页后,切换不同权限的账号,如果不reload页面,会导致router权限问题,故在vue-router代码中 ...

  6. 在Linux系统上安装Compose

    在Linux上,您可以从GitHub上的Compose存储库发行页面下载Docker Compose二进制文件.按照链接中的说明进行操作,该链接涉及curl在终端中运行命令以下载二进制文件.这些分步说 ...

  7. Non-decreasing Array LT665

    Given an array with n integers, your task is to check if it could become non-decreasing by modifying ...

  8. PHP基础(命名错误)错误导致的500

    记得去年七月份参与一个项目发生的一个低级错误 因为不小心在命名一个方法时使用了一list做为名称,因此在后面无明业火被点燃. 发现一个500,无论如何调整总是500,数据库,文件,url都正确,但就是 ...

  9. Tomcat 500error: Could not initialize class

    Web 项目报错Could not initialize class ,出现500,说明服务器是起来了,可能是这个类的驱动有问题,缺少初始化需要的文件 查到有相关情况: 考虑是jar 包的问题,检查了 ...

  10. 团队-爬取豆瓣Top250电影-团队-阶段互评

    团队名称:咣咣踹电脑学号:2015035107217姓名:耿文浩 得分10 原因:组长带领的好,任务分配的好,积极帮助组员解决问题学号:2015035107213姓名:周鑫 得分8 原因:勇于分担,积 ...