其3课 (5)继承

Java代码规范

  我们要为列表页添加题目

本Java代码规范以SUN的标准Java代码规范为根基,为适应大家专营商的莫过于须求,恐怕会做一些改动。本文书档案中没有申明的地方,请参看SUN
Java标准代码规范。如若两边有争辨,以SUN Java标准为准。

要咋做呢?

 

第二新建BaseViewController,并设置紫铜色标题栏,灰色背景

一. 标识符命名规范

删去ViewController中与之重新的代码

1.1 概述

让有关对象继承BaseViewController

标识符的命名力求做到统1、达意和不难。

BaseViewController提供格局,以供子类设置标题

 

 

1.1.1 统一

 

合并是指,对于同一个概念,在先后使得同一种表示方法,比如对于供应商,既能够用supplier,也能够用provider,可是大家只好选定1个施用,至少在二个Java项目中保证统1。统一是用作最主要的,要是对相同概念有两样的代表方法,会使代码混乱难以通晓。就算不可能取得好的名号,可是假设统一,阅读起来也不会太劳碌,因为阅读者只要知道2次。

一.新建叁个文本

1.1.2 达意

ios——Source——Cocoa Touch Class

深远浅出是指,标识符能准确的抒发出它所表示的含义,比如: newSupplier,
OrderPaymentGatewayService等;而 supplier1,
service二,idtts等则不是好的命超级模特式。准确有两成含义,一是不易,而是添加。假使给二个意味供应商的变量起名是 order,显明未有正确发挥。同样的,supplier一, 远未有targetSupplier意义丰裕。.

要注解是何人的子类,我们那边是后续自UIViewController。

1.1.3 简洁

起名字为BaseViewContraoller,把后边写的代码粘贴BaseViewContraoller.m下

简短是指,在统1和开首的前提下,用尽量少的标识符。如果不可能达意,宁愿不要不难。比如:theOrderNameOfTheTargetSupplierWhichIsTransfered 太长, transferedTargetSupplierOrderName则较好,然则transTgtSplOrdNm就不佳了。省略元音的缩写格局不要选取,大家的土耳其语往往还未曾好到看得懂奇怪的缩写。

在ViewController下接口接自BaseViewControll。

一.一.四 骆驼法则

起名 1

Java中,除了包名,静态常量等卓绝意况,当先1全场所下标识符使用骆驼法则,即单词之间不选择特殊符号分割,而是通过首字母大写来分割。比如:
supplierName, addNewContract,而不是 supplier_name,
add_new_contract。

 

1.1.5 英文 vs 拼音

 创造二个列表页,如上名称叫MomentListViewCotroller

尽量使用通俗易懂的英文单词,即使不会能够向队友求助,实在不行则动用汉语拼音,防止拼音与英文混用。比如表示归档,用archive比较好, 用pigeonhole则不佳,用guiDang尚可接受。

 

1.2 包名

 UITableView *tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 64, [UIScreen mainScreen].
bounds.size.width, [UIScreen mainScreen].bounds.size.height-64)];

    [self.view addSubview:tableView];

利用小写字母如 com.xxx.settlment,不要 com.xxx.Settlement
单词间不要用字符隔开分离,比如 com.xxx.settlment.jsfutil,而并非com.xxx.settlement.jsf_util

  制作表单

1.3 类名

self.automaticallyAdjustsScrollViewInsets = NO

一.三.一 首字母大写

  不须求活动调整表单地点

类名要首字母大写,比如 SupplierService,
PaymentOrderAction;不要 supplierService, paymentOrderAction.

 

1.3.2 后缀

类名往往用分化的后缀表明额外的趣味,如下表:

后缀名

意义

举例

Service

表明这个类是个服务类,里面包含了给其他类提同业务服务的方法

PaymentOrderService

Impl

这个类是一个实现类,而不是接口

PaymentOrderServiceImpl

Dao

这个类封装了数据访问方法

PaymentOrderDao

Action

直接处理页面请求,管理页面逻辑了类

UpdateOrderListAction

Listener

响应某种事件的类

PaymentSuccessListener

Event

这个类代表了某种事件

PaymentSuccessEvent

Servlet

一个Servlet

PaymentCallbackServlet

Factory

生成某种对象工厂的类

PaymentOrderFactory

Adapter

用来连接某种以前不被支持的对象的类

DatabaseLogAdapter

Job

某种按时间运行的任务

PaymentOrderCancelJob

Wrapper

这是一个包装类,为了给某个类提供没有的能力

SelectableOrderListWrapper

Bean

这是一个POJO

MenuStateBean

1.4 方法名

首字母小写,如 addOrder() 不要 AddOrder()
动词在前,如 addOrder(),不要orderAdd()
动词前缀往往表达一定的意思,如下表:

前缀名

意义

举例

create

创建

createOrder()

delete

删除

deleteOrder()

add

创建,暗示新创建的对象属于某个集合

addPaidOrder()

remove

删除

removeOrder()

init或则initialize

初始化,暗示会做些诸如获取资源等特殊动作

initializeObjectPool

destroy

销毁,暗示会做些诸如释放资源的特殊动作

destroyObjectPool

open

打开

openConnection()

close

关闭

closeConnection()<

read

读取

readUserName()

write

写入

writeUserName()

get

获得

getName()

set

设置

setName()

prepare

准备

prepareOrderList()

copy

复制

copyCustomerList()

modity

修改

modifyActualTotalAmount()

calculate

数值计算

calculateCommission()

do

执行某个过程或流程

doOrderCancelJob()

dispatch

判断程序流程转向

dispatchUserRequest()

start

开始

startOrderProcessing()

stop

结束

stopOrderProcessing()

send

发送某个消息或事件

sendOrderPaidMessage()

receive

接受消息或时间

receiveOrderPaidMessgae()

respond

响应用户动作

responseOrderListItemClicked()

find

查找对象

findNewSupplier()

update

更新对象

updateCommission()

find方法在工作层尽量发挥业务含义,比如 findUnsettledOrders(),查询未结算订单,而并非findOrdersByStatus()。 数据访问层,find,update等措施能够发挥要实践的sql,比如findByStatusAndSupplierIdOrderByName(Status.PAID,
345)

1.5 域(field)名

一.伍.1 静态常量

全大写用下划线分割,如

public static find String ORDER_PAID_EVENT = “ORDER_PAID_EVENT”;

1.5.2 枚举

全大写,用下划线分割,如

public enum Events {
ORDER_PAID,
ORDER_CREATED
}

1.5.3 其他

首字母小写,骆驼法则,如:

public String orderName;

一.陆 局地变量名

参数和有个别变量名首字母小写,骆驼法则。尽量不要和域抵触,尽量发挥这么些变量在艺术中的意义。

二. 代码格式

用空格字符缩进源代码,不要用tab,各类缩进五个空格。

二.壹 源文件编码

源文件使用utf-8编码,结尾用unix n 分格。

2.2 行宽

行宽度不要跨越80。Eclipse标准

贰.三 包的导入

除去不用的导入,尽量不要选取任何包的导入。在eclipse下日常使用便捷键 ctrl+shift+o 修正导入。

2.4 类格式

2.5 域格式

每行只可以声美素佳儿个域。
域的宣示用空行隔离。

2.伍 方法格式

二.6 代码块格式

2.陆.1 缩进风格

大括号的开头在代码块早先的行尾,闭合在和代码块一样缩进的行首,例如:

package com.test;

 

public class TestStyle extends SomeClass implements AppleInter,
BananaInter {

    public static final String THIS_IS_CONST = “CONST
VALUE”;

 

    private static void main(String[] args) {

        int localVariable = 0;

    }

 

    public void compute(String arg) {

        if (arg.length() >  0) {

            System.out.println(arg);

        }

 

        for (int i = 0; i < 10; i++) {

              System.out.println(arg);

        }

 

       while (condition) {

 

       }

 

      do {

          otherMethod();

      } while (condition);

 

  switch (i) {

  case 0:

     callFunction();

     break;

  case 1:

     callFunctionb();

     break;

  default:

     break;

  }

 }

}

2.陆.贰 空格的选择

二.六.二.一 表示分割时用一个空格

不可能如此:

if       (               a >        b   )            {

    //do something here

};

2.陆.二.2 2元三元运算符两边用2个空格隔开

如下:

a + b = c;

b – d = e;

return a == b ? 1 : 0;

不能够如下:

a+b=c;

b-d=e;

return a==b?1:0;

2.陆.2.3 逗号语句后如不基本上能用,紧跟二个空格

如下:

call(a, b, c);

不能如下:

call(a,b,c);

2.陆.叁 空行的运用

空行可以揭橥代码在语义上的剪切,注释的功效范围,等等。将看似操作,或1组操作放在1起不用空行隔绝,而用空行隔开分离差别组的代码, 如图:

order = orderDao.findOrderById(id);

 

//update properties

order.setUserName(userName);

order.setPrice(456);

order.setStatus(PAID);

 

orderService.updateTotalAmount(order);

 

 

session.saveOrUpdate(order);

上例中的空行,使注释的成效域很分明.

  • 再叁再四两行的空行代表越来越大的语义分割。
  • 措施之间用空行分割
  • 域之间用空行分割
  • 超过十行的代码借使还不用空行分割,就会大增阅读困难

3. 评释规范

3.1 注释 vs 代码

  • 表明宜少二精,不宜多而滥,更无法误导
  • 命名达意,结构清晰, 类和情势等职责肯定,往往不须要,或许只需求很少注释,就可以令人读懂;相反,代码混乱,再多的注释都不可能弥补。所以,应超过在代码本人下武术。
  • 不能够科学发挥代码意义的注释,只会风险代码的可读性。
  • 过火详细的笺注,对明明的代码添加的注释,罗嗦的诠释,还比不上不写。
  • 申明要和代码同步,过多的注释会化为花费的承受
  • 注明不是用来保管代码版本的,假设有代码不要了,直接删除,svn会有记录的,不要注释掉,否则以往没人知道那段注释掉的代码该不该删除。

3.2 Java Doc

表明类、域和章程等的意义和用法等的诠释,要以javadoc的不二等秘书籍来写。Java
Doc是个类的使用者来看的,首要介绍 是什么样,怎么用等消息。凡是类的使用者须求领悟,都要用Java
Doc 来写。非Java
Doc的诠释,往往是个代码的支持者看的,珍视告述读者为啥如此写,怎么样修改,注意什么难题等。 如下:

/\**

\ This is a class comment*

\/*

public起名, class TestClass {

    /\**

    \ This is a field comment*

    \/*

    public String name;

 

    /\**

    \ This is a method comment*

    \/*

    public void call() {

 

    }

}

三.叁 块级别注释

叁.叁.一 块级别注释,单行时用 //, 多行时用 /* .. */。

三.三.2 较短的代码块用空行表示注释效能域

3.三.叁 较长的代码块要用

/\—— start: ——*/*

/\——– end: ——-*/*

包围
如:

/\———-start: 订单处理 ——- */*

//取得dao

OrderDao dao = Factory.getDao(“OrderDao”);

/\ 查询订单 */*

Order order = dao.findById(456);

//更新订单

order.setUserName(“uu”);

order.setPassword(“pass”);

order.setPrice(“ddd”);

orderDao.save(order);

/\———-end: 订单处理 ——- */*

三.三.肆 能够设想动用大括号来表示注释范围

使用大括号表示注释成效范围的例子:

/\———-订单处理 ——- */*

{

 //取得dao

 OrderDao dao = Factory.getDao(“OrderDao”);

 /\ 查询订单 */*

 Order order = dao.findById(456);

 

 //更新订单

 order.setUserName(“uu”);

 order.setPassword(“pass”);

 order.setPrice(“ddd”);

 

 orderDao.save(order);

}

叁.四 行内注释

行内注释用 // 写在行尾

四 最棒实践和避忌

四.一 每一回保存的时候,都让您的代码是最美的

程序员都以懈怠的,不要想着等笔者形成了职能,再来优化代码的格式和组织,等真正把效益达成,很少有人会再愿意回头调整代码。

4.2 使用log而不是System.out.println()

log能够设定级别,能够控制输出到什么地方,简单区分是在代码的什么地点打字与印刷的,而System.out.print则不行。而且,System.out.print的快慢非常慢。所以,除非是明知故问的,不然,都要用log。至少在交付到svn此前把System.out.print换来log。

四.三 各种if while for等说话,都不用简单大括号{}

看上面包车型客车代码:

if (a > b)

    a++;

比方在其后维护的时候,须要在a > b 时,把b++,一步小心就会写成:

if (a > b)

    a++;

    b++;

那样就错了,因为无论a和b是何许关系,b++都会实施。 倘使一起首就好像此写:

if (a > b)  {

    a++;

}

深信未有哪位笨蛋会把b++添加错的。而且,那几个大括号使效益范围更显眼,尤其是背后那行非常长要折行时。

4.4 善用TODO:

在代码中加入 //TODO: ,超越50%的ide都会帮你唤醒,让你理解您还有何样事并未有做。比如:

if (order.isPaid()) {

    //TODO: 更新订单

}

四.5 在供给留空的地点放贰个空语句或注释,告述读者,你是有意的

比如:

if (!exists(order)) {

    ;

}

或:

if (!exists(order)) {

    //nothing to do

}

四.陆 不要再对boolean值做true false判断

比如:

if (order.isPaid() == true) {

    // Do something here

}

不及写成:

if (order.isPaid()) {

    //Do something here

}

后来人读起来就格外 if order is paid, …. 要比 if order’s isPaid method
returns true, … 更便于通晓

四.七 收缩代码嵌套层次

代码嵌套层次达3层上述时,一般人清楚起来都会拮据。下边包车型大巴代码是二个差不离的事例:

public void demo(int a, int b, int c) {

    if (a > b) {

        if (b > c) {

            doJobA();

        } else if (b < c) {

            doJobB()

        }

    } else {

        if (b > c) {

            if (a < c) {

                doJobC();

            }

        }

    }

}

缩减嵌套的点子有诸多:

  • 联合条件
  • 应用 return 以简单前面包车型客车else
  • 利用子方法

例如上例,合并条件后变成:

public void demo(int a, int b, int c) {

    if (a > b && b > c) {

        doJobA();

    }

    if (a > b && c > b) {

        doJobB();

    }

    if (a <= b && c < b && a < c) {

        doJobC();

    }

}

假诺选取return 则改为:

public void demo(int a, int b, int c) {

    if (a > b) {

        if (b > c) {

            doJobA();

            return;

        }

        doJobB()

        return;

    }

 

    if (b > c) {

        if (a < c) {

            doJobC();

        }

    }

}

利用子方法,正是将嵌套的主次领取出来放到别的的主意里。

4.8 程序任务单1

眷注点分离是软件开发的真谛。人类自所以能够成功复杂的行事,正是因为人类能够将工作表达到较小级别的职分上,在做每一种职责时关怀越来越少的事物。让程序单元的职分单1,能够使您在编写那段程序时关切越来越少的事物,从而下跌难度,收缩失误。

四.玖 变量的扬言,初叶化和被运用尽量放到一起

比方说如下代码:

int orderNum= getOrderNum();

//do something withou orderNum here

call(orderNum);

上例中的注释处表示了一段和orderNum不相关的代码。orderNum的扬言和初叶化离被选拔的地方相隔了众多行的代码,那样做不佳,不及那样:

//do something withou orderNum here

int orderNum= getOrderNum();

call(orderNum);

四.拾 减弱变量的效率域

能用局地变量的,不要选取实例变量,能用实例变量的,不要选拔类变量。变量的生存期越短,以为着它被误用的机会越小,同一时半刻刻程序员要关切的变量的意况越少。实例变量和类变量默许都不是线程安全的,局地变量是线程安全的。比如如下代码:

public class OrderPayAction{

    private Order order;

 

    public void doAction() {

        order = orderDao.findOrder();

        doJob1();

        doJob2();

    }

 

    private void doJob1() {

        doSomething(order);

    }

 

    private void doJob2() {

        doOtherThing(order);

    }

}

上例中order只可是担当了在措施间传递参数之用,用上边包车型大巴法子更加好:

public class OrderPayAction{

    public void doAction() {

        order = orderDao.findOrder();

        doJob1(order);

        doJob2(order);

    }

 

    private void doJob1(Order order) {

        doSomething(order);

    }

 

    private void doJob2(Order order) {

        doOtherThing(order);

    }

}

4.1一 尽量不要用参数来带回方法运算结果

比如:

public void calculate(Order order) {

    int result = 0;

    //do lots of computing and store it in the result

    order.setResult(result);

}

 

public void action() {

    order = orderDao.findOrder();

    calculate(order);

    // do lots of things about order

}

事例中calculate方法通过传播的order对象来存款和储蓄结果, 不比如下写:

public int calculate(Order order) {

    int result = 0;

    //do lots of computing and store it in the result

    return result;

}

 

public void action() {

    order = orderDao.findOrder();

    order.setResult(calculate(order));

    // do lots of things about order

}

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图