Если я пытаюсь создать новый метод для другой обработки B, он вызывается для дублирования кода.
Не все дубликаты кода созданы равными.
Допустим, у вас есть метод, который принимает два параметра и складывает их вместе total()
. Скажем, у вас есть еще один называется add()
. Их реализации выглядят полностью идентичными. Должны ли они быть объединены в один метод? НЕТ !!!
Принцип « Не повторяйся сам» или « СУХОЙ» - это не повторение кода. Речь идет о распространении решения, идеи, так что, если вы когда-нибудь измените свою идею, вам придется переписывать везде, где вы распространяете эту идею. Blegh. Это ужасно. Не делай этого. Вместо этого используйте DRY, чтобы помочь вам принимать решения в одном месте .
Принцип СУХОГО (не повторяй себя) гласит:
Каждая часть знаний должна иметь одно, однозначное, авторитетное представление в системе.
wiki.c2.com - Не повторяйся
Но DRY может быть испорчен в привычку сканировать код в поисках аналогичной реализации, которая кажется копией и вставкой где-то еще. Это мертвая форма мозга СУХОГО. Черт, вы можете сделать это с помощью инструмента статического анализа. Это не помогает, потому что игнорирует пункт СУХОЙ, который заключается в сохранении гибкости кода.
Если мои общие требования изменятся, мне, возможно, придется изменить мою total
реализацию. Это не значит, что мне нужно изменить мою add
реализацию. Если какой-нибудь придурок свел их вместе в один метод, то теперь мне нужна небольшая ненужная боль.
Сколько боли? Конечно, я мог бы просто скопировать код и создать новый метод, когда мне это нужно. Так что нет ничего страшного, верно? Malarky! Если ничего другого, ты стоишь мне доброго имени! Хорошие имена трудно найти и плохо реагируют, когда вы играете с их значением. Хорошие имена, которые ясно дают понять намерения, важнее, чем риск того, что вы скопировали ошибку, которую, честно говоря, легче исправить, если ваш метод имеет правильное имя.
Поэтому мой совет - не допускать, чтобы коленные реакции на подобный код связывали вашу кодовую базу в узлы. Я не говорю, что вы можете игнорировать тот факт, что методы существуют, и вместо этого копировать и вставлять волей невольно. Нет, у каждого метода должно быть чертовски хорошее имя, которое поддерживает одну идею, о которой он говорит. Если его реализация совпадает с реализацией какой-то другой хорошей идеи, прямо сейчас, сегодня, кого это волнует?
С другой стороны, если у вас есть sum()
метод, который имеет идентичную или даже отличную от реализации реализацию total()
, тем не менее, когда бы ни менялись ваши общие требования, вам придется менятьsum()
тогда есть большая вероятность, что это одна и та же идея под двумя разными именами. Мало того, что код будет более гибким, если они будут объединены, он будет менее запутанным в использовании.
Что касается булевых параметров, да, это неприятный запах кода. Проблема не только в том, что поток управления создает проблему, но еще хуже в том, что вы вырезали абстракцию в плохой точке. Предполагается, что абстракции делают вещи проще, а не сложнее. Передача bools методу для управления его поведением подобна созданию секретного языка, который решает, какой метод вы действительно вызываете. Оу! Не делай этого со мной. Дайте каждому методу собственное имя, если только у вас нет честного полиморфизма .
Теперь вы, кажется, перегорели на абстракции. Это очень плохо, потому что абстракция - замечательная вещь, когда все сделано хорошо. Вы используете это много, не думая об этом. Каждый раз, когда вы водите автомобиль, не разбираясь в системе реечной передачи, каждый раз, когда вы используете команду печати, не думая о прерываниях ОС, и каждый раз, когда вы чистите зубы, не думая о каждой отдельной щетине.
Нет, проблема, с которой вы, похоже, столкнулись - плохая абстракция. Абстракция создана для того, чтобы служить другой цели, чем ваши потребности. Вам нужны простые интерфейсы в сложные объекты, которые позволяют вам требовать удовлетворения ваших потребностей, даже не разбираясь в этих объектах.
Когда вы пишете код клиента, который использует другой объект, вы знаете, что вам нужно и что вам нужно от этого объекта. Это не так. Вот почему клиентский код владеет интерфейсом. Когда вы клиент, ничто не может сказать вам, что вам нужно, кроме вас. Вы создаете интерфейс, который показывает ваши потребности и требует, чтобы все, что вам было вручено, отвечало этим потребностям.
Это абстракция. Как клиент, я даже не знаю, с чем говорю. Я просто знаю, что мне нужно от этого. Если это означает, что вы должны завернуть что-то, чтобы изменить его интерфейс, прежде чем передать его мне нормально. Мне все равно Просто делай то, что мне нужно. Хватит усложнять.
Если мне нужно заглянуть внутрь абстракции, чтобы понять, как ее использовать, абстракция потерпела неудачу. Мне не нужно знать, как это работает. Просто это работает. Дайте ему хорошее имя, и если я загляну внутрь, меня не удивит то, что я нахожу. Не заставляй меня продолжать смотреть внутрь, чтобы вспомнить, как его использовать.
Когда вы настаиваете, что абстракция работает таким образом, количество уровней за ней не имеет значения. Пока вы не смотрите за абстракцией. Вы настаиваете, что абстракция соответствует вашим потребностям, а не адаптируется к ней. Чтобы это работало, оно должно быть простым в использовании, иметь хорошее имя и не быть утечкой .
Это отношение породило инъекцию зависимостей (или просто отсылку, если вы, как я, в старой школе). Это хорошо работает с предпочтительным составом и делегированием по наследованию . Отношение идет под многими именами. Мой любимый - скажи, не спрашивай .
Я мог бы утопить тебя в принципах весь день. И, похоже, твои коллеги уже есть. Но вот в чем дело: в отличие от других областей техники этому программному обеспечению менее 100 лет. Мы все еще выясняем это. Так что не позволяйте кому-то с большим количеством устрашающего звучания книжного обучения запугивать вас писать трудный для чтения код. Слушайте их, но настаивайте, чтобы они имели смысл. Не принимай ничего на веру. Люди, которые каким-то образом пишут код только потому, что им сказали, что это так, даже не зная, зачем создавать самые большие беспорядки из всех.