Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Когда в угоду DRY, сам того не замечая, разработчик жертвует принципом SRP, первым и главным постулатом из SOLID.Вот так живешь — живешь, сядешь в ванну, спинку себе потрешь… А потом оказывается, что ты, сам того не зная, ЁКЛМН в угоду ПРСТ, и это еще не говоря о ФХЦ. Хотя, какой я, в торец, программист, если не в курсе этих буковок.
И, кстати, да — правильная аббревиатура всенепременнейше должна быть сама по себе словом — DRY, KISS и так далее. Тогда ее автор, вероятно, прется неимоверно и считает себя ну просто писателем, не меньше.Всё проще. Тогда она сама с большей вероятностью отложится на память (англоязычного) человека без усилий с его стороны.
Ещё одна из ошибок тут в том, что разработчик продолжает следовать плану, поставленным оценкам, и это происходит «в тишине», ведь ответственности как бы нет, она лежит на всей команде, принявшей такое решение и такую оценку.
На момент сдачи второй истории, компонент уже был обречен, и чем дальше, тем хуже.
Вариант избавления от дублирования через...
abstract class ThreeViewPageLayout {
methodA () { /* code here */ }
methodB () { /* code here */ }
methodC () { /* code here */ }
runMethod () {
methodA();
methodB();
methodC();
}
}
class FirstPage extends ThreeViewPageLayout {
methodB () { /* new code here */ }
}
class SecondPage extends ThreeViewPageLayout {
methodB () { /* new code here */ }
}
class ThirdPage extends ThreeViewPageLayout {
methodA () { /* new code here */ }
methodB () { /* new code here */ }
}
Еще этому немало способствует желание заказчика реализовать все «подешевле», Ведь переиспользовать ранее созданный контейнер быстрее, чем реализовать страницу полностью.
На самом деле вы забыли ещё более приятный вариант — через полиморфизм.Этот вариант худший. Его «обвинили, и наложили на него табу» уже давно. И я его таки упомянул. Наследование — зло. А проблема ровно та же самая. То, разработчик посчитал неизменяемым и вынес в базовый класс рано или поздно получит свой change request, в котором нужно будет изменить метод X для сценария А, но не для сценария В
То есть вы сами утверждаете, что допустили ошибку в планировании, но обвиняете при этом не собственную лень и непрофессиональное поведение, а принцип DRY.Да, мы допустили ошибку, кто их не допускает? И нет, мы не обвиняем, а предлагаем метод ну если не решения, то улучшения, хотя даже скорее метод избежания заведомого ухудшения.
Его «обвинили, и наложили на него табу» уже давно
Наследование — зло
получит свой change request, в котором нужно будет изменить метод X для сценария А, но не для сценария В
Да, мы допустили ошибку, кто их не допускает?
Извините, но это бред. И абсолютно не аргументирован.аргументов предостаточно, и я не автор этого высказывания, просто с ним согласен.
Вместо того, чтобы осознать и починить ошибки — вы обвиняете подходы.Я не обвиняю дождь в том, что он мокрый. Я лишь говорю, что он мокрый. Из трех вариантов разбиения кода вариант с наследованием имеет наибольшую вязкость, я его лишь упомянул, но не стал приводить псевдокодовый пример, ибо он заведомо худший.
Всего лишь… необходимо было реструктуировать код… Да, это рефакторинг,Мыши кололись, плакали, но продолжали грызть кактус. Выбирая менее устойчивое к изменениям решение, вы чаще будете нуждаться в рефакторинге. Ваш технический долг будет расти быстрее, только и всего.
Плохо то, что вы делаете неправильный вывод.Вязкость такая характеристика, которую не измерить линейкой, килобайтами и строчками кода. Она видна лишь с течением времени и лишь в условиях постоянно меняющихся требований.
Создать иерархию наследования можно двумя способами: «Заменой кода типа подклассами» ( Replace Type
Code with Subclasses) и «Заменой кода типа состоянием/стратегией» (Replace Type Code with State/Strategy).
Более простым вариантом является создание подклассов, поэтому по возможности следует выбирать его.
Однако если код типа изменяется после того, как создан объект, применять создание подклассов нельзя, и
необходимо применять паттерн «состояния/стратегии»
2. Называет и стратегию полиморфизмом
1. описывает другую ситуацию
И эта статья, в целом, описывает мой подход, так что ...
я ожидал цитату именно с этим.
стратегии (которые и есть про полиморфизм)
проблему «быстро выяснил, что функционала контейнера недостаточно, а полноценный рефакторинг не вписывается в оценки»
ваш подход весьма ограничен
Когда нужно реализовать третий сценарий, который похож на первые два, но не на 100%, возникает желание переиспользовать код, содержащийся в контейнере. Но его не получится переиспользовать частично, можно лишь взять его целиком, поэтому приходится вносить изменения в контейнер, что сразу несет риск сломать другие сценарии.
Если же вы в разработке используете паттерн strategy, и в контейнер бизнес-логика попала — знайте, линию вы уже перешагнули, и стоите по щиколотку в… ммм, болоте.
Бизнес-задача — отсортировать сущности, И сама сортировка, и правила сравнения, и логика выбора конкретного правила являются в целом решением бизнес-задачи по сортировке данных в разных ситуациях.Сортировка есть фундаментальная задача программирования. Она нужна для решения бизнес-задачи, да, но она не стала от этого бизнес-логикой. Бизнес-логика специфична для конкретного бизнеса/приложения/компонента. Все что не специфично, а алгоритм сортировки явно не специфичен ни для какого бизнеса, бизнес-логикой не является.
Все что не специфично, а алгоритм сортировки явно не специфичен ни для какого бизнеса, бизнес-логикой не является.
Если же вы в разработке используете паттерн strategy, и в контейнер бизнес-логика попала — знайте, линию вы уже перешагнули,
Другими словами, вопрос в том, что вы будете делать, когда заказчик скажет, что ее надо изменить. Именно ту логику, которая в «контейнере». Причем для одного сценария, допустим для поштучного, а для остальных сценариев оставить так как есть.
Скилл у него [другого разработчика] другой, мышление другое, результат не заставит себя ждать.
Если разделение ответственностей между компонентами было изначально верным,Как же можно узнать наперед, какие задачи в будущем будет ставить бизнес. Разделение ответственности основано на допущениях. И чем больше допущений, тем больше вероятность, что одно из них окажется неверным.
Если у вас в команде есть такие проблемы, то они будут проявляться на любых шаблонах, Надо бороться с тем, что «мышления и скиллы» у разных разработчиков конфликтуют.Клонировать людей? Бороться с вязкостью как мне кажется проще, чем бороться с тем, что все люди разные.
Как же можно узнать наперед, какие задачи в будущем будет ставить бизнес.
Клонировать людей?
Бороться с вязкостью как мне кажется проще, чем бороться с тем, что все люди разные.
Как же можно узнать наперед, какие задачи в будущем будет ставить бизнес.
«пять сценариев похожи на 90%, а шестой лишь на 10%»Предполагалось, что шестой на 85%. Ну или, скажем 89%. Как в том анекдоте «N мало, пусть будет M»©.
Но при большой команде, скрам, канбан и все такое, история уходит свободному разработчику, а не «нужному». Скилл у него другой, мышление другое, результат не заставит себя ждать.
Когда в угоду DRY, сам того не замечая, разработчик жертвует принципом SRP
Правило, по которому один элемент равен другому или больше-меньше есть бизнес-логика.Почему-то сразу вспомнились интерфейсы (=«стратегии» на языке дизайн-паттернов)
Comparable и Comparator из Java. Помню, писал компараторы даже для Java-методов для одного интерпретатора. Ничего, нормально всё сработало. Магическое слово «бизнес-логика» ещё не повод не выносить алгоритм сравнения в «стратегию».
Cухой антипаттерн