Ответ 1
В С# вы не можете создавать методы вне классов или структур. Поэтому, когда вы хотите создавать методы утилиты, лучше хранить их в статическом классе.
Итак, я бы сказал, что нет ничего ориентированного на объект статического класса.
Не являются ли классы вызываемыми после объектов, а не действиями? Он просто не сидит вместе с теорией ОО, которую я узнал.
Одна мысль заключалась в том, что, возможно, поскольку Convert содержит только статические методы, то никакие экземпляры этого не должны создаваться вообще, что может сделать это приемлемым исключением.
В С# вы не можете создавать методы вне классов или структур. Поэтому, когда вы хотите создавать методы утилиты, лучше хранить их в статическом классе.
Итак, я бы сказал, что нет ничего ориентированного на объект статического класса.
Нет ничего объектно-ориентированного в классе Convert, поскольку объектная ориентация - это данные с поведением, а класс Convert не содержит данных или состояний.
Это в основном практическое рассмотрение.
В Eiffel, например, методы преобразования были бы определены в базовом классе, и все классы, которые должны использовать методы преобразования, были бы получены из этого базового класса. Однако Eiffel имеет множественное наследование, поэтому это имеет смысл для Eiffel, но не для языка, такого как С#, где у вас нет множественного наследования.
Ваша мысль верна. Convert
- это статический класс утилиты, с одной целью - преобразование между различными типами.
У него есть только методы (глаголы), все из которых являются преобразованиями, поэтому для удобства чтения лучше дать имя общего глагола самому классу, чем повторять его в каждом методе:
int i = Convert.ToInt32(value);
float f = Convet.ToSingle(value);
гораздо более свободно и читабельны, чем:
int i = Conversions.ConvertToInt32(value);
float f = Conversions.ConvertToSingle(value);
Мое личное мнение в том, что ОК для класса Convert вызывается после действия, потому что это статический класс и не будет инстансом.
Просто звучит лучше позвонить
Convert.ToBoolean(var);
вместо
Converter.ConvertToBoolean(var);
Соглашения об именах - забавные звери. Самое главное - это согласованность между фреймворками.
Излишне говорить, что соглашения OO могут реально помочь разборчивости архитектуры. В этом случае класс преобразования и его статические методы являются лучшими попытками замены глобальных функций с помощью С#, и им присваиваются псевдонимы, указывающие как таковые.
Преобразовать [параметр] в Int32
Преобразовать [параметр] в одиночный
Называя их как действия, а не объекты, мы также сообщаем функциональную чистоту.
Это часто видно и в шаблоне singleton с свойством Instance
.