【发布时间】:2011-03-22 04:58:15
【问题描述】:
我想重构一些相对较大的遗留方法。它符合 Michael Feathers 的“有效地使用旧代码”中指定的“项目符号方法”类型,因此可以以相当直接的方式将其拆分为多个顺序方法。但是它的每个连续步骤都会输出一些日志消息,并且形成该消息需要比步骤本身更多的数据。所以当我尝试提取方法时,我最终得到的方法有 6 个参数。如果我删除了这些日志语句,我将拥有只有 1 个参数的方法。所以我实际上无法重构任何东西。而且我不能只删除日志语句。
方法的一部分是这样的:
// much of code before
Device device = getDevice(deviceID);
boolean isFirstRegistration = false;
if (device == null) {
/*logger.trace(
"DeviceId", deviceID,
"ADM", adminCode,
"Phone", clientData.getPhone()
);
logger.info("First registration of the device. Device ID - " + deviceID);*/
isFirstRegistration = true;
} else {
/*logger.trace(
"DeviceId", deviceID,
"ADM", adminCode,
"Phone", clientData.getPhone()
);
logger.info("Device ID - " + deviceID
+ " has been previously registered by adminCode: "
+ device.getAdminCode());*/
}
// much of code after
如您所见,注释掉了日志语句。在这种情况下,我可以提取方法boolean isFirstRegistration(String deviceId)。但是当它们未注释时,签名会膨胀到boolean isFirstRegistration(String deviceId, String adminCode, ClientData clientData)。这不是最极端的情况,只是第一眼看到的情况。你有什么想法我应该如何重构这种方法?
【问题讨论】:
-
我们可以看看吗?您可以让日志辅助方法获取额外数据,并返回一个字符串/对象,然后将其传递给您的方法进行日志记录。或者将登录所需的所有项目放入单个数组或哈希中并将其传入。
-
你想通过重构来完成什么?
-
我会尝试编写类似于该方法的部分的sn-p。
-
@Peter Ruderman:测试它并引入新功能,而不是进一步破坏代码库。
标签: logging refactoring legacy