class Main {

  public static int total = 5;

  public static void main(String[] args) {
    addToTotal(5);
    addToTotal(199);
    System.out.println(addToTotal(1));
  }

  public static String addToTotal(int amount){
    total += amount;
    return "Successfully added " + amount + " to total for result of " + total;
  }
}

Например, возьмите эту программу, которая добавляет к общему классу. Обычно для этого не требуется оператор return, но мне кажется, что возвращение строки для того, что произошло, похоже, поможет отладить сложные проблемы. Это считается плохой практикой?

0
Jackson Ennis 5 Фев 2020 в 20:22

2 ответа

Лучший ответ

Методы должны завершить действие, которое описывает их имя.

Если вы начнете это делать, программист может начать использовать возвращенные строки по причинам, отличным от отладки, и начнется цепочка кода спагетти.

Всегда держите код как можно проще. Здесь вы пытаетесь описать ведение журнала трассировки.

SL4J - это отличный фасад ведения журнала для Java, поскольку он позволяет реализовывать несколько служб ведения журнала во время выполнения. Вот пример использования в коде:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

class Main {

  private static final Logger log = LoggerFactory.getLogger(Main.class);
  public static int total = 5;

  public static void main(String[] args) {
    addToTotal(5);
    addToTotal(199);
    System.out.println(addToTotal(1));
  }

  public static void addToTotal(int amount){
    total += amount;

    log.trace("Successfully added " + amount + " to total for result of " + total);
  }
}

С настроенной службой ведения журнала вы можете сделать вывод куда угодно. Распространенными выходными данными являются консоль, файл, средство просмотра событий в Windows или системный журнал в Linux, веб-приложение для ведения журнала или даже веб-крючок Slack или Discord. (Хотя вы не хотите отправлять журналы трассировки в Slack или Discord.)

2
CausingUnderflowsEverywhere 5 Фев 2020 в 19:34

Да, плохая практика. Что произойдет, если вы захотите вернуть значение, а также добавить оператор отладки? Вы не можете сделать оба.

Вы также получаете снижение производительности конкатенации строк, даже если она не используется. Умный оптимизатор может оптимизировать это, но я бы на это не рассчитывал.

параметризованное ведение журнала - это то, что вы должны использовать. Он будет выполнять объединение, только если это действительно необходимо. ИМО это тоже более читабельно.

public static void addToTotal(int amount){
    total += amount;
    log.trace("Successfully added {} to total for result of {}", amount, total);
}
3
Michael 5 Фев 2020 в 17:37