`
cheng.xinwei
  • 浏览: 78542 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

【代码规范】我所理解的代码规范

    博客分类:
  • JAVA
阅读更多
    本人是一名从事java开发2年的小菜,常用MVC框架为spring,在这里只是想谈谈我所理解的代码结构。若说的不对请指出。

    我们在写程序的过程中,普通的代码层次都是会区分成controller,service,dao这三层结构,这里主要想聊一下我是怎么样理解这三个层次的,以及他们分别应该处理什么样的事情,担任什么样的角色。

    此处说明一点,这些规范只是本人在coding过程中自己体会总结出来了,可能现在不全,可能现在又不足的地方,还希望各位指出。

    首先简述一下controller和dao,controller这个C在众多的MVC框架中被广泛使用,controller的翻译过来就是控制器,控制器在整个代码结构中主要担当请求转发,访问权限处理,参数处理等,和页面渲染所需要的值。

    而dao则是负责对于数据库的基本操作。这里就不多做介绍了。

    然后主要说一下service,个人觉得service层,是非常强大的一层,也是在三层结构中最重要的一层。绝大部分业务逻辑,数据库的事物,以及数据权限,可能都会在这一层去实现。那要怎么样才能写出一个优秀的service呢?我们来一起探讨一下。 service翻译过来就是"服务",那作为一个好的服务,是让客户端可以更加便捷,方便的使用他。我们先看如下例子:

    1.注意service层对外的方法
   
    //基本插入操作
    public void insert(Object obj){
        dao.insert(obj);
    } 
    //提供给客户端使用
    public void insert(String content , String contentType){
       Object obj = new Object();
       obj.setContent(content);
       obj.setContentType(contentType);
       dao.insert(obj);
    }

    这两段代码的区别是参数的不同,对于客户端来说,如果提供的方法参数是一个object,客户端并不知道需要放入多少个值,但是如果吧参数完整的列出来,客户端可以很明显的知道,当我执行insert的时候我需要给多少个值,可能有人会说,我一张表字段特别多,但是当第一次插入的时候,其实字段并不会很多,可能很多值在插入的时候是不需要的,有一些值是默认的,这种完全可以再我们service中就封装好,使用者无需知道。

    2.在方法中尽量使用枚举
   
    public Object getOrderByType(OrderType orderType){...}
    

   
    public Object getOrderByType(Integer orderType){}
    

    我们在数据库中,很多时候会以某个数值代表某个含义,比如1代表是已付款的订单,2代表未付款,等等。当你提供的service的时候,如果希望客户端使用方法的时候传递的是0,1,2的话其实是很不友好的,因为在客户端使用的时候,我并不用知道0,1,2分别代表什么,可能还需要去看数据字典。但是如果提供的是枚举的话,客户端可以很鲜明的知道,这个方法需要什么。
    其次,因为规范了入口,service的方法体中得到了保障。如果外部传入的Integer因为某种原因传入的数值并不是方法体内想要的内容,还需要去处理参数,但是这个活不应该是service干的。但是使用枚举可以很好的避免这个问题。

    3.入口需要统一
    在我们的service中,我们可能会有很多种insert,很多种update,这是正常的,因为我们需要处理不同的业务,可能会有很多种方法的重载。但是这里需要提到一点。所有的对于数据的操作,建议都调用service中最基础的insert,如:
   
    //基本插入操作
    public void insert(Object obj){...}
    //插入信息和详情表
    public void insertInfoAndDetail(Object obj){
        this.insert(obj);
        otherService.insert(...);
    }
    

    如上的例子,在insertInfoAndDetail方法中,其实可以调用dao的insert但是我们还是期望可以统一入口,全部调用service中的insert。

    4.方法名的注意
    service的提供方法中,最重要的就是方法名。可能有人说,我注释写的很好,很全。但是一般的coder首先第一反应是看方法名,比如一个get方法中执行了一个update,但是在注释上写了“此方法是更新操作”,我相信10个人中8个人会认为他是查询。记得以前在<<如何编写优雅的代码>>中提到,方法名就是最好的注释。这点无容置疑。
    这里还要提一点,方法名要尽量的具体化,如果不是通用的业务,不要使用通用的方法名,我曾今看到如下代码
   
    //查询XXX类型商品的图片
    property List<Picture> getPictureByGoodsId(Integer goodsId){
        Map<String,Object> params = new HashMap<>();
        params.put("goodsId","goodsId");
        params.put("pictureType",PictureType.XXX);
    }
    

    此方法仔细一看,在注释有些是查询XXX类型,但是方法名完全体现不出来,很容易误导使用者。独立的业务需要独立的方法名!

    5.具体方法只做本方法的事情,不要让你的方法“做太多”。大家看如下代码。
   
        //代码1
        public void insert(Order order){
            //当满足某条件下,订单直接付款通过
            if(xxx){
                order.setPayedStatus("已付款");
            }
            dao.insert(o);
        }

        //代码2
        public void insert(Order order){
            //当满足某条件下,订单直接付款通过
            updatePayed(order.getId());
            dao.insert(o);
        }
   
        //更新是否付款
        public void updatePayed(Order order){
            if(xxx){
                order.setPayedStatus("已付款");
            }
            service.update(order);
        }
    

    看如上两段代码,可能有人会说,如果用第二种代码执行会多操作一次数据库,但是从我的角度出发,我宁可多操作这一次数据库,而不是吧插入和更新的业务同时执行。因为插入的时候只需要管插入的业务即可,他无需关心更新付款状态有多少业务存在。如果说之后更新付款状态以后需要添加业务代码的话,我们只需要修改updatePayed方法即可。也反应出我在第3点(入口需要统一)中提到的。

    6.使你的方法作用范围最小化,如果是方法内部使用的方法,可以使用private就private,不要什么方法都用public修饰。当其他人使用你的service的时候,呈现给他的应该就是他所需要的,而不是一大箩筐全列出来




   
分享到:
评论

相关推荐

    java代码规范

    而且,我相信,如果我们代码规范能够做好的话,且不说开发水平提高多少,至少我们也会有很多出色开源项目。 一、规范的代码可以促进团队合作 一个项目大多都是由一个团队来完成,如果没有统一的代码规范,那么每...

    JAVA代码规范 JAVA规范 代码规范

    它们以安全可靠的软件工程原则为基础,使代码易于理解、维护和增强灵活性。通过遵循一套通用的程序设计标准,显著提高 Java 软件开发者的生产效率,为开发团队的程序设计带来更大的一致性,使软件开发团队的效率明显...

    C#代码规范

    规范制定原则 1 方便代码的交流和维护。 2 不影响编码的效率,不与大众习惯冲突。 3 使代码更美观、阅读更方便。 4 使代码的逻辑更清晰、更易于理解。

    C语言代码编写规范,个人理解

    C语言代码编写规范,个人理解

    JavaScript代码规范

    JavaScript在一直有着广泛的应用,特别是在浏览器端的行为管理。本文档的目标是使JavaScript代码风格保持一致,容易被理解和被维护。

    java代码书写规范

    它们以安全可靠的软件工程原则为基础,使代码易于理解、维护和增强。而且,通过遵循这些程序设计标准,你作为一个 Java 软件开发者的生产效率会有显著提高。经验证明,若从一开始就花时间编写高质量的代码,则在软件...

    AndroidCodeStandard:Android代码规范文档

    做开源几年了,被很多人夸大,你的代码写得比较规范,,但是迟迟没有出一个代码规范,说来惭愧,只是因为我早几年写的代码还不够规范,不敢出来误导大家,而代码规范是后续才慢慢养成的,在这个过程中,我另外参考了...

    C#代码编写规范.pdf

    本规范为一套编写高效可靠的 C# 代码的标准、约定和指南。它以安全可靠的软件工程原则为基础,使代码易于理解、维护和增强,提高生产效率。同时,将带来更大的一致性,使软件开发团队的效率明显提高。

    代码编写规范说明书(c#.net与asp.net)

    代码编写规范说明书(c#.net与asp.net) 1 目的 一.为了统一公司软件开发设计过程的编程规范 二.使网站开发人员能很方便的理解每个目录,变量,控件,类,方法的意义 三.为了保证编写出的程序都符合相同的规范,保证...

    Sonar代码规范

    1. 不遵循代码标准 sonar可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具规范代码编写。 2. 潜在的缺陷 sonar可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具检 测出潜在的缺陷。 3. 糟糕的复杂度分布...

    Java代码规范.doc

    编码规范对于程序员而言尤为重要,有以下几个原因: 1. 一个软件的生命周期中,80%的花费...3. 规范可以改善软件的可读性,可以让程序员尽快而彻底地理解新的设计和代码 4. 良好的编码规范可以有效避免一些低级错误

    蓝桥杯训练题代码

    标准代码规范,逻辑思维清晰,例子鲜明常用,易理解,能起到举一反三的效果

    单片机汇编程序代码规范

    本文从代码的可维护性(可读性、可理解性、可修改性)、代码逻辑与效率、函数(模块)接口、可测试性四个方面阐述了软件编程规范,规范分成规则和建议两种,其中规则部分为强制执行项目,而建议部分则不作强制,可根据...

    java程序代码编写的详细规范

    详细介绍编写代码的注意点,...(3)编码规范可以改善软件的可读性,可以让程序员尽快而彻底地理解新的代码。(4)如果你将源码作为产品发布,就需要确任它是否被很好的打包并且清晰无误,一如你已构建的其它任何产品。

    Java代码设计规范

    本文提供一整套编写高效可靠的 Java 代码的标准、约定和...它们以安全可靠的软件工程原则为基础,使代码易于理解、维护和增强。而且,通过遵循这些程序设计标准,你作为一个 Java 软件开发者的生产效率会有显著提高。

    Java 代码编码规范

    代码规范相当重要. 代码规范提高软件代码的可读性 , 使得开发人员快速和彻底的理解新代码。 好的代码风格不仅会提高可读性,而且会使代码更健壮,更为重要的是在修改时不容易出错。 Java 编码规范 ...

    C语言的代码规范探讨

    这些名字应该能反映它所代表的实际东西,具有一定的意义,使其能够见名知义,有助于对程序功能的理解。命名采用匈牙利命名法。规则如下: (1)所有宏定义、枚举常数和const变量,用大写字母命名。在复合词里用下划线...

    Java源代码编码规范-

    编码规范提高了软件源代码的可读性,使得软件开发人员能够更加快速和彻底地理解程序源代码。好的代码风格不仅会提高可读性,而且会使代码更健壮,更为重要的是在修改时不容易出错。作为一个软件产品,制定严格的编码...

    Java代码编写规范

    - 一个软件的生命周期中,80%的花费在于维护 - 几乎没有任何一个软件,在其整个生命周期中,均由最初的开发人员来维护 - 编码规范可以改善软件的可读性,可以让程序员尽快而彻底地理解新的代码 - 如果你将源码作为...

    java项目开发的代码规范

    一个软件的生命周期80%在于维护 几乎没有任何一个软件在其维护的声明周期中,均由最初的开发人员来维护编码规范可以改善源码的可读性可以让程序员尽快而彻底地理解新的代码

Global site tag (gtag.js) - Google Analytics