美文网首页iOS OC 学习手册连载小说程序员
优雅编程之这样写函数,你就“正常”了(二)

优雅编程之这样写函数,你就“正常”了(二)

作者: 阿_毅 | 来源:发表于2016-07-11 23:11 被阅读0次

    开心一笑

    【儿子和爸爸看电视,剧中男主角跪下向女主角求婚。 儿子好奇地问:“爸爸,你向妈妈求婚时有没有下跪?” 爸爸:“没有。你妈妈说以后跪的机会多着呢,不差这一次。】

    提出问题

    代码整洁之道对函数整洁的几点总结和观点????

    解决问题

    下面是看《代码整洁之道》后,自己总结的几点关于函数整洁之道的总结:

    1)Function should do one thing. They should do it well. They should do it only. "
    (函数只应该做一件事情,把一件事情做好,而且只由它来做这一件事情);

    例:

    /**
     * 只做好一件事
     */
    public void onlyDoOneThing(){
        
    }
    

    2)短小,以行数来要求似乎有些苛刻,一个行数在20行以内被称为小函数,或是要在5行以内才是小函数,有一些极端.

    3)函数中的缩进层级不应该多于一层或者两层;

    例:

    /**
     * 只做一件事
     */
    public void onlyDoOneThing(){
        String ay = "";
        Boolean flag = true;
        /** 第一层级 不错 **/
        if(flag){
    
            /** 第二层级 还能接受 **/
            if(flag){
    
                /** 第三层级 没法接受了 **/
                if(flag){
                    
                }
            }
        }
    }
    

    4)函数参数:应该少于2个,如果函数超过2元:应该将其中的某些参数封装成类;

    例:

    /**
     * 只做一件事
     * @param arg1  参数1
     */
    public void onlyDoOneThing(String arg1){
        
        System.out.println("一个参数,不错!!!");
    }
    
    /**
     * 只做一件事
     * @param arg1  参数1
     * @param arg2  参数2
     */
    public void onlyDoOneThing(String arg1,String arg2){
        
        System.out.println("两个参数,能接受和理解!!!");
    }
    
    /**
     * 只做一件事
     * @param arg1  参数1
     * @param arg2  参数2
     * @param arg3  参数3
     * @param arg4  参数4             
     */
    public void onlyDoOneThing(String arg1,String arg2,String arg3,String arg4){
    
        System.out.println("3个或3个以上的参数,没法接受!!!");
    }
    

    解决方法

    Class XXX{
        private String arg3;
        privte  String arg4;
        //省略set get方法
    }
    

    5)一个函数要么做一件事(指令),要么回答一件事(询问)

    package com.hwy.test;
    
    /**
     * 代码整洁之道
     * Created by Ay on 2016/7/11.
     */
    public class CodeCleanTest {
    
        public static void main(String[] args) {
    
            /** 约会 **/
            engagementWithMe();
            /** 表白(询问) **/
            boolean isMerryMe =  canMerryMe();
    
            if(isMerryMe){
                /** 结婚(指令)  **/
                getMarried();
            }
    
        }
    
        /**
         * 约会
         */
        public static void engagementWithMe(){
            System.out.println("约会");
        }
    
        /**
         * 表白
         */
        public static boolean canMerryMe(){
            return true;
        }
    
        /**
         * 结婚
         */
        public static void getMarried(){
            System.out.println("结婚");
        }
    
    
    }
    

    6)使用描述性的名字,函数名字:动/名词形式;

    7)分离try/catch块:集中在一个函数中;

    例:

    package com.hwy.test;
    
    /**
     * 代码整洁之道
     * Created by Ay on 2016/7/11.
     */
    public class CodeCleanTest {
    
        public static void main(String[] args) {
    
            try{
                /** 约会 **/
                engagementWith();
                
            }catch (Exception e){
                logError(e);
            }
        }
    
        /**
         * 约会
         */
        public static void engagementWith(){
            System.out.println("约会");
        }
    
        /**
         * 处理异常
         * @param e
         */
        public static void logError(Exception e){
            System.out.println(e.getMessage());
        }
    
    }
    

    8)使用异常代替返回错误码:这样错误代码可以从主路径代码中分离出来,避免嵌套;

    /**
     * 更新决策
     * @param dePolicyDecisionDTO
     * @return
     * @throws IllegalAccessException
     * @throws NoSuchMethodException
     * @throws InvocationTargetException
     */
    @Override
    public DePolicyDecisionDTO update(DePolicyDecisionDTO dePolicyDecisionDTO) throws IllegalAccessException, NoSuchMethodException, InvocationTargetException {
        DePolicyDecision exists = policyDecisionRepository.findByMatterNameAndType(dePolicyDecisionDTO.getMatterName(), dePolicyDecisionDTO.getType());
        if(exists!=null&&!exists.getId().equals(dePolicyDecisionDTO.getId())){
            /** 这里使用异常,错误代码可以从主路径代码中分离出来,BusinessExceptio是公司自己封装的异常类 **/
            throw new BusinessException(ErrorCode.De.alreadyTypeExists);
        }
        DePolicyDecision dePolicyDecision = new DePolicyDecision();
        PropertyUtils.copyProperties(dePolicyDecision, dePolicyDecisionDTO);
        policyDecisionRepository.saveAndFlush(dePolicyDecision);
        return policyDecisionDAO.findDtoById(dePolicyDecisionDTO.getId());
    }
    

    9)阅读代码,自顶向下规则:每个函数后面都跟着下一个抽象层的函数;

    努力

    读书感悟

    来自《解忧杂货店》

    • 心,一旦离开了,就再不会回来。
    • 人与人之间情断义绝,并不需要什么具体的理由。就算表面上有,也很可能只是心已经离开的结果,事后才编造出的借口而已。因为倘若心没有离开,当将会导致关系破裂的事态发生时,理应有人努力去挽救。如果没有,说明其实关係早已破裂。
    • 这么多年咨询信看下来,让我逐渐明白一件事。很多时候,咨询的人心里已经有了答案,来咨询只是想确认自己的决定是对的。所以有些人读过回信后,会再次写信过来,大概就是因为回答的内容和他的想法不一样。
    • 就算是恨,也是一种很抽象的感情。

    其他

    如果有带给你一丝丝小快乐,就让快乐继续传递下去,欢迎转载,点赞,顶,欢迎留下宝贵的意见,多谢支持!

    相关文章

      网友评论

        本文标题:优雅编程之这样写函数,你就“正常”了(二)

        本文链接:https://www.haomeiwen.com/subject/pomjjttx.html