Используешь какой-то код один раз? Можно написать его напрямую в модуле. Нужно использовать его в двух местах? Категорически не рекомендую копировать код, даже если ты думаешь, что он понадобится только дважды. Большинство это прекрасно понимает, но я почему-то регулярно вижу подобное даже у опытных программистов.
Очень часто программисты занимаются Copy/Paste, а ведь так просто взять и сделать код более универсальным. Если есть какая-то сходная задача с небольшими отличиями, то ее почему-то пишут дважды. А ведь так просто сделать что-то более универсальное, что будет проще сопровождать.
Посмотри за собой. Если ты занимаешься копированием кода, то очень рекомендую прекращать это дурное занятие. Каждый раз, когда в голове проскакивает мысль: «О у меня там есть похожий метод, я его сейчас скопирую и чуть-чуть изменю» - прогони эту мысль. Попробуй заменить мысль на «О, у меня есть похожий метод, сейчас я его сделаю чуть более универсальным и он будет работать в обоих случаях. И если этот метод в контроллере, то я перемещу его в модель».
Подумайте над новой мыслью и в 9 случаях из 10 скорей всего новый универсальный вариант будет на много лучше работать для вас. И очень редко универсальность может сделать код сложнее без реальной выгоды. Это лично из моего опыта. И то, если универсальность не работает лучше клонирования кода, значит я где-то неправильно выбрал архитектурное решение проблемы.
Понравилось? Кликни Лайк, чтобы я знал, какой контент более интересен читателям. Заметку пока еще никто не лайкал и ты можешь быть первым
я использую Copy/Paste если уж очень тороплюсь с проектом и нет времени думать,как из двух похожих функций слепить одну,я это называю апроксимировать код и к тому же излишняя оптимизиция уж очень усложняет код для чтения.
зы. обычно это первая версия программы V 0.1(тестовая версия),release конечно же нужно избавлять от использования идентичного кода..
Вдохновлено индусом-стажером? ;-)
...я часто так делаю, занимаюсь копипастом. Понимаю, что это "плохо" ... но когда надо что-нибудь по быстрому "слепить", этот вариант работает ... а что еще надо?
Иногда в попытке сделать универсально, особенно если торопишься, появляется такой лапшекод, что потом самому можно в нем заблудиться. Хотя все же стараюсь использовать похожий метод, просто создаю метод-обертку, который подготовит данные и вызовет уже написанный метод.
А вот лезть что-то менять в написанном методе иногда может быть опасно - старый код, работающий с ним, может внезапно перестать работать. Не бывало у тебя такого?
Ну вряд ли это вдохновлено индусами. Это как правило у них привычка все и вся объединить в одну функцию с миллиардов входных параметров а ты потом сиди гадай откуда ноги/руки растут. А вот терь понятно что так у нас оказывается учат делать мастера своего дела.
Да нет Михаил, это есть следствие всякой унификации методов. Я не знаю где вы учились на программиста но видимо не особо сильно уделяли внимание словам преподавателей, или учились не в России/США/Германии(за спецов этих стран ручаюсь). В этих странах спецы и преподаватели единогласно говорят, унификация методов это пунктик, которого надо избегать. Гипотетически возможно использование принципа описанного ZeroXor но не в "серьезных" проектах. Там же где все по настоящему серьезно и требует хорошего сопровождение можно встретить почти что копии одних и тех же методов и функции, различающиеся на одну-три строчки, в огромных количествах.
Если две функции выполняют одну и ту же логическую задачу и отличаются только строчкой или двумя, то я в 90% случаев объединял и буду объединять в одну функцию. По моей практике только в 10% случаев действительно нужно копировать, чтобы избежать безразмерного роста количества параметров и усложнения самой функции. Это как раз упрощает сопровождение кода.
Хочешь клонировать код по проекту, я как-то не собираюсь тебя переубеждать, можешь заниматься клонированием.
Код писали не индусы, но все равно китайцы. Получилось "то лапы ломит, то хвост отваливается".
Бизнес-логику может содержать даже View. Понимания всей картины может не возникнуть вообще никогда.
Почему бы не скопипастить? Задачи решать надо как-то - дэдлайны и пр.
Ну дай то бог Михаил что бы у вас были все было нормально с таким подходом. Я вас тоже переубеждать не собираюсь, просто заметил что это не есть оптимальный подход и самое главное он противоречит принятым нормам как минимум среди спецов.
А вообще да каждый пишет как хочет, просто агрессивное настроение было последние пару дней)
Если код хорошо покрыт тестами, то особой опаски в апгрейде определенного кода не будет, т.к. все ошибки будут обнаружены на очередном прогоне теста. В своих прожектах стараюсь делать универсальность в разумных приделах. Ибо каждая универсальная вещь, перспективы которой могут открыться в туманном будущем занимает слишком много времени, а его на работе и так не хватает.
Дмитрий, разводить здесь холивар дальше не вижу смысла.
Мне понятно ваше возмущение если вы возводите copy/paste в ряд бездумного скопировал и вставил не думая и не смотря на будущее.
НО дальновидный с точки зрения написания качественного продукта "метод спецов" это написание под каждую задачу своих методов даже если это включает copy/paste уже имеющегося кода. Это то как учили и как учат ведущие "спецы" как минимум в трех обозначенных выше странах.
Унификация же уже имеющегося кода под нужды НОВЫХ задач пускай и имеет право на жизнь но оптимальным и уж тем более дальновидным решением не является.
За сим откланяюсь.
ну не знаю, во всех компаниях штатов, где я работал, копипастеров я не видел. может мне просто повезло и я работал не со специалистами, за которых ручается трехиксовый. у нас везде идет борьба за повторное использование кода и за написание более универсальных инструментов. именно поэтому появились такие вещи как библиотеки dll, именно поэтому вообще создавалось объектно ориентированное программирование, чтобы можно было наследовать функции (не в смысле func, а в смысле возможности) и писать классы, которые можно использовать в разных случаях и даже в разных приложениях без необходимости копировать код.
Я вот больше всего не понимаю, как XxX может ручатся за специалистов сразу трех стран
А чем так плох копипаст? Аргументируйте.
Да и универсальную функцию делать сложнее и дольше. И она нуждается в лучшей отладке.
Копипаст - это клонирование кода. Если ты сделаешь 10 копий и вдруг что-то меняется, то нужно будет менять в 10 местах. Проще написать одну функцию и использовать ее в 10 местах и в случае смены логики достаточно будет изменения только в одном месте.
Когда я говорю о универсальности, то тут нужно просто провести для себя грань разумности. Если где-то код не отличается вообще (чистый копипастинг) или отличается совсем чуть чуть, то имеет смысл оформить функцию, метод или даже класс. По моему опыту это 9 из 10 случаев копипастинга. Если же логика у двух кусков кода слишком разная и универсальная функция будет слишком сложная, то это же уже не копипастинг.
Пример, у меня на работе приложение сидит на серверах за сетевым экраном, балансером нагрузки и проксиком. Чтобы получить IP адрес нужно лезть в одно поле запроса. На рабочих же машинах IP будет в другом поле. В приложении в нескольких раз склонировали код типа:
if (Request.ServerVariables["HTTP_X_FORWARDED_FOR"] != null)
используем Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
else
используем Request.ServerVariables["REMOTE_ADDR"];
И вот подобных клонов несколько. А ведь так просто написать функцию GetIPAddress() и использовать ее везде, где нужен IP адрес. Проще сопровождать и меньше шансов допустить ошибку новым программерам, которые не знают о такой специфике наших рабочих серверов, если где-то в недрах MS или проксика произошли изменения и поле REMOTE_ADDR поменялось на VERYREMOTE_ADDR, код обновляется магическим образом за секунды.
Да в этом случае вы правы. Не совсем было ясно, где копипаст использовался.
Я также делаю пишу одну сущность, если она решает примерно те же задачи, вводя дополнительный параметр, во избежании избыточности кода. И код элегантнее получается.
Хотите найти еще что-то интересное почитать? Можно попробовать отфильтровать заметки на блоге по категориям.