解决方案 »

  1.   


    double getPay(){
        if(isA) {
                return getA();
        }
       else if(isB) {
                return getB();
        } 
       else if(isC) {
                return getC();
        }
        else {
                return getD();
         }
    }
      

  2.   

    用switch也可以吧,阅读起来也比较方便。
      

  3.   


    double getPay(){
        if(isA) {
                return getPayIsA();
        }
       else if(isB) {
                return getPayIsB();
        } 
       else if(isC) {
                return getPayIsC();
        }
        else {
                return getPaydefault();
         }
    }
      

  4.   

    第二版double getPay(){
        if(booleanStatus.getIsA) {
                return getPayIsA();
        }
       else if(booleanStatus.getIsB) {
                return getPayIsB();
        } 
       else if(booleanStatus.getIsC) {
                return getPayIsC();
        }
        else {
                return getPaydefault();
         }
    }
      

  5.   

    第二版修正,方法忘打括号了double getPay(){
        if(booleanStatus.getIsA()) {
                return getPayIsA();
        }
       else if(booleanStatus.getIsB()) {
                return getPayIsB();
        } 
       else if(booleanStatus.getIsC()) {
                return getPayIsC();
        }
        else {
                return getPaydefault();
         }
    }
      

  6.   

    switch()
    {
    case isA:return getA();
    case isB:return getB();
    case isC:return getC();
    case isD:return getD();
    }
      

  7.   

    大多数关于重构的面试题,都是”期待交流“的因为重构这种东东,没有唯一的标准答案
    有时为了达到极致的速度,必须得把一些if语句提前,甚至立即return回去
    有时为了达到今后很容易添加业务逻辑,需要引入”查表法“;甚至把业务逻辑剥离到程序之外,保存到数据库或者xml等文件里去,达到不改动程序的逻辑,只修改外部数据就能满足经常变化的业务
    所以,一句话不反问肯定是不行的至少要考虑变量命名的问题、注释的问题,代码简洁性的问题,以展示你平时良好的编程习惯
    另外,现代的Java IDE都有把代码重新布局的快捷键,记得用一下
    至于是否需要追加异常处理,追加日志处理,就需要和面试官交流了下面的代码仅仅是抛砖引玉,实际项目中写成这样会被项目负责人批评的……/**
     * Created by 日知己所无 on 2015/03/13.
     */
    public class GetPay {
        private boolean isA;
        private boolean isB;
        private boolean isC;    /**
         * 取得工资金额
         *
         * @return 工资金额
         */
        double getPay() { // 【可以考虑把isA isB isC作为参数传递进来,以减少对其他变量的依存,降低耦合度,便于以后维护】
            
            // 【原来的代码比较严重的问题是使用了不容易让人理解的A B C D这样的变量】
            // 【所以上来要先询问一下面试的人:具体的含义,比如初级工程师,中级工程师,高级工程师,工程师以外的员工等,把名字先定好】
            double result = 0.0; // 返回值:工资金额【一般来讲,给变量赋上初始值被视为比较好的编程习惯】
            
            // 【如果需要考虑运行效率的话,对于if语句,一般要把最常用判断放在最前面】
            // 【比如有5000名员工,其中4000名是中级工程师,如果需要快速运算,那么就要考虑把中级工程师那个判断移动到最前面】
            // 【只要有这个意识就可以,具体怎么做可以询问面试官】
            if (isA) { // 【对于if语句,后面的花括号是必须加的。不加虽然暂时没有问题,但是以后如果又追加代码时,很容易出现问题】
                result = getA();
            } else if (isB) { // 【不论是美观还是运行效率,else if都优于原来的写法】
                result = getB();
            } else if (isC) {
                result = getC();
            } else {
                result = getD();                
            }
            // 【这个例子相对还是比较简单,对于及其复杂的情况,可能得考虑把变量和方法放到一个数组中,然后根据查表法来提高代码的可读性和可维护性】
            return result;
        }    private double getA() {
            return 0.0;
        }    private double getB() {
            return 0.0;
        }    private double getC() {
            return 0.0;
        }    private double getD() {
            return 0.0;
        }
    }
      

  8.   

    谢谢大家,看了大家写的,和我想法差不多,当时我也说是用if else,或者如果可以使用switch也可以考虑,然后说了写注意事项,然后再根据具体情况判断。但是他娘的居然直接来了句不对,什么话都没说,感觉纯粹就是不想招人。
      

  9.   

    改成elseif可以减少代码清晰度和判断次数