2017-01-30 20 views
1

В настоящее время я пишу библиотеку, которая обрабатывает события для наблюдения за событиями eyetracking. Я несколько раз переработал общий дизайн библиотеки, наконец, придумал понравившийся мне дизайн, предоставив всей библиотеке всеобъемлющую тему использования.Кодирование дублирования по сравнению с обобщающей кодовой базой

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

Теперь, когда я почти готов к выпуску, я понимаю, что существует несколько классов, которые можно обобщить с использованием дженериков, поскольку некоторые из классов содержат 80% + дублированного кода.

Но есть несколько проблем, я вижу, что я бы столкнуться, когда рефакторинг текущих кодового к родовым один:

  • Я бы добавить методы интерфейса, которые могли бы иметь смысл для всего Выводя классы, но они никогда не были частью спецификации для большинства из них.
  • Мне пришлось бы заменить большую часть документации для конкретных типов (лучшие практики, общие gotchas и т. д.) с очень общей документацией, которая на самом деле не помогает пользователю
  • Половина библиотеки будет использовать сильно вложенные дженерики, в то время как r half будет в основном оставаться неизменным, уменьшая положительные эффекты обучения/использования всеобъемлющего дизайна, который я придумал.
  • Общая часть библиотеки может быть использована практически с любым, но на самом деле не будет полезна ни для чего, кроме целей для снятия глаз
  • небольшое изменение в требованиях к библиотеке может нарушить общий дизайн, имея для возврата кодовых обратно в состояние, похожее на текущий

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

+0

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

+0

Существует 4 класса, которые имеют дубликат. Эти классы обрабатывают различные типы событий eytracking, которые связаны, но не абстрагируемы к общему интерфейсу. Единственное, что у них есть, это то, что они могут быть упорядочены в хронологическом порядке, которые я уже учитывал в общем сопоставимом интерфейсе и классе коллекции. В процентах я бы сказал, что это может быть 30%. –

+0

С учетом того, что кодовая база на самом деле не такая большая, 4 класса от малого до среднего могут быть лучшей метрикой. –

ответ

2

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

Почему дупликации плохо

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

  2. Многие «дублирования» действительно являются повторными реализациями. Это плохо по двум причинам: (а) заново изобретать затраты времени на колесо (b) часто происходят небольшие изменения кода, что также усложняет обслуживание.

Дублирование против контекста

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

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

Что касается управления зависимостями, создания API и т. Д., Это может зависеть от того, как вы управляете своими повторно используемыми компонентами. Вы можете создать единую библиотеку утилиты для всех из них или опубликовать несколько микропакетов.

По моему мнению, оба или не оптимальные по многим причинам, включая некоторые из тех, о которых вы упомянули. Для разработки и извлечения компонентов многократного использования быстро и управлять ими впритык (управление версиями, зависимостей, CI и т.д ..), мы создали систему управления компонент с открытым исходным кодом под названием «Бит»:

https://github.com/teambit/bit (Примеры: https://bitsrc.io/bit/utils#array)

Мы использовали его, чтобы превратить 30% нашей базы кода в компоненты многократного использования и обнаружили, что хотя компоненты рефакторинга из контекста были жесткими, он окупился в долгосрочной перспективе. Другие люди сказали мне, что они удалили до 55-60% своего кода и превратились в многоразовые компоненты. H ere is also a nice example хорошо протестированного компонента многократного использования в свободном узле сообщества бит.

Вы можете попробовать это самостоятельно (захотите помочь, если вам что-нибудь понадобится).

+1

Хороший ответ. Мой оригинальный вопрос был опубликован около месяца назад, и я уже удалил дублирование кода и перешел на более общий дизайн. На мой взгляд, кодовая база становится сложнее понять, но в основном это объясняется тем, что общий код сложнее читать, чем конкретный код. Мой API существенно не изменился, и теперь его гораздо проще продлить. Я даже мог реализовать некоторые другие функции довольно быстро из-за удаления дублированного кода. Короче говоря, это было полезно, но также потребовалось много итеративного проектирования и тестирования. –

+0

Рад слышать, как вы решили что-то сделать и извините за поздний ответ. Это определенно стоит! – Yoni