zoukankan      html  css  js  c++  java
  • 代码重构技术方法

    我是一个程序猿。我相信很多程序猿也有过同样的经历。在别人的公司骂烂代码。一边说,比其他人的代码更烂。


    守则没有开始恶化。代码恶化可具有以下
    1、不断变化的需求
    2、维持人体变异的水平代码
    3、保持大流量
    4、短,交付时间紧急
    5、个人习惯
    6、管理者对代码的要求
    以上都是有可能使代码变坏的可能,那么怎样写出好的代码?除了个人编程能力外还须要有一定的技巧,下面就是总结前人的经验

    得来的。须要在编程中养成一种好习惯,让写好代码成为一种习惯吧!

    !。!

    1、使用卫语句
    在什么情况下能够使用卫语句呢。例如以下

    public void add(Object element) {
    		if (!readOnly) {
    			int newSize = size + 1;
    			if (newSize > elements.length) {
    				Object[] newElement = new Object[elements.length + 10];
    				for (int i = 0; i < size; i++) {
    					newElements[i] = elements[i];
    				}
    				elements = newElements;
    			}
    			elements[size++] = element;
    		}
    	}
    使用卫语句重构后,例如以下

    public void add(Object element) {
    		if (readOnly)
    			return;
    
    		int newSize = size + 1;
    		if (newSize > elements.length) {
    			Object[] newElement = new Object[elements.length + 10];
    			for (int i = 0; i < size; i++) {
    				newElements[i] = elements[i];
    			}
    			elements = newElements;
    		}
    		elements[size++] = element;
    	}
    这样嵌套就少了一层,减少复杂度
    2、提炼方法
    当看见一个过长的函数或者一段须要凝视才干让人理解用途的代码,就应该将这段代码放进一个独立函数中,是最经常使用的重构手法
    之中的一个,那么什么情况下能够提炼方法呢
    一、反复代码
    二、使用助手方法。就是把凝视部分提炼成一个函数,例如以下

    public List getUsers(){
    		List users = new ArrayList<User>();
    		//.........
    		//sort by most recently registered users
    		Collections.sort(users, new User.UserComparatorByDescendingRegistration());
    		return users;
    	}
    提炼方法之后

    public List getUsers(){
    		List users = new ArrayList<User>();
    		//.........
    		sortByMostRecentlyRegistered(users);
    		return users;
    	}
    三、函数结构层次单一,例如以下
    重构前

    void printOwing(double amount){
            printBanner();
    
            System.out.println("name:" + _name);
            System.out.println("amount" + amount);
        }
    重构后

    void printOwing(double amount){
            printBanner();
            printDetails(amount);
        }

    四、以查询代替暂时变量,假设把暂时变量替换为一个查询,那么同一个类中的全部函数都能够获得这份信息。例如以下
    重构前代码

    public double getPrice(){
        	double basePrice = _quantity*_itemPrice;
            if (basePrice > 1000){
                return basePrice * 0.95;
            }else{
                return basePrice * 0.98;
            }
        }
    重构后代码

    public double getPrice(){
            if (BasePrice() > 1000){
                return BasePrice() * 0.95;
            }else{
                return BasePrice() * 0.98;
            }
        }
        
        private int BasePrice(){
            return _quantity* _itemPrice;
        }
    3、变量作用单一,例如以下代码的avg有两个作用,意义不明白。easy产生岐义
    private double calculateAverage(){
    		Iterator grades = clines.iterator();
    		double avg = 0.0;
    		while(grades.hasNext()){
    			grade = (CourseGrade)grades.next();
    			if(!(grade.grade == "F")){
    				avg = avg + grade.grade - 64;
    			}
    		}
    		avg = avg / clines.size();
    		return avg;
    	}
    4、又一次组织代码。变量定义与使用的跨度不要过大。即在使用时再定义。更easy理解
    重构前代码

    MARKETING_DATA *marketingData = new MARKETING_DATA;
        SALES_DATA *salesData = new SALES_DATA;
        TRAVEL_DATA *travelData = new TRAVEL_DATA;
        
        travelData.ComputeQuarterly();
        salesData.ComputeQuarterly();
        marketingData.ComputeQuarterly();
        
        salesData.ComputeAnnual();
        marketingData.ComputeAnnual();
        travelData.ComputeAnnual();
        
        salesData.print();
        travelData.print();
        marketingData.print();
    重构后代码

    MARKETING_DATA *marketingData = new MARKETING_DATA;
        marketingData.ComputeQuarterly();
        marketingData.ComputeAnnual();
        
        SALES_DATA *salesData = new SALES_DATA;
        salesData.ComputeQuarterly();
        salesData.ComputeAnnual();
        salesData.print();
        
        TRAVEL_DATA *travelData = new TRAVEL_DATA;
        travelData.ComputeQuarterly();
        travelData.ComputeAnnual();
        travelData.print();

    參考资料:

    1、http://www.cnblogs.com/matchcolor/archive/2010/08/02/1784888.html



  • 相关阅读:
    【转载】Highcharts一些属性
    What is assembly?
    用Apache配置Git服务器
    【转】.NET试题总结二
    【转】SVN服务器的快速搭建。
    【转】.NET试题总结一
    【转】国外C#开源系统一览表 ,C# Open Source
    Amazon S3 REST方式获取Object
    Action Filter
    a 标签 name 熟悉因为头部固定,导致置顶遮挡解决方案
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4581311.html
Copyright © 2011-2022 走看看