Должен ли ToString использоваться для критической информации? - PullRequest
6 голосов
/ 10 августа 2011

Я только что наткнулся на некоторый код, который переопределяет ToString() и возвращает некоторую критическую информацию (не только отладочную информацию).Пользователи этого типа называют ToString() и анализируют эти критические данные.

Мое мнение, исходя из чтения различных фрагментов за годы, заключается в том, что ToString() имеет довольно слабый contract, то есть переопределяет его (, если вы хотите ) на дисплей что-то значимое.

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

Итак, мой вопрос: если текстовое представление объекта является критическим, следует использовать ToString() или использовать более явный метод / свойствоиспользуется, например AsText?

Ответы [ 7 ]

6 голосов
/ 10 августа 2011

Это похоже на довольно плохой план.Если пользователям этого типа нужны данные, тогда этот тип должен предоставлять методы для возврата этих данных.Почему люди анализируют строковое представление объекта , когда у них есть доступ к объекту ?

Конечно, существуют сценарии сериализации, но они четко определены и редко используют .ToString()чтобы выполнить свою работу.

Если требуется текстовое представление строки для не выходных целей, то я бы предпочел отдельный метод (который может или не может использовать ToString() для своей работы.) Этопомогает потребителям, а также разработчикам;было бы очень прискорбно, если бы новый кодер захотел добавить некоторую информацию о дампе отладки в ToString() и сломал потребителей класса.

UPDATE : Как указывает MattDavey, если вы реализуете IFormattable, тогда это хороший компромисс: ваши потребители называют ToString(), но с учетом конкретных форматов и надежного договора о том, что это значит.По-прежнему отличается от того, что делают ваши коллеги, но вариант, который может быть им более удобен.

4 голосов
/ 10 августа 2011

Лично я разделяю вашу озабоченность. Документация Microsoft гласит, что метод ToString()

[...] преобразует объект в его строковое представление, так что он подходит для отображения.

Документация Oracle для Java Object.toString() еще немного сильнее:

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

Я считаю это убедительным свидетельством того, что ToString() должен передавать информацию, удобную для людей.Метод, который возвращает данные, которыми манипулируют другие части приложения, должен иметь более информативное имя.На мой взгляд, даже AsText() является слишком общим.

1 голос
/ 10 августа 2011

Хороший вопрос.

Чтобы быть более точным, я бы создал другой метод для другого формата.

Пример: toJson () -> JSON-представление объекта toXML () -> XML-представление объекта. ... и т.д.

Примечание: вероятно, есть библиотека, которая сделает это за вас .. в Java есть. не знаю, в C #

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

1 голос
/ 10 августа 2011

Я не думаю, что есть определенный ответ.

Я бы поспорил со случаем использования ToString(), потому что при создании API в .NET важно, когда используются общие соглашения об именах в .NET, вместо использования менее знакомых имен, таких как AsText(),За этим соглашением следует, например, класс StringBuilder, поскольку его ToString() возвращает критическую информацию.

0 голосов
/ 10 августа 2011

Нет, я бы этого не делал.Например, если бы у меня был объект person, ToString() мог бы вернуть this.firstname + " " + this.lastname. Он использует его для целей автоматического отображения, например, для добавления элементов в список.Когда объект добавлен, отображается имя человека.Я не думаю, что поместил бы критическую или чувствительную информацию в переопределение.

0 голосов
/ 10 августа 2011

Нет вопросов, нет однозначного ответа на ваш вопрос. По моему мнению, такие методы, как ToString или AsText, должны использоваться только для обеспечения внутреннего состояния объекта, например, чтобы войти В объектно-ориентированном языке функциональные аспекты должны быть получены с использованием четко определенного интерфейса, например, GetOrderId, GetUserName.

0 голосов
/ 10 августа 2011

На мой взгляд, ToString(), в конце концов, это метод, который мы можем использовать любым любым желательным способом, например 5.ToString(), преобразуем int в строку и возвращаем его независимо от того, будет ли он использоватьсядля отображения или нет, напротив, во многих ситуациях мы полагаемся на ту информацию, которая возвращается из int.ToString() для выполнения дальнейших операций.

...