toString (): для отладки или для людей? - PullRequest
6 голосов
/ 21 января 2011
class Address
{
  private enum Component
  {
    NUMBER,
    STREET,
    STATE,
    COUNTRY
  }

  private Map<Component, String> componentToValue = ...;
}

Я бы хотел, чтобы мой класс содержал два метода:

  1. Один для указания значения каждого компонента адреса (поэтому я могу отлаживать, если что-то пойдет не так).1006 * Один, чтобы вернуть адрес в ожидаемой людьми форме: «1600 Amphitheatre Parkway Mountain View, CA 94043».

Какова наилучшая практика для Object.toString ()?Это изначально предназначено для № 1 или № 2?Есть ли лучшая практика для именования этих методов?

Ответы [ 6 ]

14 голосов
/ 21 января 2011

Будете ли вы одинаково форматировать адрес в SMS-сообщении и на HTML-странице?Вы бы отформатировали его таким же образом на английском, французском и японском языках?

Если нет, тогда у вас есть ответ: презентация принадлежит не объекту, а слою презентации, отображающему объект.Если объект специально не создан для уровня представления, например, если это HtmlI18nedAddress, используйте для отладки toString.

Рассмотрите Date против SimpleDateFormat.Date содержит состояние, а SimpleDateFormat возвращает несколько представлений.

3 голосов
/ 21 января 2011

Я бы сказал, первый. Форматирование данных не должно быть жестко закодировано в функцию ToString () объекта.

Я смотрю на это так: я пытаюсь сделать мои выходные данные ToString () доступными для чтения с помощью соответствующей функции Parse (строковые данные) (если эта функция действительно существует или не важна). Так что в этом случае, если вам нужно определенное форматирование, напишите определенную функцию и оставьте общие процедуры дампа данных для ToString ().

0 голосов
/ 22 января 2011

ToString обычно следует использовать только для отладочной информации. Имейте в виду, что вы переопределяете метод на Object; концептуально ли правильно, чтобы вызов метода для ссылки Object возвращал читабельный адрес? В некоторых случаях, в зависимости от проекта, это может иметь смысл, но для меня это звучит немного странно. Я бы реализовал новый метод.

Следует также отметить, что большинство современных IDE используют метод ToString для печати отладочной информации об объектах при их проверке.

0 голосов
/ 21 января 2011

Вы можете прочитать из некоторого свойства отладки, которое вы настраиваете динамически .:

@Override
public String toString() { 

    if(debug) {
        return debugAddrString()
    }
    return normalAddrString();

}
0 голосов
/ 21 января 2011

Я обычно использую Apache Commons ToStringBuilder http://commons.apache.org/lang/api-2.5/org/apache/commons/lang/builder/ToStringBuilder.html только с теми частями, которые я считаю абсолютно необходимыми для отладки.

0 голосов
/ 21 января 2011

Одна вещь, которую вы можете сделать, это использовать флаг Debug, чтобы изменить это так, как вам нравится:

public String toString(boolean debug) {
    if (debug) return debugStringVersion;
    else return humanVersion;
}

public String toString() {
    return toString(Util.DEBUG);
}

Конечно, это предполагает, что у вас есть служебный класс, в котором есть флаг отладки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...