Служебные классы.. Хороший или Плохой?

Ответ на ваш первый вопрос зависит от используемого оборудования. По крайней мере, на некоторых старых аппаратных средствах ответ был положительным - сбой питания мог привести к записи мусора на диск. Однако большинство современных дисков имеют встроенный в сам диск «ИБП» - конденсатор, достаточно большой для того, чтобы достаточно долго питать диск, чтобы записывать данные из дискового кэша на диск. У них также есть схема, позволяющая определить, исправен ли источник питания, поэтому, когда питание становится нестабильным, они записывают данные в кэш на диск и игнорируют мусор, который они могут получить.

Что касается «порванной страницы», типичный диск принимает только команды для записи целого сектора за раз, так что вы получите, как правило, целое число правильно записанных секторов, а остальные останутся неизменными. Однако, если вы используете логический размер страницы, который больше, чем один сектор, вы, безусловно, можете получить частично написанную страницу.

Это, однако, в основном относится к прямому подключению к обычному жесткому диску с подвижным диском. Почти со всем, правила могут и часто будут отличаться. Просто для наглядного примера, если вы пишете по сети, вы в основном зависите от используемого сетевого протокола. Если вы передаете данные по TCP, данные, которые не совпадают с CRC, будут отклонены, но те же данные, передаваемые по UDP, с таким же повреждением, могут быть приняты.

12
задан SLaks 4 November 2009 в 01:49
поделиться

7 ответов

С теоретической точки зрения дизайна, я считаю, что классов утилит следует избегать, когда это возможно. По сути, они ничем не отличаются от статических классов (хотя немного лучше, поскольку у них нет состояния).

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

Например, в вашем случае я считаю, что UrlParser.ParseUrl (...), вероятно, лучше обрабатывать как класс. Посмотрите на System.Uri в BCL - это обрабатывает чистую, простой в использовании интерфейс для Uniform Resource Indentifiers, который хорошо работает и поддерживает фактическое состояние. Я предпочитаю этот подход служебному методу, который работает со строками и заставляет пользователя передавать строку, не забывать проверять ее и т. Д.

8
ответ дан 2 December 2019 в 20:41
поделиться

Классы утилит в порядке ..... до тех пор, пока они не нарушают принципы проектирования. Используйте их так же успешно, как и классы ядра фреймворка.

Классы должны быть хорошо названы и логичны. На самом деле они не столько «полезность», сколько часть развивающейся фреймворк, которую не предоставляют собственные классы.

Использование таких вещей, как методы расширения, также может быть полезно для согласования функциональности с «правильным» классом. НО, они могут быть причиной некоторой путаницы, поскольку расширения не упакованы с классом, который они обычно расширяют, что не идеально, но, тем не менее, может быть очень полезным и производить более чистый код.

2
ответ дан 2 December 2019 в 20:41
поделиться

Вы всегда можете создать интерфейс и использовать его с внедрением зависимостей с экземплярами классов, реализующих этот интерфейс, вместо статических классов.

Вопрос в том, действительно ли это стоит усилий? В некоторых системах ответ - да, но в других, особенно небольших, вероятно, нет.

2
ответ дан 2 December 2019 в 20:41
поделиться

Я согласен с некоторыми другими ответами здесь, что это классический синглтон, который поддерживает единственный экземпляр объекта с состоянием, которого следует избегать, и не обязательно служебные классы без состояния, которые являются злом . Я также согласен с Ридом в том, что, если это вообще возможно, поместите эти служебные методы в класс, где это имеет смысл делать и где можно было бы логически предположить, что такие методы будут находиться. Я бы добавил, что часто эти статические служебные методы могут быть хорошими кандидатами для методов расширения.

1
ответ дан 2 December 2019 в 20:41
поделиться

Они хороши, если вы хорошо их спроектируете (то есть вам не нужно время от времени менять их подпись).

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

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

Думаю, будет хуже, если вы будете копировать / вставлять один и тот же служебный метод снова и снова.

Это видео Как разработать хороший API и почему это важно Джошуа Блох объясняет несколько концепций, которые следует учитывать при разработке API (это будет ваша служебная библиотека). Хотя он Как признанный архитектор Java, содержание применимо ко всем языкам программирования.

0
ответ дан 2 December 2019 в 20:41
поделиться

Я очень, очень стараюсь их избегать, но кого мы обманываем ... они проникают в каждую систему. Тем не менее, в приведенном примере я бы использовал объект URL, который затем предоставил бы различные атрибуты URL (протокол, домен, путь и параметры строки запроса). Почти каждый раз, когда я хочу создать служебный класс статики, я могу получить больше пользы, создав объект, который выполняет такую ​​работу.

Подобным образом я создал множество настраиваемых элементов управления которые имеют встроенную проверку для таких вещей, как проценты, валюта, номера телефонов и тому подобное. До этого у меня был служебный класс Parser, в котором были все эти правила, но он делает его намного более чистым, если просто разместить элемент управления на странице, который уже знает основные правила (и, следовательно, требует только бизнес-логики ]

Я все еще сохраняю служебный класс синтаксического анализатора, и эти элементы управления скрывают этот статический класс, но используют его широко (сохраняя весь синтаксический анализ в одном удобном для поиска месте). В этом отношении я считаю приемлемым иметь служебный класс, потому что он позволяет мне применять «Не повторяйся», в то время как я получаю преимущество от экземпляров классов с элементами управления или другими объектами, которые используют служебные программы.

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

Я все еще сохраняю служебный класс парсера и эти элементы управления скрывают этот статический класс, но используют его широко (сохраняя весь синтаксический анализ в одном удобном для поиска месте). В этом отношении я считаю приемлемым иметь служебный класс, потому что он позволяет мне применять «Не повторяйся», в то время как я получаю преимущество от экземпляров классов с элементами управления или другими объектами, которые используют служебные программы.

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

Я все еще сохраняю служебный класс парсера и эти элементы управления скрывают этот статический класс, но используют его широко (сохраняя весь синтаксический анализ в одном удобном для поиска месте). В этом отношении я считаю приемлемым иметь служебный класс, потому что он позволяет мне применять «Не повторяйся», в то время как я получаю преимущество от экземпляров классов с элементами управления или другими объектами, которые используют служебные программы.

Я все еще сохраняю служебный класс синтаксического анализатора, и эти элементы управления скрывают этот статический класс, но используют его широко (сохраняя весь синтаксический анализ в одном удобном для поиска месте). В этом отношении я считаю приемлемым иметь служебный класс, потому что он позволяет мне применять «Не повторяйся», в то время как я получаю преимущество от экземпляров классов с элементами управления или другими объектами, которые используют служебные программы.

Я все еще сохраняю служебный класс синтаксического анализатора, и эти элементы управления скрывают этот статический класс, но используют его широко (сохраняя весь синтаксический анализ в одном удобном для поиска месте). В этом отношении я считаю приемлемым иметь служебный класс, потому что он позволяет мне применять «Не повторяйся», в то время как я получаю преимущество от экземпляров классов с элементами управления или другими объектами, которые используют служебные программы.

1
ответ дан 2 December 2019 в 20:41
поделиться

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

Но в то же время вы не можете избежать утилит, они иногда требуются.

В этом случае я думаю, что все в порядке.

К вашему сведению, есть класс system.web.httputility, который содержит много распространенные утилиты http, которые могут оказаться полезными.

0
ответ дан 2 December 2019 в 20:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: