Расширение пространства имен FCL System - действительно плохая практика? - PullRequest
3 голосов
/ 16 февраля 2011

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

Но , ...

Пространства имен также используются для группировки логически релевантных классов вместе. Моя личная библиотека просто распространяется на Framework Class Library (FCL) и реализует все функции, которые мне не хватает в FCL. Он содержит в основном расширенные и вспомогательные классы и другие классы, которые можно многократно использовать. Я считаю, что было бы очень полезно следовать той же структуре пространств имен, что и в FCL.

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

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

UPDATE

Итак, основное преимущество, которое я считаю (как упоминалось в комментариях), заключается в том, что у вас есть доступ к большему количеству утилит без необходимости искать определенные пространства имен. Например. Если вы используете System.Collections.Generic, сразу доступны методы расширения для IList<T>.

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

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

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

ОБНОВЛЕНИЕ 2 :

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

using System.Windows;
using System.Windows.Controls;
using System.Windows.Media
using System.Windows.Media.Media3D;

using MyNamespace.Windows;
using MyNamespace.Windows.Controls;
using MyNamespace.Windows.Media;
using MyNamespace.Windows.Media.Media3D;

Не говоря уже о эта проблема , которая делает, например, using MyNamespace.System.Windows; невозможно.

Чтобы сформулировать вопрос, который, как мы надеемся, даст более полезные ответы:

Есть ли решение для решения этой проблемы лучше, чем размещение кода в пространстве имен системы? Существует ли способ скомпилировать другое пространство имен при желании, кроме использование предирективов, или это вообще плохая идея?

Ответы [ 2 ]

5 голосов
/ 16 февраля 2011

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

Это имеет большое преимущество, заключающееся в том, что вам не нужно определять столько употреблений.

Я на самом деле вижу в этом недостаток.Принудительное добавление оператора using или полная квалификация вашего типа делает ваш код более понятным, поскольку это делает более очевидным, где определен конкретный код.1009 * пространства имен, большинство разработчиков ожидают, что тип, определенный как System.***.SomeType, является частью библиотек базовых классов.По моему мнению, «расширение» базовых библиотек собственными типами вызывает путаницу и приводит к снижению удобства обслуживания.

0 голосов
/ 24 марта 2011

Я опубликую комментарий Коди Грея, который больше всего мне помог, в качестве ответа:

Почему вам нужно разделить все ваши вспомогательные функции на отдельные пространства имен?То есть, почему они не могут звонить в MyNamespace, оставляя только одну директиву для добавления?Единственная причина, по которой пространства имен полезны - это минимизация коллизий;сомнительно, что у ваших методов расширения будут одинаковые имена (и если они есть, вы не сможете импортировать их все одновременно, как вы все равно показали).

...