比方说,我们有一些方法可以发送状态为电子邮件的电子邮件:
void sendEmail(Level level, String message) {
...
}
级别可以分为三种类型:
enum Level {
Info,
Warn,
Error
}
与发送电子邮件本身一起,我们希望使用标准记录器记录消息,但是我们也希望尊重消息级别,因此对于Info
级别,我们要使用INFO
记录器级别,依此类推。
我已经遇到一种观点,我们不应该在sendEmail
内进行日志记录,因为该方法本身是“泛型”的,而在内部它是执行“特定行为”的:
void sendEmail(Level level, String message) {
switch (level) {
case Info: LOGGER.info("Sending message {}", message); break;
...
}
// other email sending stuff...
}
但是当我们调用此方法时,应该在外部登录,例如:
LOGGER.error("Sending message: {}", message);
sendEmail(Level.Error, message);
...
LOGGER.warn("Sending message: {}", message);
sendEmail(Level.Warn, message);
还请注意,level
不仅用于记录日志,而且还用于电子邮件内容中。还应考虑到该示例非常简化:记录器的实际消息要复杂得多,其中包含封闭方法的其他几个参数。
处于温和的姿势,我认为两种方法都一样。更加严格一点,我想说,建议的方法是在日志消息始终相同的情况下进行许多LOGGER调用,这是纯代码重复。
任何利弊?以“基于观点”结束对我也很好,因为这意味着我的“温和”立场也是正确的。
答案 0 :(得分:1)
根据您使用的环境,您可以为sendMail
方法实现日志记录方面,该方法将对sendMail
的所有调用包装并将消息记录到正确的记录器中。
这将解决您的两个代码风格问题,因为它将避免代码重复和关注点分离(保持日志记录和单独发送邮件)。但是,如果这是您应用程序中各个方面的唯一用例,则会带来更高的复杂性。
实际上,我认为这更像是https://codereview.stackexchange.com/的问题