如何重构java代码,准备可变长度的args并调用方法?

时间:2014-11-11 03:31:25

标签: java refactoring

我有一个.java文件,其中存在许多方法,例如以下代码,如何重构以使其更清晰?

public static void e(Throwable tr) {
    if (!debug) {
        return;
    }
    if (!allowE) return;
    if (tr == null) {
        return;
    }
    String content = wrapContent(tr.getMessage());
    StackTraceElement caller = getCallerStackTraceElement();
    String tag = generateTag(caller);

    customLogger.e(tag, content, tr);
}

public static void i(String content) {
    if (!debug) {
        return;
    }
    if (!allowI) return;
    content = wrapContent(content);
    StackTraceElement caller = getCallerStackTraceElement();
    String tag = generateTag(caller);

    customLogger.i(tag, content);
}

======更新==

这个类是android.util.Log的包装器,对于那些建议遵循命名约定的人来说:)。

3 个答案:

答案 0 :(得分:0)

您可以将大部分代码删除为共享方法,然后从两个地方调用它。

public static voidcombined(String content, Throwable tr, bool allow)
{
    if (!debug) return;
    if (!allow) return;
    content = wrapContent(content);
    StackTraceElement caller = getCallerStackTraceElement();
    String tag = generateTag(caller);
    if (tr != null) {
        customLogger.e(tag, content, tr);
    } else {
        customLogger.i(tag, content);
    }
}

public static void e(Throwable tr) {
    if (tr == null) {
        return;
    }
    combined(tr.getMessage(), tr, allowE);
}

public static void i(String content) {
    combined(content, null, allowI);
}

答案 1 :(得分:0)

    if (!debug) {
        return;
    }
    if (!allowE) return;  

出现两次,我们可以将其放入方法isAllow()

String content = wrapContent(tr.getMessage());
StackTraceElement caller = getCallerStackTraceElement();
String tag = generateTag(caller);

也出现两次,customLogger.e和customLogger.i非常相似。让我们把它放进方法logInLevel()。

所以,就像这样:

    public static void e(Throwable tr) {
        if (!isAllow()||tr==null) return ;
        logInLevel(ERROR,tr.getMessage())
    }

    public static void i(String content) {
        if (!isAllow()) return ;
        logInLevel(INFO,content);
    }

    private static boolean isAllow(){
         return debug&&allowE;
     }

    private static logInLevel(int level, String content){
        StackTraceElement caller = getCallerStackTraceElement();
        String tag = generateTag(caller);
        if(level==INFO){
            customLogger.i(tag, content);
        }
        else{//ERROR , you may add more log level here
            customLogger.e(tag, content);
        }
    }

答案 2 :(得分:0)

我们的想法是应用关注点分离设计原则,以确保代码的不同部分能够解决特定问题。

/**
 * Logs error message 
 * @param tr a {@link Throwable} object containing the message to log
 */
public static void logErrorMessage(Throwable tr) {
    if (tr == null) {
        return;
    }
    logContent(tr.getMessage(), allowE, debug, LogLevel.ERROR);
}

/**
 * Logs message
 * @param content the message to log
 * @param allow some variable 
 * @param debug check the debug status 
 * @param ll message log level 
 */
public static void logContent(String content, boolean allow, boolean debug , LogLevel ll) {
    if (!debug) || !allow) return;
    switch(ll) {
    case ERROR:
        customLogger.e(getTag(content), content);
        break;
    case INFO:
        customLogger.i(getTag(content), content);
        break;
    default:
    }

}

/**
 * Generates tag 
 * @param content the message to log
 * @return a tagged string
 */
public static String getTag(String content) {
    content = wrapContent(content);
    return  generateTag(getCallerStackTraceElement());
}