Питання ширше:
Ви коли-небудь чули про нав'язування такого стандарту? Якщо так, то яка причина була?
Так, я чув про це, і використання повністю кваліфікованих імен об'єктів запобігає зіткненням імен. Хоча вони рідкісні, коли вони трапляються, вони можуть бути винятково тернистими, щоб з'ясувати.
Приклад:
такий тип сценарію, ймовірно, краще пояснюється на прикладі.
Скажімо, у нас є два, Lists<T>
що належать до двох окремих проектів.
System.Collections.Generic.List<T>
MyCorp.CustomCollections.Optimized.List<T>
Коли ми використовуємо повністю кваліфіковану назву об'єкта, зрозуміло, для чого List<T>
використовується. Ця чіткість очевидно виникає ціною багатослівності.
І ви можете сперечатися: "Зачекайте! Ніхто ніколи не використовував би такі списки!" Саме там я зазначу сценарій технічного обслуговування.
Ви написали модуль Foo
для своєї корпорації, який використовує затверджену, оптимізовану корпорацію List<T>
.
using MyCorp.CustomCollections.Optimized;
public class Foo {
List<object> myList = ...;
}
Пізніше новий розробник вирішує продовжити роботу, яку ви робили. Не знаючи стандартів компанії, вони оновлюють using
блок:
using MyCorp.CustomCollections.Optimized;
using System.Collections.Generic;
І ви можете бачити, як поспішають справи.
Слід зазначити, що ви могли мати два фірмових класи з тим самим іменем, але в різних просторах імен в межах одного проекту. Отже, це не лише питання про зіткнення з класами, що постачаються в рамках .NET.
MyCorp.WeightsAndLengths.Measurement();
MyCorp.TimeAndSpace.Measurement();
Реальність:
У
даний час, це , ймовірно , відбудеться в більшості проектів? Ні, не дуже. Але працюючи над великим проектом з великою кількістю вкладень, ви робите все можливе, щоб мінімізувати шанси на те, що вибухне на вас.
Великі проекти з декількома командами-учасниками - це особливий вид звіра в світі додатків. Правила, які здаються нерозумними для інших проектів, стають більш доречними через вхідні потоки до проекту та ймовірність того, що ті, хто сприяє, не прочитали вказівки проекту.
Це також може статися, коли два великих проекти об’єднані разом. Якщо обидва проекти мали схожі назви класів, то ви побачите зіткнення, коли ви почнете посилатися з одного проекту на інший. І проекти можуть бути занадто великими, щоб рефактор або керівництво не схвалили витрати на фінансування часу, витраченого на рефакторинг.
Альтернативи:
Хоча ви не питали, варто зазначити, що це не чудове рішення проблеми. Недоцільно створювати класи, які зіткнуться без оголошень у просторі імен.
List<T>
, зокрема, слід розглядати як зарезервоване слово, а не використовуватись як назва для ваших занять.
Так само окремі простори імен в рамках проекту повинні прагнути мати унікальні назви класів. Необхідно спробувати згадати, з яким простором імен Foo()
ви працюєте - це розумові накладні витрати, яких найкраще уникати. Сказав інший спосіб: мати MyCorp.Bar.Foo()
та MyCorp.Baz.Foo()
збиратися відключити своїх розробників та краще їх уникати.
Якщо нічого іншого, ви можете використовувати часткові простори імен, щоб вирішити неоднозначність. Наприклад, якщо ви абсолютно не можете перейменувати жоден Foo()
клас, ви можете використовувати їх часткові простори імен:
Bar.Foo()
Baz.Foo()
Конкретні причини вашого поточного проекту:
Ви оновили своє запитання з конкретних причин, які вам дали для вашого поточного проекту, що відповідає цьому стандарту. Давайте подивимось на них і по-справжньому підемо по сліду зайчика.
Наводити курсор миші на ім’я досить громіздко, щоб отримати повністю кваліфікований тип. Краще завжди мати повністю видимий тип.
"Громіздкий?" Гм, ні. Прикро, мабуть. Переміщення декількох унцій пластику, щоб зрушити екранний покажчик, не громіздко . Але я відволікаюсь.
Ця лінія міркувань здається скоріше прихованою, ніж будь-що інше. Зрозуміло, я б здогадувався, що класи в додатку є слабо названими, і вам потрібно покластися на простір імен, щоб отримати відповідний обсяг семантичної інформації, що оточує ім'я класу.
Це неправдиве виправдання для повнокваліфікованих імен класів, можливо, це дійсне обгрунтування для використання частково кваліфікованих імен класів.
Фрагменти коду електронної пошти не мають повністю кваліфікованого імені, і тому їх важко зрозуміти.
Цей (продовжений?) Рядок міркувань підсилює мою підозру, що класи зараз названі погано. Знову ж таки, наявність поганих імен класу не є хорошим виправданням для того, щоб вимагати від усіх, щоб використовувати повноцінне ім’я класу. Якщо ім'я класу важко зрозуміти, є набагато більше помилок, ніж те, що можуть виправити повноцінні назви класів.
Під час перегляду чи редагування коду поза Visual Studio (наприклад, Блокнот ++) неможливо отримати повноцінне ім’я типу.
З усіх причин ця майже ледь не змусила мене виплюнути свій напій. Але знову я відволікаюсь.
Мені залишається цікаво, чому команда часто редагує чи переглядає код поза Visual Studio? А тепер ми дивимось на виправдання, яке є досить ортогональним щодо того, які простори імен мають надати. Це аргументований аргумент, тоді як простори імен є для надання організаційній структурі коду.
Це здається, що ваш власний проект страждає від поганих угод про іменування разом з розробниками, які не користуються тим, що інструменти можуть надати їм. І замість того, щоб вирішити ці актуальні проблеми, вони намагаються ляпнути стрічкову допомогу за одним із симптомів і вимагають повністю кваліфікованих імен класу. Я вважаю, що це безпечно віднести до цього як помилковий підхід.
Зважаючи на те, що є погано названі класи, і якщо припустити, що ви не можете переробити, правильна відповідь - використовувати ID Visual Studio IDE в повній мірі. Можливо, варто розглянути можливість додавання у плагін, як-от VS PowerTools. Потім, коли я дивлюся, AtrociouslyNamedClass()
я можу натиснути на ім'я класу, натиснути клавішу F12 і перейти безпосередньо до визначення класу, щоб краще зрозуміти, що він намагається робити. Так само я можу натиснути Shift-F12, щоб знайти всі плями в коді, які наразі страждають від використання AtrociouslyNamedClass()
.
Що стосується проблем зовнішнього інструментарію - найкраще зробити це просто зупинити його. Не надсилайте електронні фрагменти вперед і назад, якщо вони не одразу зрозуміли, на що йдеться. Не використовуйте інші інструменти поза Visual Studio, оскільки ці інструменти не мають інтелекту щодо коду, який потрібен вашій команді. Блокнот ++ - дивовижний інструмент, але він не вирізаний для цього завдання.
Тож я погоджуюся з вашою оцінкою щодо трьох конкретних виправдань, які вам були представлені. Це означає, що, на мою думку, вам сказали: «У цьому проекті є основні проблеми, які не можуть / не вирішуються, і саме тому ми їх« виправили ». І це, очевидно, говорить про більш глибокі проблеми в колективі, які можуть послужити для вас червоними прапорами.