优雅代码 - 其他案例分析

一些随机抽取的案例

案例1(没有必要的hash浪费)
// Dubbo 源码,SimpleDataStore.get
// 如果containsKey为true,则会出现2次hash操作(containsKey一次,get操作再一次)。浪费
public Object get(String componentName, String key) {
    if (!data.containsKey(componentName)) {
        return null;
    }
    return data.get(componentName).get(key);
}
// 重构后,用一个零时变量接一下,就不需要做2次hash了
public Object get(String componentName, String key) {
  	ConcurrentMap<String, Object> value = data.get(componentName);
  	if(value == null) {
      	return null;
    }
    return value.get(key);
}

案例2
// Dubbo 源码,ExtensionLoader.loadResource
// 这个方法写的挺奇怪的。两层try,没必要的。
private void loadResource(Map<String, Class<?>> extensionClasses, ClassLoader classLoader, java.net.URL resourceURL) {
    try {
        BufferedReader reader = new BufferedReader(new InputStreamReader(resourceURL.openStream(), "utf-8"));
        try {// 对于资源处理,没有必要使用2层try
            String line;
            while ((line = reader.readLine()) != null) {
                final int ci = line.indexOf('#');
                if (ci >= 0) line = line.substring(0, ci);
                line = line.trim();
                if (line.length() > 0) {// 这边用if反写的方式,会更加清晰
                    try {
                        String name = null;
                        int i = line.indexOf('=');
                        if (i > 0) {
                            name = line.substring(0, i).trim();
                            line = line.substring(i + 1).trim();
                        }
                        if (line.length() > 0) {
                            loadClass(extensionClasses, resourceURL, Class.forName(line, true, classLoader), name);
                        }
                    } catch (Throwable t) {
                        IllegalStateException e = new IllegalStateException("Failed to load extension class(interface: " + type + ", class line: " + line + ") in " + resourceURL + ", cause: " + t.getMessage(), t);
                        exceptions.put(line, e);
                    }
                }
            }
        } finally {
            reader.close();
        }
    } catch (Throwable t) {
        logger.error("Exception when load extension class(interface: " +
                type + ", class file: " + resourceURL + ") in " + resourceURL, t);
    }
}
// 重构后
private void loadResource(Map<String, Class<?>> extensionClasses, ClassLoader classLoader, java.net.URL resourceURL) {
    BufferedReader reader;// 资源在外面申明,当然java7的方式放在try的括号中也是可以的。
    try {
        reader = new BufferedReader(new InputStreamReader(resourceURL.openStream(), "utf-8"));

        String line;
        while ((line = reader.readLine()) != null) {
            final int ci = line.indexOf('#');
            if (ci >= 0) {
                line = line.substring(0, ci);
            }

            line = line.trim();
            if (line.length() <= 0) {// if反写,直接continue
                continue;
            }

            try {
                String name = null;
                int i = line.indexOf('=');
                if (i > 0) {
                    name = line.substring(0, i).trim();
                    line = line.substring(i + 1).trim();
                }
                if (line.length() > 0) {
                    loadClass(extensionClasses, resourceURL, Class.forName(line, true, classLoader), name);
                }
            } catch (Throwable t) {
                IllegalStateException e = new IllegalStateException("Failed to load extension class(interface: " + type + ", class line: " + line + ") in " + resourceURL + ", cause: " + t.getMessage(), t);
                exceptions.put(line, e);
            }
        }
    } catch (Throwable t) {
        logger.error("Exception when load extension class(interface: " +
                type + ", class file: " + resourceURL + ") in " + resourceURL, t);
    } finally {// 正常关闭资源
        reader.close();
    }
}

案例3(if内容体,任何时候都加上大括号)
// Dubbo 源码,ExtensionLoader.getExtensionLoader
// 前面2个if都是的内容体都是单行的。第二个加上了大括号,第一个却没有加
public static <T> ExtensionLoader<T> getExtensionLoader(Class<T> type) {
    if (type == null)// 没有加大括号
        throw new IllegalArgumentException("Extension type == null");
    if (!type.isInterface()) {
        throw new IllegalArgumentException("Extension type(" + type + ") is not interface!");
    }
    if (!withExtensionAnnotation(type)) {
        throw new IllegalArgumentException("Extension type(" + type +
                ") is not extension, because WITHOUT @" + SPI.class.getSimpleName() + " Annotation!");
    }

    ExtensionLoader<T> loader = (ExtensionLoader<T>) EXTENSION_LOADERS.get(type);
    if (loader == null) {
        EXTENSION_LOADERS.putIfAbsent(type, new ExtensionLoader<T>(type));
        loader = (ExtensionLoader<T>) EXTENSION_LOADERS.get(type);
    }
    return loader;
}
// 重构后
public static <T> ExtensionLoader<T> getExtensionLoader(Class<T> type) {
    if (type == null) {// 任何时候都加上大括号。有助于阅读
        throw new IllegalArgumentException("Extension type == null");
    }
    if (!type.isInterface()) {
        throw new IllegalArgumentException("Extension type(" + type + ") is not interface!");
    }
    if (!withExtensionAnnotation(type)) {
        throw new IllegalArgumentException("Extension type(" + type +
                ") is not extension, because WITHOUT @" + SPI.class.getSimpleName() + " Annotation!");
    }

    ExtensionLoader<T> loader = (ExtensionLoader<T>) EXTENSION_LOADERS.get(type);
    if (loader == null) {
        EXTENSION_LOADERS.putIfAbsent(type, new ExtensionLoader<T>(type));
        loader = (ExtensionLoader<T>) EXTENSION_LOADERS.get(type);
    }
    return loader;
}

案例4(来一段复杂的)
// Dubbo 源码,ServiceConfig.doExportUrlsFor1Protocol(方法太大,截取了一段比较复杂的来搞一搞)
// 我数了下,最深12层。这段代码不在里面瞎写了,太复杂,影响阅读
if (methods != null && !methods.isEmpty()) {
    for (MethodConfig method : methods) {
        appendParameters(map, method, method.getName());
        String retryKey = method.getName() + ".retry";
        if (map.containsKey(retryKey)) {
            String retryValue = map.remove(retryKey);
            if ("false".equals(retryValue)) {
                map.put(method.getName() + ".retries", "0");
            }
        }
        List<ArgumentConfig> arguments = method.getArguments();
        if (arguments != null && !arguments.isEmpty()) {
            for (ArgumentConfig argument : arguments) {
                // convert argument type
                if (argument.getType() != null && argument.getType().length() > 0) {
                    Method[] methods = interfaceClass.getMethods();
                    // visit all methods
                    if (methods != null && methods.length > 0) {
                        for (int i = 0; i < methods.length; i++) {
                            String methodName = methods[i].getName();
                            // target the method, and get its signature
                            if (methodName.equals(method.getName())) {
                                Class<?>[] argtypes = methods[i].getParameterTypes();
                                // one callback in the method
                                if (argument.getIndex() != -1) {
                                    if (argtypes[argument.getIndex()].getName().equals(argument.getType())) {
                                        appendParameters(map, argument, method.getName() + "." + argument.getIndex());
                                    } else {
                                        throw new IllegalArgumentException("argument config error : the index attribute and type attribute not match :index :" + argument.getIndex() + ", type:" + argument.getType());
                                    }
                                } else {
                                    // multiple callbacks in the method
                                    for (int j = 0; j < argtypes.length; j++) {
                                        Class<?> argclazz = argtypes[j];
                                        if (argclazz.getName().equals(argument.getType())) {
                                            appendParameters(map, argument, method.getName() + "." + j);
                                            if (argument.getIndex() != -1 && argument.getIndex() != j) {
                                                throw new IllegalArgumentException("argument config error : the index attribute and type attribute not match :index :" + argument.getIndex() + ", type:" + argument.getType());
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                } else if (argument.getIndex() != -1) {
                    appendParameters(map, argument, method.getName() + "." + argument.getIndex());
                } else {
                    throw new IllegalArgumentException("argument config must set index or type attribute.eg: <dubbo:argument index='0' .../> or <dubbo:argument type=xxx .../>");
                }

            }
        }
    } // end of methods for
}

// 重构后,最深变成了6层
// 多使用循环控制continue,break
if (methods != null && !methods.isEmpty()) {
    for (MethodConfig method : methods) {
        appendParameters(map, method, method.getName());
        String retryKey = method.getName() + ".retry";
        if (map.containsKey(retryKey)) {
            String retryValue = map.remove(retryKey);
            if ("false".equals(retryValue)) {
                map.put(method.getName() + ".retries", "0");
            }
        }
        List<ArgumentConfig> arguments = method.getArguments();
        if (arguments == null || arguments.isEmpty()) {
            continue;
        }

        for (ArgumentConfig argument : arguments) {
            boolean isArgumentTypeEmpty = argument.getType() == null || argument.getType().length() == 0;
            boolean argumentHasIndex = argument.getIndex() != -1;
            if (isArgumentTypeEmpty && !argumentHasIndex) {
                throw new IllegalArgumentException("argument config must set index or type attribute.eg: <dubbo:argument index='0' .../> or <dubbo:argument type=xxx .../>");
            }
            if (isArgumentTypeEmpty) {
                appendParameters(map, argument, method.getName() + "." + argument.getIndex());
                continue;
            }

            Method[] methods = interfaceClass.getMethods();
            if (methods == null || methods.length == 0) {
                continue;
            }
            for (int i = 0; i < methods.length; i++) {
                String methodName = methods[i].getName();
                if (!methodName.equals(method.getName())) {
                    continue;
                }
                Class<?>[] argtypes = methods[i].getParameterTypes();
                if (argument.getIndex() != -1) {
                    if (!argtypes[argument.getIndex()].getName().equals(argument.getType())) {
                        throw new IllegalArgumentException("argument config error : the index attribute and type attribute not match :index :" + argument.getIndex() + ", type:" + argument.getType());
                    }
                    appendParameters(map, argument, method.getName() + "." + argument.getIndex());
                    continue;
                }

                for (int j = 0; j < argtypes.length; j++) {
                    Class<?> argclazz = argtypes[j];
                    if (!argclazz.getName().equals(argument.getType())) {
                        continue;
                    }
                    if (argument.getIndex() != -1 && argument.getIndex() != j) {
                        throw new IllegalArgumentException("argument config error : the index attribute and type attribute not match :index :" + argument.getIndex() + ", type:" + argument.getType());
                    }
                    appendParameters(map, argument, method.getName() + "." + j);
                }
            }
        }
    }
}

全部内容查看 优雅代码汇总篇

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值