Означает ли наличие большого количества операторов use / import плохой дизайн или запах кода?

13

Обычно я вижу несколько операторов using в верхней части файла классов. Пример:

using System.Collections.Generic;
using System.IO;
using System.Xml.Linq;

Но в проекте, над которым я работаю, в нескольких случаях я вижу 20 или более операций использования / импорта в одном файле класса. Это плохой дизайн? Кажется, что классы, предназначенные для выполнения одной задачи, должны опираться только на несколько компонентов.

Джон Рейнор
источник
1
Visual Studio имеет возможность удалить неиспользуемые usingоператоры. Возможно, вы захотите узнать, сколько из этих 20 действительно используется.
Дан Пичельман,
@Dan -Они все используются, так как я использовал ReSharper, чтобы отсеять неиспользованные.
Джон Рейнор
Вы пытались добавить IoC, преобразовать в инжектор конструктора и / или преобразовать некоторые точки интеграции в встроенные лямбда-выражения, чтобы посмотреть, уменьшит ли это количество usingоператоров без необходимости увеличения количества классов? Имейте в виду, что увеличение количества классов или исходных файлов приведет к увеличению затрат на управление исходным кодом.
rwong
2
IoC просто скрывает проблему.
Теластин
1
Некоторые из этих вещей являются почти просто частью языка и стиля программирования, который он поощряет, например Collections.Generic и LINQ, поэтому я не буду беспокоиться о них. Вероятно, я бы сосредоточил свое внимание на других. Большинству классов, вероятно, не нужно выполнять IO напрямую, поэтому, возможно, если это встречается повсеместно, существует некоторое сочетание обязанностей или плохое наслоение, но это зависит от приложения.
Эрик Эйдт

Ответы:

21

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

Тем не менее, это запах - иногда это приводит вас к чему-то плохому, а иногда это просто ложная тревога.

Telastyn
источник
Я думаю, что истинный «запах кода» был бы, если бы импортированные пространства имен были целиком или почти полностью различны. Если честно, у меня редко было больше 6-8 usingв одном файле C #.
Грег Бургардт
2
Я хотел бы дать вам секунду +1, если бы я мог, только для правильного использования термина «запах кода»!
Йорг Миттаг
@Greg - Я согласен, обычно «употребления» связаны между собой. Я думаю, что в данном случае это случай абстракции, потому что около 15-20 «использований» происходят из пространств имен приложений, а остальная часть - из .net framework.
Джон Рейнор
2

Класс должен быть не больше и не меньше, чем то, что необходимо для обеспечения предполагаемой функции.

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

Мне трудно сказать себе «минимизировать импорт». Или судить об успехах моего класса исключительно по подсчету количества импортированных пространств имен. Я не могу оправданно использовать это в отдельности, как показатель успеха класса. Для меня «импорт» - это средство для конца класса. Если работа класса четко определена, все остальное в системе поддержки, включая импорт, само позаботится о себе.

paulstgeorge
источник