整洁的代码 -- Java 静态函数和变量重用

Clean code -- Java static functions and variable reuse

我正在尝试清理静态函数。让我在这里提供此功能的模板。它是一个静态函数,仅在代码库中的两个地方使用,一个是 isClienttrue,另一个是 isClient 是 false。

public static void validate(BLangFunction resource, DiagnosticLog dlog, boolean resourceReturnsErrorOrNil,
                                boolean isClient) {
        if (!resourceReturnsErrorOrNil) {
            dlog.logDiagnostic(Diagnostic.Kind.ERROR, resource.pos, "Invalid return type: expected error?");
        }
        switch (resource.getName().getValue()) {
            case WebSocketConstants.RESOURCE_NAME_ON_OPEN:
            case WebSocketConstants.RESOURCE_NAME_ON_IDLE_TIMEOUT:
                validateOnOpenResource(resource, dlog, isClient);
                break;
            case WebSocketConstants.RESOURCE_NAME_ON_TEXT:
                validateOnTextResource(resource, dlog, isClient);
                break;
            case WebSocketConstants.RESOURCE_NAME_ON_BINARY:
                validateOnBinaryResource(resource, dlog, isClient);
                break;
            case WebSocketConstants.RESOURCE_NAME_ON_PING:
            case WebSocketConstants.RESOURCE_NAME_ON_PONG:
                validateOnPingPongResource(resource, dlog, isClient);
                break;
            case WebSocketConstants.RESOURCE_NAME_ON_CLOSE:
                validateOnCloseResource(resource, dlog, isClient);
                break;
            case WebSocketConstants.RESOURCE_NAME_ON_ERROR:
                validateOnErrorResource(resource, dlog, isClient);
                break;
            default:
                dlog.logDiagnostic(Diagnostic.Kind.ERROR, resource.pos,
                                   "Invalid resource name " + resource.getName().getValue() + " in service ");
        }

    }

此代码的问题在于 dlog 变量以及 isClient 变量被传递给所有其他被调用的函数。 resourceReturnsErrorOrNil 只用在一个地方。

我考虑过重构代码以具有非静态函数,这样 dlog 可以是一个 class 变量,并且可以有两个 classes,一个用于客户端,另一个用于服务与超级 class 中的所有公共代码。然后我想这个函数只在两个地方使用,我们应该为这些提供实例 classes 吗?

这个函数的源代码可以找到here

根据干净代码原则进行重构的最佳方法是什么?

Then I thought that this function is used only in two places and should we have instance classes for these?

这真的取决于你的目标。我同意,当前的代码远非理想。你概述的事情都是有道理的。所以,回答你的问题:是的,如果你认为这对你的代码库的质量有帮助,那么只在两个地方使用的 "instance" class 是非常好的。

另一件需要仔细研究的事情:也许有办法摆脱那个开关。例如,您可以使用地图(键:您的常量,值:一些功能接口......进行相应的验证)。

该方法应该是非静态的。这样,您就可以利用依赖注入来实现日志记录功能。