日志语句阻止重构:如何帮助解决这个问题?

Ror*_*ick 3 legacy logging refactoring

我有一些相对较大的遗留方法,我想重构.它符合Michael Feathers的"有效使用遗留代码"中指定的"项目符号方法"类型,因此可以以相当直接的方式分成几个顺序方法.但是它的每个连续步骤都输出一些日志消息,并且形成该消息需要比步骤本身更多的数据.因此,当我尝试提取方法时,我最终得到了具有6个参数的方法.如果我删除了那些日志语句,我将只有一个参数的方法.所以我实际上无法重构任何东西.而且我不允许删除日志语句.

方法的一部分看起来像这样:

// 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
Run Code Online (Sandbox Code Playgroud)

如您所见,注释掉了日志记录语句.在这种情况下,我可以提取方法boolean isFirstRegistration(String deviceId).但是当它们被取消注释时,签名就会膨胀boolean isFirstRegistration(String deviceId, String adminCode, ClientData clientData).这不是最极端的情况,只是第一眼看到的情况.你有什么想法我应该如何重构这种方法?

Car*_*ter 6

萌芽课.将日志记录转换为帮助程序类,并根据需要为其提供所需的所有数据.

更新:使用提供的示例变量,我会myLogger.setDevice(device)在设备填充后立即调用; 类似于adminCode,clientData等.给记录器记录方法,例如traceDeviceAdminCodeAndPhone()logFirstRegistration(),它使用自己的实例变量.变量发生变化的任何地方,再将它们反馈给记录器.现在,将记录器传递给您正在提取的方法,以及新方法直接需要的任何参数(但不多),并且您的记录器仍然可以在提取的方法中报告它需要的内容.

此外,如果开始看起来你的记录器与你的方法过于亲密,另一种方法是将方法提取到一个新类并将一些局部变量转换为实例变量; 那么记录器可以简单地向新类询问值而不是自己保留它们.但作为助手的记录器类可能是一个更小,影响更小的重构.这种好坏取决于你想要去哪里.