Навіщо видаляти невикористані за допомогою директив у C #?


120

Мені цікаво, чи є якісь причини (крім прибирання вихідного коду), чому розробники використовують функцію "Видалити невикористаний Usings" у Visual Studio 2008?


Я вважаю, що це особливість PowerCommands для Visual Studio, а не самої Visual Studio.
Хосам Алі

3
У VS2008 це, безумовно, особливість (поряд із можливістю сортування з використанням операторів) самого VS.
Річард

1
@Hosam: PowerCommands дозволяє зробити це для всього проекту / рішення. Це для кожного файлу є особливістю самого VS.
конфігуратор

3
BTW, перевірити Resharper, якщо ви хочете більш точний контроль над подібним способом очищення.
Джон Фемінелла

2
Мені справді дуже не подобається ця функція - мені незмінно здається редагувати файл і мені потрібно знову додати всі простори імен системи після того, як хтось їх очистив (як правило, System, System.Collections.Generic і System.Linq.) Я вважаю, що це додає більше тертя, ніж економить. Тепер ваші власні простори імен проекту, а не рамки просторів імен - ті, які мають сенс очистити, уточнити проводку вашої програми. Хочете, щоб був спосіб очистити імпорт VS лише з певних просторів імен та залишити системні ті, які вам частіше потрібні.
user1454265

Відповіді:


186

Є кілька причин, які ви хочете вивезти.

  • Це безглуздо. Вони не додають ніякої цінності.
  • Це заплутано. Що використовується з цього простору імен?
  • Якщо цього не зробити, ви поступово будете накопичувати безглузді usingзаяви, оскільки ваш код змінюється з часом.
  • Статичний аналіз повільніше.
  • Складання коду відбувається повільніше.

З іншого боку, не так багато причин залишати їх. Я гадаю, що ви заощадите зусилля, щоб видалити їх. Але якщо ти такий ледачий, у тебе є більші проблеми!


59
Хороший програміст лінивий, він максимально працює, щоб НЕ робити. : D
Ніколя Доріє

34
Я не згоден, що хороший програміст лінивий, але я згоден з настроями вашої заяви. Хороший програміст видалить їх, щоб зберегти чистий код і тим самим уникнути подальшої роботи / проблем / проблем для себе та інших.
Аллан

2
Правильно, це чудове посилання. Я гадаю, моя думка полягала лише в тому, що ми хочемо "хороших лінивих", а не "поганих лінивих"; останнє - там, де програмістам не можна було заважати писати хороший код.
Аллан

5
Є заслуга і в тому, щоб залишити стандартні простори імен. У великих проектах та командах, що призводить до менших потенційних конфліктів злиття та менше файлів для перегляду коду. Крім того, багато розробників додають заплутаним і важко знайти методи розширення для речей, а іноді розміщення необхідних просторів імен для цих методів розширення - це клопот. Нові розробники, можливо, звикли включати System.Linq до своїх кодових файлів і витрачають багато часу, намагаючись з'ясувати, чому певні методи недоступні, перш ніж звертатися за допомогою.
Позначте у Ramp51

5
Ви можете захотіти зберегти деякі з них, щоб запобігти інтелігенції бути німим, як пекло, у майбутньому кодуванні.
yazanpro

24

Я б сказав зовсім протилежне - надзвичайно корисно видалити зайві, непотрібні за допомогою операторів.

Уявіть, що вам доведеться повернутися до свого коду через 3, 6, 9 місяців - або хтось інший повинен взяти ваш код і підтримувати його.

Якщо у вас величезний довгий список білизни з використанням заяви, яка не дуже потрібна, погляд на код може бути дуже заплутаним. Чому це використовується там, якщо з цього простору імен нічого не використовується ??

Я думаю, що з точки зору довгострокової ремонтопридатності в професійному середовищі, я настійно пропоную зберегти ваш код максимально чистим - і це включає скидання з нього непотрібних речей. Менша безладність дорівнює меншій плутанині і, таким чином, більшої ремонтопридатності.

Марк


14

Мені це здається дуже розумним питанням, на яке люди ставляться досить нескінченно, що люди відповідають.

Я б сказав, що будь-яка зміна вихідного коду має бути виправданою. Ці зміни можуть мати приховані витрати, і особа, яка ставить питання, хотіла про це знати. Вони не просили їх називати "ледачими", як спонукає одна людина.

Я щойно почав використовувати Resharper, і він починає давати попередження та підказки щодо стилю проекту, за який я відповідаю. Серед них - усунення зайвих за допомогою директиви, а також надлишкових кваліфікаторів, капіталізація та багато іншого. Мій інстинкт кишки полягає в тому, щоб виправити код і вирішити всі підказки, але керівник мого бізнесу застерігає мене від невиправданих змін.

Ми використовуємо автоматизований процес збирання, і тому будь-яка зміна нашого сховища SVN призведе до змін, які ми не зможемо пов’язати з проектами / помилками / проблемами, і спричинить автоматизовані збірки та випуски, які не принесли функціональних змін до попередніх версій.

Якщо ми подивимось на видалення зайвих кваліфікаторів, це, можливо, спричинить плутанину у розробників, оскільки класи наших шарів Доменів та Даних диференціюються лише класифікаторами.

Якщо я дивлюся на правильне використання великих букв анахронімів (тобто ABCD -> Abcd), то я маю враховувати, що Resharper не переробляє жоден з Xml-файлів, якими ми користуємося цими іменами довідкового класу.

Отже, слідування цим підказкам не настільки прямолінійно, як здається, і слід ставитися з повагою.


6
Добре, але не слід також забувати, що дотримання чистого нескладного коду підвищує технічне обслуговування, що також є бізнес-метою. Ви повинні зважити обох. В ідеалі ви хочете зробити такі види реконструкції відразу після випуску, щоб у вас був максимально чистий шифер, щоб почати новий і мати достатньо часу, щоб зловити можливі регресії.
Девід Рейс

14

Окрім уже наведених причин, це запобігає непотрібним конфліктам імен. Розглянемо цей файл:

using System.IO;
using System.Windows.Shapes;

namespace LicenseTester
{
    public static class Example
    {
        private static string temporaryPath = Path.GetTempFileName();
    }
}

Цей код не компілюється, оскільки обидва простори імен System.IO та System.Windows.Shapes містять клас під назвою Path. Ми можемо це виправити, використовуючи повний шлях до класу,

        private static string temporaryPath = System.IO.Path.GetTempFileName();

або ми могли просто видалити рядок using System.Windows.Shapes;.


13

Менше варіантів у спливаючому віці Intellisense (особливо, якщо простори імен містять багато методів розширення).

Теоретично Intellisense також повинен бути швидшим.


1
+1 для інтелігенції. Насправді це запускається повільно (я регулярно бачу "Створення кешу, повторіть спробу пізніше"), тому це може бути насправді важливим. Складіть час, про який говорять усі інші ... Я ще не бачив цифр.
Люк

5

Видаліть їх. Менше коду, який варто дивитись і дивуватися, економить час і плутанину. Я б хотів, щоб більше людей зберігали речі прості, акуратні та акуратні. Це як мати брудні сорочки та штани у своїй кімнаті. Це некрасиво, і ти мусиш задуматися, чому воно там.


4

Це також допомагає запобігти помилковим круговим залежностям, припускаючи, що ви також зможете видалити деякі посилання на проект dll / проекту після видалення невикористаних ужитків.


3

Код збирається швидше.


5
Чи є якісь докази, які підтверджують це?
cjk

14
О, КК - ти знову мене виловив. Я збрехав. Видалення непотрібного тексту насправді робить компіляцію коду повільнішою. Подумайте над цим :)
Мертвий рахунок

@ck: Я перевірив, що видалення невикористаних з використанням операторів проекту на роботі покращило час компіляції на помітну кількість. Звичайно, це було б менше байтів для читання з жорсткого диска.
конфігуратор

19
Було б непогано побачити реальну статистику. Якщо ми заощаджуємо лише кілька мілісекунд під час компіляції, то швидкість не є переконливим аргументом. Однак є й інші причини, щоб видалити зайві за допомогою операторів.
Грег

3
Справа не в тому, щоб брехати чи ні. Будь-який розумний чоловік здогадується, що менше захаращення означає більшу ефективність. "Доказом" підтвердження цього є надання цінності вашій відповіді та підтримка аргументу, що "швидше" не означає лише кілька мс, а фактично покращений досвід для швидшого складання вашого проекту.
Матей Феліпе

3

Нещодавно я отримав ще одну причину, чому видалення невикористаного імпорту є досить корисним та важливим.

Уявіть, що у вас є дві збірки, де одна посилається на іншу (поки назвемо першу Aта посилається B). Тепер, коли у вас є код A, який залежить від B, все нормально. Однак на певному етапі процесу розробки ви помічаєте, що вам фактично вже не потрібен цей код, але ви залишаєте команду-оператор там, де вона була. Тепер у вас є не лише безглуздий using-направлення, але й посилання-збірка, на Bяку не використовується ніде, але в застарілій директиві. Це, по-перше, збільшує кількість часу, необхідного для складання A, як Bі завантаження.

Таким чином, це не тільки питання про більш чистий та легкий для читання код, але й про підтримку збірки-посилань у виробничому коді, де не всі згадані збірки навіть існують .

Нарешті, в нашому прикладі ми повинні були доставити B і A разом, хоча B не використовується ніде в A, а в using-секції. Це масово вплине на час виконання роботи Aпри завантаженні збірки.


2

Принаймні теоретично, якщо вам дали файл C # .cs (або будь-який файл вихідного коду програми), ви повинні мати можливість переглянути код і створити середовище, яке імітує все, що потрібно. З деякою технікою компіляції / розбору ви можете навіть створити інструмент для автоматичного виконання. Якщо ви це зробите принаймні на увазі, ви можете переконатися, що ви розумієте все, що пише файл коду.

Тепер подумайте, якщо вам дали файл .cs з 1000 usingдирективами, які фактично використовувались лише 10. Щоразу, коли ви дивитесь на символ, який знову вводиться в код, що посилається на зовнішній світ, вам доведеться пройти ці 1000 рядків, щоб зрозуміти, що це таке. Це, очевидно, сповільнює описану вище процедуру. Тож якщо ви зможете зменшити їх до 10, це допоможе!

На мою думку, usingдиректива C # дуже слабка, оскільки ви не можете вказати єдиний загальний символ, не втрачаючи родового значення, і ви не можете використовувати usingдирективу псевдонімів для використання методів розширення. Це не стосується інших мов, таких як Java, Python та Haskell. На цих мовах ви можете (майже) точно вказати, що вам потрібно від зовнішнього світу. Але в такому випадку я запропоную використовувати usingпсевдонім, коли це можливо.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.