Как скопировать код программы

Как скопировать код программы

Постоянно программируя на C++/Qt, я заметил, что было бы удобнее хранить где-нибудь свои отрывки кода и иметь к ним быстрый доступ. Конечно же, я принялся искать и нашёл множество готовых программ-органайзеров и сайтов. Я перепробовал их, но меня всё это не устроило.

Хотелось именно быстрого доступа — а значит по глобальным хоткеям. Чтобы нажал — ввёл слова в поиск — получил код. Но такими функциями обладали всего две программы, а они были платными и не кроссплатформенными.

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

Для начала я решил — программа должна быть, маленькой, удобной и шустрой. А значит — следует поместить программу в трее, чтобы не мешалась на панели задач. Благо что Qt предоставляет для этого удобное кроссплатформенное решение в виде класса QSystemTrayIcon. Также программа должна обязательно работать на глобальных хоткеях. Вот тут возникла проблема! Дело в том, что Qt, к сожалению, из коробки не поддерживает их. На то есть библиотека libqxt, которую я весьма успешно использовал почти год под Qt 4.8. Однако под Qt 5 её по неясной мне причине ещё нормально не доработали (на тот момент) и под Win7 она собираться ну никак не хотела — и я бросил эту затею. Вместо этого вставил самую капельку нативного кода — вызов winApi функции RegisterHotKey. Это единственная нативная вставка в программе — и я думаю что будет совсем легко доработать её под Linux или Mac.

Сами куски кода я решил сохранять в XML-базе данных. Может это и не лучшее решение, но оно пока вполне справляется с задачей. Да и вообще привык я к нему.

В качестве основы для редактора я взял, конечно же, QTextEdit. Тут меня ждал приятный сюрприз — код, скопированный из QtCreator — копируется как HTML с разметкой, а следовательно — с подсветкой синтаксиса. Тут же необходимость писать встроенную подсветку синтаксиса для C++Qt отпала сама по себе. QtCreator имеет очень крутую подсветку синтаксиса, особенно если её настроить под себя.

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

Также сделал кейворды. Ну как же без них? Поиск идёт не только по основному коду, но и по ним тоже. В кеях можно указать языки программирования, к которым относится данная паста, например «c++,qt» или «qml,js». Если в результате поиска появились фрагменты кода из нескольких языков, можно дифференцировать их, добавив ключевое слово-язык.

Дорабатывая программу, нарисовал в GIMPe логотип — фигурные скобочки. Просто и понятно.

Можете скачать Windows-дистрибутив программы здесь или собрать её из исходников, скачав их с github. Только распаковывайте их не на рабочий стол, как это делают многие. Дистрибутив вместе со всеми dll весит 16 МБ в запакованном виде и 40 в распакованном — Qt5 значительно разжирел и даже простейшая программа требует тащить за собой целую массу библиотек. Но я думаю что это не проблема, тем более что оно никак не сказывается на скорости работы программы.

Распакуйте программу в любую папку на диске и запустите. Она создаст в своей папке файл конфигурации config.xml, а потом, при сохранении, чистую базу данных для вашего кода base.xml. Собственно как выглядит главное меню — вы можете увидеть на скрине в заголовке статьи. Интерфейс программы пока что весь на английском, чтобы не было проблем со сборкой на некоторых системах — сообщения и подписи пока-что в исходниках.

Добавление нового фрагмента кода осуществляется по глобальному хоткею ctrl+D, а поиск — по win + V. Вы можете бросить в меня камень за такие «глобальные» хоткеи, но эксперименты показали что они самые удобные. Да, возможно вы привыкли по ctrl+D отправлять код из QtCreator куда-либо. Если это так критично, можете зайти в конструктор класса CodePaster и поменять там хоткеи на те, которые вам угодны. В дальнейшем это можно будет сделать через GUI.

Продолжим. Допустим, вы написали какой-то удобный алгоритм, или освоили новую конструкцию языка, которую нет желания печатать каждый раз. Вы просто выделяете ваш блок кода в вашей любимой IDE (например в креэйторе) — и копируете как обычно через ctrl+C. Тут же будет удобно и совсем рядом — не отпуская ctrl — нажать на D. Вылезет окно поверх вашей IDE — и код уже сам прыгнет в него! Программа в автоматическом режиме читает буфер обмена, вставляя из него код. Ещё тут есть ещё 2 небольшие фичи — вставляется подпись перед кодом в виде комментария "//", а также у самого кода убираются лишние отступы. Т.е. если вы скопировали его из середины программы, то он сдвинется влево до упора.

Вы просто нажимаете «OK» — и ваш код уже в базе! Более того, она тут же сохранилась на жёсткий диск, чтобы не потерять данные в случае какого-либо сбоя.

Читайте также:  Какие жесткие диски подходят для ps3

Далее — когда вам захотелось быстро скопировать этот код — нажимаете win + ctrl. Почему именно его? Мне он кажется удобным вариантом и нигде не задействован. Вы увидите маленький поисковик по коду, и уже оттуда сможете скопировать нужные вам фрагменты. Что касается самого поисковика — то у каждого куска кода есть контекстное меню. Вы можете удалить его из базы, можете отредактировать, а можете посмотреть его свойства.


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

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

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

Приведём простой пример использования программы — если вам вдруг понадобилось кинуть в вашей программе мессаджбокс для отладки (именно его, а не вывод qDebug) — заранее подготовив код, вы просто набираете win + V и вбиваете «mes» — этого достаточно, чтобы найти нужный кусок кода и скопировать его. Вы потратите одно нажатие хоткеев, набор 3 символов, Enter (который в дальнейшем можно будет убрать), и выделение-копирование. А теперь дайте сравним — сколько времени вы потратите, чтобы скопировать его из того же ассистанта? Даже если он на глобальном хоткее — вам придётся через выделение или клавиш получить фокус для строки поиска, ввести туда «mess», выбрать нужный класс мышкой (!), промотать вниз до того места где есть пример (если он есть) и только тогда скопировать его. Это как минимум в 2 раза дольше. Qt Assistant — это просто идеальная документация, однако для копирования-вставки постоянно используемых кусков кода он не подходит.

Какие варианты вы ещё предложите? Заходить каждый раз на сайт pastebin и искать там? Это тоже лишние задержки. Вводить в гугле по 100 раз одни и те же запросы? А ведь большинство программистов, с которыми я общался на эту тему — так и делали — они каждый раз всё гуглили. Но ведь один раз нашёл — можно сохранить в какой-нибудь «кэш» для быстрого доступа, изменив если надо — и использовать на здоровье! Этим кэшем и должна быть программа, хорошо интегрированная с системой для большего удобства.

Приведём другой пример. Я часто сижу на форуме prog.org.ru и постоянно нахожу или получаю много хороших решений разных небольших задач. Например, как с помощью QSettings добавить программу в автозагрузку Windows. Или как динамически подгрузить ui-форму. Там целые алгоритмы. Каждый раз искать то нашёл один раз — это не комфортно. Хорошие и красивые решения приятно сохранять для себя для будущего использования.

Ещё один пример — я один раз сохранил код для bat-файла, который добавляет переменную в windows environment variables. Когда он бывает нужен — просто копирую его в командную строку вместо использования неудобного GUI.

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

Если вы работаете сразу с несколькими языками программирования — преимущества использования такой программы станут ещё более существенными. Вы можете забыть как выглядит та или иная конструкция на определённом языке — и через поиск легко вспомнить.

Исходный код я писал жёстко по стандарту Qt Coding Style. Временами использовал конструкции С++11. Я думаю при его чтении проблем не возникнет. Все окна построены на основе виджетов, однако потом планирую перевести их на QML.

Вообще — не судите строго. Это мой первый публичный проект и я надеюсь что хоть кому-то пригодится если не прога, то те моменты, которые я изложил здесь. Если прога окажется реально полезной и вы плюсуете — то могу её доработать. В планах — сделать её ещё удобнее (идеи есть), подсветку синтаксиса для других языков и поддержку хоткеев для LinuxMac.

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

Программи́рование ме́тодом копи́рования-вста́вки, C&P-программирование или копипаста в программировании — процесс создания программного кода с часто повторяющимися частями [⇨] , произведёнными операциями копировать-вставить (англ. copy-paste ) [1] [2] . Обычно этот термин используется в уничижительном понимании для обозначения недостаточных навыков компьютерного программирования или отсутствия выразительной среды разработки, в которой, как правило, можно использовать подключаемые библиотеки.

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

Существуют случаи
[⇨] , когда копипаста в программировании может быть приемлема или необходима: шаблоны, размотка цикла (когда нет автоматической поддержки компилятором), а также в случае применения некоторых парадигм программирования или в случае поддержки редакторами исходного кода в виде сниппетов.

Читайте также:  Asus m3n78 vm поддерживаемые процессоры

Содержание

Плагиат [ править | править код ]

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

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

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

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

Такой код также нечаянно может стать обфусцированным, поскольку названия переменных, классов, функций и т. п. после копирования обычно остаются неизменными, даже если их назначение абсолютно отличается в новом контексте [4] .

Дублирование [ править | править код ]

Будучи формой дублирования кода, C&P-программированию свойственны некоторые проблемы, обостряющиеся, если код не сохраняет никакой семантической связи между оригиналом и копией. В этом случае, если требуются изменения, то время тратится напрасно на поиски всех дублирующих частей. Этот процесс может быть частично ускорен при хорошо комментированном коде, но всё же не отменяет необходимость осуществления нескольких правок. Поскольку сопровождение кода часто опускает обновление комментариев [7] , комментарии, описывающие, где найти повторяющиеся части кода, заведомо устаревают.

Эрик Аллен в книге «Типичные ошибки проектирования» использует термин «Фальшивая черепица» для обозначения ошибок, вызываемых копированием фрагмента программы. Вычленение повторяющегося фрагмента в метод (основной «рецепт» избавления от такого рода проблем) может оказаться нетривиальной задачей [8] .

Использование библиотек [ править | править код ]

Программирование методом копирования-вставки также нередко применяется опытными программистами, имеющими свои библиотеки хорошо протестированных и готовых к использованию сниппетов и общих алгоритмов, приспосабливаемых к конкретным задачам [2] .

Вместо создания нескольких изменённых копий обобщённого алгоритма объектно-ориентированный подход предлагает абстрагирование алгоритма в инкапсулированный класс, который может быть использован повторно. Такой класс создаётся гибко, с полной поддержкой наследования и перегрузки, что позволяет вызывающему коду взаимодействовать с одним обобщённым кодом, нежели с несколькими или многими изменёнными [9] . По мере расширения необходимой функциональности, библиотека также увеличивается в размере (с сохранением обратной совместимости). Так, если в оригинальный алгоритм вносят исправление бага, то всё программное обеспечение, использующее этот алгоритм и библиотеку, выигрывает.

Ветвление [ править | править код ]

Ветвление является нормальным процессом при разработке программного обеспечения в больших командах. Он позволяет осуществлять параллельную разработку на ветвях и, следовательно, сокращать циклы разработки. Классическое ветвление обладает следующими особенностями:

  • Управляется системой контроля версий, поддерживающей ветвление
  • Ветви повторно объединяются после завершения разработки

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

Как способ обособления нового продукта, копипаста имеет некоторые преимущества. Поскольку разработка нового продукта не вносит изменения в уже существующий:

  • Нет необходимости регрессионного тестирования существующего продукта;
  • Экономится время, связанное с обеспечением качества;
  • Сокращается время выхода на рынок;
  • Отсутствует риск внесения новых ошибок в существующий продукт (что могло бы нарушить существующую базу пользователей).
  • В случае, если новый и исходный продукты расходятся не так сильно, как ожидалось, есть вероятность столкнуться с необходимостью поддержки двух баз исходных кодов (увеличение стоимости в два раза), которые, по сути, являются одним продуктом. Это может привести к затратному рефакторингу и ручному слиянию в дальнейшем;
  • Существование двух баз кодов увеличивает время, требующееся для осуществления изменений, которые желательны для обоих продуктов, что в своё время увеличивает время выхода на рынок. В реальных условиях это может уничтожить любое ранее выигранное время.

Еще одной альтернативой C&P-подходу является модульный подход:

  • Изначально в библиотеки или модули выносится код, который будет общим для обоих продуктов;
  • Использование созданных библиотек является основой для разработки нового продукта;
  • Если предусматривается существование третьей, четвертой, пятой и т. п. производной версии продукта, то такой подход гораздо сильнее копирования-вставки, поскольку резко сокращает цикл разработки любого дополнительного продукта после второго [10] .

Повторяющиеся задачи или вариации задачи [ править | править код ]

Одна из наиболее вредных форм C&P-программирования выражается в появлении дублированного кода, выполняющего повторяющуюся задачу или вариацию основной задачи, в зависимости от некоторой переменной. Каждый экземпляр копирует ранее созданный с внесением незначительных изменений. Вызываемые эффекты:

  • Копирование-вставка зачастую приводит к большим по размеру методам;
  • Каждый экземпляр создает дубликат кода со всеми проблемами, описанными ранее, но в гораздо большем масштабе. Обычно существуют десятки дубликатов, но возможны и сотни. Исправление ошибки становится очень сложной и дорогостоящей задачей [11] ;
  • В такого рода коде присутствуют вопросы удобочитаемости. Проблемы, связанные с трудностью определения различий между повторениями оказывают прямое влияние на риски и расходы по внесению правок в код;
  • Модель процедурного программирования настоятельно не рекомендует прибегать в решении повторяющихся задач к подходу программирования методом копировать-вставить. Предпочтительным решением является создание функции или подпрограммы, которая выполняет один проход через задачу. Такая подпрограмма затем вызывается родительской программой повторно, либо в некоторой форме цикла. Такой код называется «хорошо декомпозированным» и рекомендуется как легко читаемый и более готовый к расширению [12] ;
  • Основная эмпирическая закономерность для такого случая: «не повторяйся». Дэвид Парнас сформулировал это правило так: «Копирование и вставка кода — следствие ошибки проектирования» [13] .
Читайте также:  Девушка с ногами на миллион долларов

Умышленный выбор подхода [ править | править код ]

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

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

Пример [ править | править код ]

Простым примером допустимого применения подхода может быть цикл for, который может выглядеть как for ( int i = 0 ; i != n ; ++ i ) <> . Примером кода, использующего такой цикл может быть:

Код цикла может быть сгенерирован следующим сниппетом (определяя типы и имена переменных):

Многие программисты часто используют подход из-за нежелания переписывать строчку, отличающуюся от предыдущей лишь несколькими символами (например, вызов одной функции для двух однотипных объектов, имена которых различаются незначительно). Дублировать предыдущую строку (также при помощи клавиатурных сокращений) оказывается быстрее, чем переписать её заново. Но вероятность допустить ошибку не уменьшается [14] , в особенности для последней строки [15] .

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

Существует исследование [16] , направленное на «декриминализацию» программирования методом копировать-вставить — Subtext programming language. Следует отметить, что в этой модели, копипаста — основная модель взаимодействия и, следовательно, не рассматривается как антипаттерн.

Иногда может понадобиться скопировать полезный пример из справки Visual Basic. Sometimes you may want to copy a useful example from Visual Basic Help. Хотя для правильной работы многих примеров может понадобиться дополнительный код, некоторые примеры полезны, чтобы увидеть, как ведет себя конкретная процедура или поток управления. While many of the examples require more code to work correctly, some examples are useful to see how a particular procedure or control flow technique behaves.

Чтобы скопировать пример кода из справки в приложение To copy example code from Help to your application

С помощью справки выведите на экран раздел элемента языка, пример для которого нужно использовать. Use Help to display the topic for the language element whose example you want to use.

Выберите ссылку пример в области без прокрутки в верхней части страницы. Choose the example link in the non-scrolling region near the top of the page. Появится пример кода. The code example is displayed.

Щелкните правой кнопкой мыши и выберите часть кода, которую нужно скопировать в приложение. Right-click and select the part of the code that you want to copy to your application. В меню Правка выберите пункт Копировать ; Откроется окно, в котором можно выбрать код для копирования. On the Macintosh, choose Copy from the Edit menu; a window appears in which you can select the code to copy.

Выберите Копировать в контекстном меню. Choose Copy from the shortcut menu. На Macintosh нажмите кнопку Copy (Копировать). On the Macintosh, press the Copy button.

Верните фокус в окно Код и установите указатель мыши в том месте, в которое нужно вставить пример кода. Move the focus back to the Code window and position the mouse pointer where you want the code example to be inserted.

Снова щелкните правой кнопкой мыши и выберите Вставить, чтобы вставить пример кода в окно Код. Right-click again and choose Paste to insert the code example into the Code window.

Можно также нажать клавиши CTRL+C, чтобы скопировать пример, выбранный в окне справки. You can also press CTRL+C to copy a selected example in a Help window. Нажмите CTRL+V, чтобы вставить пример в окно Код. Press CTRL+V to paste the example into the Code window.

См. также See also

Поддержка и обратная связь Support and feedback

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Have questions or feedback about Office VBA or this documentation? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь. Please see Office VBA support and feedback for guidance about the ways you can receive support and provide feedback.

Ссылка на основную публикацию
Как сделать цвет в автокаде
У многих возникает вопрос, «Как в Автокаде сделать белый фон?». На самом деле все очень просто. При начальных настройках пространство...
Как сделать нумерацию страницы в ворде
Microsoft Word — одна из самых часто используемых программ для работы с текстовыми документами. Когда текст слишком большой, для комфортной...
Как сделать обратную матрицу в excel
Приложение Excel выполняет целый ряд вычислений, связанных с матричными данными. Программа обрабатывает их, как диапазон ячеек, применяя к ним формулы...
Как сделать цитату в html
Цитата — дословная выдержка (отрывок) из какого-либо текста с указанием авторства или источника. Цитаты обычно используются на сайтах, где периодически...
Adblock detector