Вопрос

Противоречат ли они?

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

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

Это было полезно?

Решение

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

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

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

Другие советы

ЯГНИ — это эмпирическое правило (а не религия).Разделение — это в большей или меньшей степени техника (а также не религия).Так что на самом деле они не связаны и не противоречат друг другу.

ЯГНИ – это прагматизм.Считайте, что вам что-то не нужно, пока оно вам не понадобится.

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

«Разъединить» (или «слабое соединение») — это глагол, поэтому над ним нужно работать.ЯГНИ — это презумпция, к которой вы приспосабливаетесь, когда обнаруживаете, что она больше не соответствует действительности.

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

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

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

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

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

Если «модульное тестирование — это заноза в заднице», я бы сказал, что вы делать нужно это.В большинстве случаев развязку можно обеспечить практически с нулевыми затратами, так почему бы вам не сделать это?

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

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

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

Что ж, YAGNI — это не более чем фальшивая упрощенная фраза, которую люди разбрасывают.Однако развязка является довольно хорошо изученной концепцией.ЯГНИ, похоже, подразумевает, что человек является своего рода экстрасенсом.Это просто программирование по клише, что никогда не является хорошей идеей.Честно говоря, есть основания полагать, что YAGNI, вероятно, вообще не имеет отношения к развязке.Соединение обычно происходит «быстрее», и «кто знает, понадобится ли вам отдельное решение;ты все равно не будешь менять компонент X!»

ЯГНИ бардак :) ...на самом деле, нам не нужно смешивать весь код, чтобы работать «быстрее».

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top