Резервирование по сравнению с зависимостями: что хуже?

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

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

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

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

P.S Следуя статье из статьи Статья

Ответ 1

Я определенно рекомендую прочитать эссе Джоэлса по этому поводу:

"В защиту синдрома не-изобретаемого-здесь"

В отношении зависимости лучшая метрика, о которой я могу думать, была бы "остановит мир, если это исчезнет". Например, если STL С++ волшебно ушел, то множество программ перестало бы работать. Если исчезнет .Net или Java, наша экономика, вероятно, будет избивать из-за количества продуктов, которые перестали работать...

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

Его аналогично тому, чтобы быть маленьким потребителем какого-либо аппаратного компонента. Иногда аппаратные средства устаревают. Зачем? Потому что никто его не использует. Если вы небольшая компания и вам нужно получить компонент для своего продукта, вы выберете то, что обычно доступно - то, что "крупные игроки" заказывают в больших количествах, надеясь, что это означает, что (а) компонент не исчезнет, (b) проблемы с компонентом хорошо известны, (c) имеется большая информированная пользовательская база и (d) она может стоить меньше и быть более доступной.

Иногда, хотя вам нужна эта специальная часть конденсатора, и вы рискуете, что компания, продающая ее вам, может не заботиться о том, чтобы продлить производство флюсодержащих конденсаторов, если вы заказываете только 20 в год, и никто, кажется, не заботится:). В этом случае, возможно, стоит разработать собственный конденсатор потока вместо того, чтобы полагаться на эту ненадежную Doc Brown Inc. Просто не покупайте плутоний у ливийцев.

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

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

Ответ 2

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

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

Ответ 3

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

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

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

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

Хорошим примером этого может быть использование сопоставления объектных отношений (Hibernate\NHibernate) за набором репозиториев или объектов доступа к данным или фабрик, реализуемых с помощью инфраструктуры инъекций зависимостей.