Как System.Convert подходит для соглашений OO?

17

Не являются ли классы вызываемыми после объектов, а не действиями? Он просто не сидит вместе с теорией ОО, которую я узнал.

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

    
задан Quaker 04.03.2014 в 10:28
источник
  • Функциональный программист может сказать вам, что совершенно смешно делать такое различие между объектами и действиями, а «теория ОО» является фиктивной, если она предъявляет такие претензии. Слава богу, ни один из этих сумасшедших парней вокруг * уток * [ты меня никогда не видел здесь] ... –  leftaroundabout 04.03.2014 в 16:10

5 ответов

18

В C # вы не можете создавать методы вне классов или структур. Поэтому, когда вы хотите создавать утилиты, лучше хранить их в статическом классе.

Итак, я бы сказал, что нет ничего ориентированного на объект статического класса.

    
ответ дан Raz Megrelidze 04.03.2014 в 10:43
источник
  • +1 нет ничего ориентированного объекта относительно статического класса. –  Vinay Pandey 04.03.2014 в 10:48
  • +1 в других языках программирования это будет называться модулем. Языки, такие как Java и C #, стремятся сделать «все как объект», но на самом деле это просто не так - если вы не программируете в Smalltalk в любом случае :) –  MattDavey 04.03.2014 в 11:20
  • @MattDavey не совсем уверен, что согласен с этим приложением модуля. Модули могут содержать классы, они также уже существуют в .net. –  Gusdor 04.03.2014 в 12:30
  • @Gusdor это неопределенный термин, конечно, но есть много контекстов, где термин модуль относится к логической группировке автономных функций. Примером этого является язык D. Даже в пространстве .NET это можно увидеть на языке Nemerle. –  MattDavey 04.03.2014 в 13:20
9

Нет ничего объектно-ориентированного в классе Преобразовать , поскольку объектная ориентация о данных с поведением , а класс Convert не содержит данных или состояний.

Это в основном практическое рассмотрение.

В Eiffel, например, методы преобразования были бы определены в базовом классе, и все классы, которые должны использовать методы преобразования, были бы получены из этого базового класса. Однако Eiffel имеет множественное наследование, поэтому это имеет смысл для Eiffel, но не для языка, такого как C #, где у вас нет множественного наследования.

    
ответ дан Mark Seemann 04.03.2014 в 10:36
источник
  • Я думаю, что вопрос о том, что класс Convert по сути является без гражданства, является самым важным в этой дискуссии –  David Stockinger 04.03.2014 в 19:13
5

Ваша мысль верна. Convert - статический класс утилиты, с одной целью - преобразование между различными типами.

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

int i = Convert.ToInt32(value);
float f = Convet.ToSingle(value);

гораздо более свободно и читабельны, чем:

int i = Conversions.ConvertToInt32(value);
float f = Conversions.ConvertToSingle(value);
    
ответ дан Shlomi Borovitz 04.03.2014 в 10:41
источник
  • Любое преимущество этого над помещением метода в тип назначения, например. Int32.From (wholenumber), Int32.RoundEven (число), Int32.Trunc (число), Int32.Floor (число) или Int32.RoundPeriodic (число)? –  supercat 04.03.2014 в 18:24
  • Класс Convert предназначен для конверсий, а не для муки (они относятся к классу Math). У этих типов есть преобразования на них (X.Parse (строка) /X.TryParse (строка, вне X) и отливки из разных типов. Класс Convert обрабатывает nulls по-разному (возвращает значение по умолчанию вместо исключения исключения) и делает переполнение (по умолчанию проверки переполнения отключены). –  Shlomi Borovitz 04.03.2014 в 18:41
  • Попытка конвертировать двоичное значение 123.4 в Int32 должна либо сбой (выкинуть исключение), либо выбрать через какое-то средство целое число, которое не равно исходному числу. Я бы предположил, что более половины мест, где Double округляется, сразу преобразуется в Int32 или Int64, поэтому объединение двух операций в один шаг имеет смысл; Подход Java к использованию Double.round return long и Float.round return int кажется гораздо менее понятным, чем операции в целевом типе. –  supercat 04.03.2014 в 19:07
  • Это довольно часто, чтобы просто урезать перелом из двойника при кастинге / преобразовании в целое число. Это даже логично - потому что вы всегда можете придать (неявно) от небольшого типа к более крупному, но, наоборот, вам нужно явно указать или преобразовать его в меньший тип. Math.Raound может округляться до любой цифры после десятичной точки - так что он возвращает тип, который он получил. –  Shlomi Borovitz 04.03.2014 в 19:14
  • Так как это происходит, Convert.ToInt64 (Double) выполняет круглые-четные (я забыл это), но я не знаю, что люди, которые его не тестировали или явно не проверяли, ожидать этого. Если рассматривать цель, например, метод Int32.Floor () как «вернуть наивысший Int32, который не превосходит операнда», такой метод будет более тесно связан с Int32, чем с любым другим классом, и не менее сильно, чем Int32.Parse (который работает только по строкам) –  supercat 04.03.2014 в 19:43
Показать остальные комментарии
4

Мое личное мнение заключается в том, что ОК для класса Convert, который вызывается после действия, потому что это статический класс и не будет установлен.

Просто звучит лучше позвонить

Convert.ToBoolean(var);

вместо

Converter.ConvertToBoolean(var);
    
ответ дан Fedor Hajdu 04.03.2014 в 10:33
источник
4

Соглашения об именах - забавные звери. Самое главное - это согласованность между фреймворками.

Излишне говорить, что соглашения OO могут реально помочь разборчивости архитектуры. В этом случае класс преобразования и его статические методы представляют собой замены best try для глобальных функций с помощью c # и им присваиваются имена fluid , указывающие как таковые.

  

Преобразовать [параметр] в Int32

     

Преобразовать [параметр] в одиночный

Называя их как действия, а не объекты, мы также сообщаем функциональную чистоту.

Это часто наблюдается в шаблоне singleton, а также с свойством Instance .

    
ответ дан Gusdor 04.03.2014 в 10:34
источник