重构下面的代码,使其清晰易读

火光闪耀 2015-03-12 10:32:35
double getPay(){
double result;
if(isA) result=getA();
else{
if(isB) result=getB();
else{
if(isC) result=getC();
else result=getD();
}
}
return result;
}

最近遇到了这么个面试题,实在不知道该怎么重构,请问大家这应该怎么重构呢?
...全文
294 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
master_y 2015-03-13
  • 打赏
  • 举报
回复
switch() { case isA:return getA(); case isB:return getB(); case isC:return getC(); case isD:return getD(); }
繁华终归落尽 2015-03-13
  • 打赏
  • 举报
回复
引用 2 楼 u012017135 的回复:
用switch也可以吧,阅读起来也比较方便。
switch还不能使用boolean吧
天空趋虚 2015-03-13
  • 打赏
  • 举报
回复
第二版修正,方法忘打括号了

double getPay(){
    if(booleanStatus.getIsA()) {
            return getPayIsA();
    }
   else if(booleanStatus.getIsB()) {
            return getPayIsB();
    } 
   else if(booleanStatus.getIsC()) {
            return getPayIsC();
    }
    else {
            return getPaydefault();
     }
}
天空趋虚 2015-03-13
  • 打赏
  • 举报
回复
第二版

double getPay(){
    if(booleanStatus.getIsA) {
            return getPayIsA();
    }
   else if(booleanStatus.getIsB) {
            return getPayIsB();
    } 
   else if(booleanStatus.getIsC) {
            return getPayIsC();
    }
    else {
            return getPaydefault();
     }
}
天空趋虚 2015-03-13
  • 打赏
  • 举报
回复

double getPay(){
    if(isA) {
            return getPayIsA();
    }
   else if(isB) {
            return getPayIsB();
    } 
   else if(isC) {
            return getPayIsC();
    }
    else {
            return getPaydefault();
     }
}
jackcoding 2015-03-13
  • 打赏
  • 举报
回复
用switch也可以吧,阅读起来也比较方便。
scmhw 2015-03-13
  • 打赏
  • 举报
回复
改成elseif可以减少代码清晰度和判断次数
火光闪耀 2015-03-13
  • 打赏
  • 举报
回复
谢谢大家,看了大家写的,和我想法差不多,当时我也说是用if else,或者如果可以使用switch也可以考虑,然后说了写注意事项,然后再根据具体情况判断。但是他娘的居然直接来了句不对,什么话都没说,感觉纯粹就是不想招人。
日知己所无 2015-03-13
  • 打赏
  • 举报
回复
大多数关于重构的面试题,都是”期待交流“的 因为重构这种东东,没有唯一的标准答案 有时为了达到极致的速度,必须得把一些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;
    }
}
姜小白- 2015-03-12
  • 打赏
  • 举报
回复

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

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧