Если класс "Утилиты" является злым, где я могу поместить свой общий код?
Я обычно живу по правилу, что глобальные переменные/функции злы и что каждый кусок кода должен жить в классе, к которому он относится.
Это очень простое правило следовать, и я считаю, что до сих пор я никогда не сталкивался с проблемой с этим правилом.
Сегодня, однако, мне нужно добавить функцию к моей сборке, а не к определенному классу. То есть, почти все мои классы могут использовать эту конкретную функцию.
Где я должен помещать эту функцию (+1 перегрузка)?
Если я помещу его в класс "Утилиты", я чувствую себя грязным. Если я привяжу его к полусвязанному классу и позволю другим классам называть его напрямую, я чувствую себя хуже.
Этот фрагмент кода в основном отбрасывает IList<PointF>
в нормализованный список. Я чувствую прямо сейчас, что добавление его как метода расширения на IList<PointF>
может быть лучшим выбором...
Ответы
Ответ 1
Если это операция в IList<PointF>
, то это должен быть метод расширения на IList<PointF>
.
Как правило, следует избегать классов классов Utils
и Helper
. Чаще всего вы обнаружите, что то, что вы думаете, является методом полезности, на самом деле является довольно специфическим методом, который, вероятно, принадлежит к собственному классу (точно так же, как вы говорите). Тем не менее, будут случаи, специфичные для домена, где Util
-подобные классы (классы, которые группируют связанные полезные методы) являются действительными сущностями.
Ответ 2
В глобальных переменных и методах нет ничего плохого. Вы используете их все время. Структура нравится называть их "статическими" классами или "статическими" методами.
Мне редко нужно, но я обычно добавляю внутренний статический класс Util в пространстве имен, что метод/переменная требуется для С# и модуля для VB.NET.
Образцы из .NET Framework
-
System.Collections.Specialized.CollectionsUtil
-
System.Net.WebUtility
- Проверьте исходный код Microsoft для .NET Framework. Вы найдете множество внутренних классов утилиты.
Ответ 3
Вы должны поместить его в класс ListUtilities или PointListUtilities
, конечно. Тогда вы не нарушаете принцип единой ответственности, который является основной проблемой для всего класса "Утилиты".