整洁的代码 -- Java 静态函数和变量重用
Clean code -- Java static functions and variable reuse
我正在尝试清理静态函数。让我在这里提供此功能的模板。它是一个静态函数,仅在代码库中的两个地方使用,一个是 isClient
是 true
,另一个是 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 是非常好的。
另一件需要仔细研究的事情:也许有办法摆脱那个开关。例如,您可以使用地图(键:您的常量,值:一些功能接口......进行相应的验证)。
该方法应该是非静态的。这样,您就可以利用依赖注入来实现日志记录功能。
我正在尝试清理静态函数。让我在这里提供此功能的模板。它是一个静态函数,仅在代码库中的两个地方使用,一个是 isClient
是 true
,另一个是 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 是非常好的。
另一件需要仔细研究的事情:也许有办法摆脱那个开关。例如,您可以使用地图(键:您的常量,值:一些功能接口......进行相应的验证)。
该方法应该是非静态的。这样,您就可以利用依赖注入来实现日志记录功能。