Копирование против функций


19 0

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

Очень часто программисты занимаются Copy/Paste, а ведь так просто взять и сделать код более универсальным. Если есть какая-то сходная задача с небольшими отличиями, то ее почему-то пишут дважды. А ведь так просто сделать что-то более универсальное, что будет проще сопровождать.

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

Подумайте над новой мыслью и в 9 случаях из 10 скорей всего новый универсальный вариант будет на много лучше работать для вас. И очень редко универсальность может сделать код сложнее без реальной выгоды. Это лично из моего опыта. И то, если универсальность не работает лучше клонирования кода, значит я где-то неправильно выбрал архитектурное решение проблемы. 


Понравилось? Кликни Лайк, чтобы я знал, какой контент более интересен читателям. Заметку пока еще никто не лайкал и ты можешь быть первым


Комментарии

dgango25

23 Июля 2013

я использую Copy/Paste если уж очень тороплюсь с проектом и нет времени думать,как из двух похожих функций слепить одну,я это называю апроксимировать код и к тому же излишняя оптимизиция уж очень усложняет код для чтения.
зы. обычно это первая версия программы V 0.1(тестовая версия),release конечно же нужно избавлять от использования идентичного кода..


Виктор

23 Июля 2013

Вдохновлено индусом-стажером? ;-)


Сергей Ю.

23 Июля 2013

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


ZeroXor

23 Июля 2013

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

А вот лезть что-то менять в написанном методе иногда может быть опасно - старый код, работающий с ним, может внезапно перестать работать. Не бывало у тебя такого?


XxX

23 Июля 2013

Ну вряд ли это вдохновлено индусами. Это как правило у них привычка все и вся объединить в одну функцию с миллиардов входных параметров а ты потом сиди гадай откуда ноги/руки растут. А вот терь понятно что так у нас оказывается учат делать мастера своего дела.


Михаил Фленов

23 Июля 2013

Это как правило у них привычка все и вся объединить в одну функцию с миллиардов входных параметров а ты потом сиди гадай откуда ноги/руки растут.


Такое чаще бывает, когда несвязанные вещи тулят в одну функцию.


XxX

23 Июля 2013

Да нет Михаил, это есть следствие всякой унификации методов. Я не знаю где вы учились на программиста но видимо не особо сильно уделяли внимание словам преподавателей, или учились не в России/США/Германии(за спецов этих стран ручаюсь). В этих странах спецы и преподаватели единогласно говорят, унификация методов это пунктик, которого надо избегать. Гипотетически возможно использование принципа описанного ZeroXor но не в "серьезных" проектах. Там же где все по настоящему серьезно и требует хорошего сопровождение можно встретить почти что копии одних и тех же методов и функции, различающиеся на одну-три строчки, в огромных количествах.


Михаил Фленов

23 Июля 2013

Если две функции выполняют одну и ту же логическую задачу и отличаются только строчкой или двумя, то я в 90% случаев объединял и буду объединять в одну функцию. По моей практике только в 10% случаев действительно нужно копировать, чтобы избежать безразмерного роста количества параметров и усложнения самой функции. Это как раз упрощает сопровождение кода.

Хочешь клонировать код по проекту, я как-то не собираюсь тебя переубеждать, можешь заниматься клонированием.


Анатолий

23 Июля 2013

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


XxX

24 Июля 2013

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


XxX

24 Июля 2013

А вообще да каждый пишет как хочет, просто агрессивное настроение было последние пару дней)


Spider_NET

24 Июля 2013

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


Дмитрий

24 Июля 2013

просто заметил что это не есть оптимальный подход и самое главное он противоречит принятым нормам как минимум среди спецов


Это с каких это пор copy/paste - это метод спецов? Если ты из таких спецов, то ты плохо учился.


XxX

24 Июля 2013

Дмитрий, разводить здесь холивар дальше не вижу смысла.
Мне понятно ваше возмущение если вы возводите copy/paste в ряд бездумного скопировал и вставил не думая и не смотря на будущее.
НО дальновидный с точки зрения написания качественного продукта "метод спецов" это написание под каждую задачу своих методов даже если это включает copy/paste уже имеющегося кода. Это то как учили и как учат ведущие "спецы" как минимум в трех обозначенных выше странах.
Унификация же уже имеющегося кода под нужды НОВЫХ задач пускай и имеет право на жизнь но оптимальным и уж тем более дальновидным решением не является.
За сим откланяюсь.


notez

24 Июля 2013

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


Дмитрий

25 Июля 2013

Я вот больше всего не понимаю, как XxX может ручатся за специалистов сразу трех стран


Overdrive

25 Июля 2013

А чем так плох копипаст? Аргументируйте.
Да и универсальную функцию делать сложнее и дольше. И она нуждается в лучшей отладке.


Михаил Фленов

25 Июля 2013

Копипаст - это клонирование кода. Если ты сделаешь 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, код обновляется магическим образом за секунды.


Overdrive

26 Июля 2013

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


Добавить Комментарий

Еще что-нибудь

Хотите найти еще что-то интересное почитать? Можно попробовать отфильтровать заметки на блоге по категориям.

О блоге

Программист, автор нескольких книг серии глазами хакера и просто блогер. Интересуюсь безопасностью, хотя хакером себя не считаю

Обратная связь

Без проблем вступаю в неразборчивые разговоры по e-mail. Стараюсь отвечать на письма всех читателей вне зависимости от страны проживания, вероисповедания, на русском или английском языке.

Пишите мне