Развязка против ЯГНИ

Они противоречат?

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

Как вы думаете? Вы всегда пытаетесь отделить и справиться с накладными расходами?

9 ответов

Решение

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

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

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

Ягни - это эмпирическое правило (не религия). Разделение - это более или менее техника (также не религия). Так что они на самом деле не связаны и не противоречат друг другу.

ЯГНИ о прагматизме. Предположим, вам что-то не нужно, пока вы не сделаете.

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

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

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

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

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

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

Сложная часть этой истории - узнать, когда и в какой степени вам нужна развязка.

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

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

Что ж, YAGNI - это не более чем фальшивая упрощенная фраза, которую люди бросают вокруг. Разделение, однако, является довольно хорошо понятной концепцией. Кажется, Ягни подразумевает, что вы какой-то экстрасенс. Это просто программирование клише, что никогда не было хорошей идеей. Честно говоря, есть основания утверждать, что YAGNI, вероятно, вообще не связан с разделением. Связывание, как правило, "быстрее" и "кто знает, что если вам нужно, вам понадобится разделенное решение; вы все равно не будете менять компонент X!"

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

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

YAGNI беспорядок:) ... на самом деле, нам не нужно смешивать весь код, чтобы идти "быстрее".

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

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

Другие вопросы по тегам