Лучший способ повторно использовать код при использовании Visual Studio? - PullRequest
4 голосов
/ 29 августа 2008

Я пробовал 2 разных метода повторного использования кода. У меня есть решение, полное проектов библиотеки классов с общим кодом, который я использую почти в каждом проекте, над которым я работаю. Когда я приступлю к работе над новым проектом, я буду повторно использовать код из этой библиотеки кода одним из двух способов. Я попытался перенести нужные проекты из этой библиотеки кода в свой проект. Я также попытался скомпилировать в .dll и ссылаться на .dll из папки в корне моего текущего решения. Хотя второй метод кажется более легким и легким в реализации, я всегда нахожу небольшие изменения в исходном коде, чтобы они соответствовали контексту моего текущего проекта. Я знаю, что это немного неопределенный вопрос, но кто-нибудь имел успех с другими методами повторного использования библиотек классов в новых решениях?

Ответы [ 8 ]

8 голосов
/ 29 августа 2008

Короче говоря, то, что вы делаете, правильно, вы хотите переместить общий код в библиотеку классов (DLL), а затем ссылаться на него в любых проектах, требующих его логики.

То, что вы идете не так, это то, что вы не поддерживаете это. Если вам нужно немного «подправить» [подкласс] (http://en.wikipedia.org/wiki/Subclass(computer_science)_ существующий код и расширить его, не изменяйте его. Если требуются серьезные изменения, пересмотрите дизайн.

1 голос
/ 29 августа 2008

Я сделал это обоими способами, которые вы упомянули. Мне нравится второе, но, как вы сказали, это немного утомительно, когда вы делаете обновления для этой библиотеки.

Другой способ, которым я воспользовался, - это выбрать центральное место для хранения ваших библиотек. Затем добавьте ключ реестра со строковым значением, чтобы указать на этот каталог. При добавлении ссылки все ваши библиотеки будут отображаться на вкладке .net, как если бы библиотеки были в GAC. Затем вы можете сделать команду post build, чтобы собрать библиотеку в этом центральном месте.

Вот ключ реестра, измените CompanyName и каталог:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\AssemblyFolders\ComapnyName]
@="C:\\CentralLocation"
0 голосов
/ 12 февраля 2011

Идея хорошая - поместите свой код в общую DLL и обратитесь к нему. Мы широко используем этот метод, и он работает. Очевидно, что некоторые проекты со временем будут несинхронизированы, поэтому способ, которым мы это делаем, таков:

  • Будьте наименее конкретны, если вы можете использовать универсальные типы, сделайте это. Например, если вы хотите функцию, которая обрабатывает нулевые или нулевые значения и

возвращает что-то, реализуя NullConvert (o как объект, subst как объект) как объект лучше, чем NullConvert (o как объект, String) как

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

  • Группировка функций по типу в вашем пространстве имен; MyGeneric.DateFns, MyGeneric.StringFns, MyGeneric.Comms и т. Д.

  • Не изменяйте функциональность после использования класса или метода, и это может быть небезопасно. Отметьте их как устаревшие и добавьте комментарии, чтобы указать, где был размещен новый / лучший класс.

  • Вы можете рассмотреть две или более библиотеки, например, Common Methods и Classes в базовой библиотеке, и доменные классы и

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

  • Рассмотрим использование "Реализации" вместо классов. Если у вас есть функция, которая обрабатывает ArrayList, например, установите

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

  • Избегайте введения специфики, например, явного драйвера (Oracle 8.x). Оберните это чем-то другим, так что если оно изменится, измените

внутренности объекта-оболочки, а не сам объект.

  • Узнайте, как использовать отражение. Допустим, вам нужна функция для получения значений Distinct из массива объектов. Вы можете использовать отражение и

затем передайте имя / имена свойств, для которых вам нужно различаться; GetDistinct (MyList как iList, «Имя») как список (из строки). Ваш код может выглядеть на

параметр под названием «Имя» через отражение (с небольшим снижением производительности).

  • Узнайте, как писать расширения (компонентная модель). Например, если вы пишете функцию, которая всегда возвращает септически отформатированный

дата, превратить функцию в функцию расширения. Назовите разумно, если ваша компания называется ABC, то используйте, например, ABCDateFormat, чтобы различать, например, ваши функции и функции MS.

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

0 голосов
/ 29 августа 2008

Какой-то действительно хороший повторно используемый код находится в Ayende Rahien's Rhino Tools . Взгляните не только на то, как он реализует различный общий код, но и на то, как он организован.

0 голосов
/ 29 августа 2008

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

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

0 голосов
/ 29 августа 2008

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

  • Любые изменения, которые вы делаете в одном проекте, будут отражаться во всех проектах без потери ссылочной целостности
  • У вас может быть возможность сохранить более одной версии имеющейся у вас библиотеки и ссылаться на конкретную версию вместо того, чтобы вытягивать волосы, чтобы выяснить, какая версия используется в каком проекте

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

Гудлак!

0 голосов
/ 29 августа 2008

Я не пользуюсь Visual Studio или .NET, но мне кажется, что эта проблема достаточно распространена среди ВСЕХ программистов, поэтому я думаю, что я воспользуюсь ею.

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

В конце концов, вам может быть лучше просто скопировать и вставить исходные файлы в ваш новый проект. Да, это нарушает принцип СУХОЙ (не повторять себя), но вы избегаете многих проблем, связанных с зависимостями, которые создает общая библиотека.

0 голосов
/ 29 августа 2008

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

Если вы обнаружите, что меняете свой Reuse Libary, чтобы он соответствовал вашим проектам, попробуйте сделать их менее конкретными и вместо этого использовать их в базовых классах Библиотеки в ваших реальных проектах. Поместите всю общую логику в классы библиотеки, а для отдельных частей приложения создайте производный класс и реализуйте их логику в этом производном классе.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...