Рекомендации по созданию библиотек, использующих пространства имен .NET

Неправильно ли писать библиотеку, которая определяет интерфейс, зависящий от другой библиотеки?

Я знаю, что плотная связь плохая, но применяется ли это при использовании классов .NET?

Например, в .NET, если у меня есть библиотека, которая возвращает объект Color, это заставляет зависеть от System.Drawing от всего, что использует мою библиотеку. Будет ли я лучше создавать свой собственный класс типа "Цвет" внутри моей библиотеки?

Ответ 1

Я различаю Летучие и Стабильные зависимости.

В целом, Color выглядит как стабильная зависимость, поскольку он уже находится в BCL, он детерминирован по своей природе и не требует какой-либо ресурсоемкой обработки вне процесса, и он также не полагается на определенную настройку его среды выполнения.

Единственное соображение здесь заключается в том, что когда дело доходит до цвета, в BCL существует более одного такого класса, поэтому убедитесь, что вы действительно имеете в виду нацелить только приложения Windows Forms на ваш API, поскольку WPF имеет собственное определение Цвет.

Если вам просто нужен цвет для рисования частей пользовательского интерфейса в определенном цвете, то встроенный класс Color, вероятно, прекрасен, но если Color является основной концепцией в вашей модели домена, и вам нужно настроить таргетинг на различные пользовательские интерфейсы (WPF, Windows Forms, Web), вам, вероятно, будет лучше, определив свою собственную абстракцию.

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

Ответ 2

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

Ответ 3

Со всеми моими библиотеками я возвращаю объекты, которые зависят только от вещей в библиотеке.

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

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

Ответ 4

Вы представляете отличный вопрос. Ответ: это зависит. В случае стандартных библиотек, которые всегда будут доступны, тогда это нормально; основная библиотека постоянно ссылается на разные .DLL.

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

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

Ответ 5

Это зависит от вашего использования класса.

Если вам когда-либо понадобится получить экземпляр класса Color системы из экземпляра вашего класса Color (например, если вы рисуете в форме Windows), то лучше использовать класс System - это экономит ваши усилия от необходимости конвертировать между этими двумя типами и дает вам преимущество в том, что вы можете бесплатно использовать все "Особенности" класса Color (например, встроенные константы для "Красный", "Черный", "Зеленый" и т.д..

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

По всей вероятности, вам лучше использовать класс System.Color - да, инкапсуляция, и все это хорошая идея, но не за счет экономии огромного количества времени!

Ответ 6

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