2009-04-04 2 views
3

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

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

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

PS: Я единственный разработчик в обоих этих проектах, и похоже, что он будет оставаться таким образом на некоторое время.

ответ

5

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

Одна вещь, о которой вы хотите быть осторожной, - это позволить фактическому повторному использованию диска для разработки общих библиотек, а не придумывать общую архитектуру заранее. Очень заманчиво попасть в рамки дизайна и абстрагироваться от него для совместного использования. К сожалению, вы часто обнаруживаете, что совместное использование никогда не развивается или развивается в другом направлении, чем вы ожидали, и вы в конечном итоге переписываете или выбрасываете большую часть структуры или, что еще хуже, сохраняете и поддерживаете неиспользуемый код. Пусть YAGNI (вам это не понадобится) будет вашим проводником и задержите рефакторинг в общих библиотеках, пока вам не понадобится.

1

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

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

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

+0

Спасибо! Это отлично работает для большинства функций, которые я использую повторно. Как насчет чего-то вроде класса, который создает миниатюры профиля? Я не могу жестко задавать параметры ширины и высоты, так как они разные для каждого проекта. Есть ли способ установить эти значения один раз и использовать его во всем моем проекте? –

+0

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

Смежные вопросы