Лучшие практики для создания библиотек, использующих пространства имен .NET - PullRequest
11 голосов
/ 15 декабря 2009

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

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

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

Ответы [ 6 ]

10 голосов
/ 15 декабря 2009

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

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

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

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

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

5 голосов
/ 15 декабря 2009

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

2 голосов
/ 15 декабря 2009

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

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

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

1 голос
/ 15 декабря 2009

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

1 голос
/ 15 декабря 2009

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

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

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

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

1 голос
/ 15 декабря 2009

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

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

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

...