代码之家  ›  专栏  ›  技术社区  ›  Andremoniy

根据状态更改记录器级别

  •  1
  • Andremoniy  · 技术社区  · 7 年前

    假设我们有一种方法可以发送具有消息状态级别的电子邮件:

    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 不仅用于日志记录,还用于电子邮件内容内部。还考虑到示例非常简单:记录器的实际消息要复杂得多,包含封闭方法的其他几个参数。

    处于温和的地位,我认为这两种方法是平等的。如果严格一点,我会说建议的方法有很多日志调用,其中日志消息总是相同的(!)是纯代码复制。

    有什么利弊吗?以“基于意见”结尾对我来说也很好,因为这意味着我的“温和”立场也是正确的。

    1 回复  |  直到 7 年前
        1
  •  1
  •   dpr    6 年前

    根据您使用的环境,您可以为 sendMail 方法,它包装对 发送邮件 并将消息记录到正确的记录器。

    这将解决您的两个代码风格问题,因为它将避免代码重复和关注点分离(保持日志记录和邮件发送分离)。但是,如果这将是应用程序中的方面的唯一用途,它会引入额外的复杂性级别。

    实际上我觉得这更像是个问题 https://codereview.stackexchange.com/