Скелетное программирование — это стиль компьютерного программирования, основанный на простых высокоуровневых структурах программ и так называемом фиктивном коде . Скелеты программ напоминают псевдокод , но позволяют проводить синтаксический анализ , компиляцию и тестирование кода. Фиктивный код вставляется в скелет программы для имитации обработки и избежания сообщений об ошибках компиляции . Он может включать пустые объявления функций или функции, которые возвращают правильный результат только для простого тестового случая, где ожидаемый ответ кода известен.
Скелетное программирование облегчает подход к проектированию сверху вниз , где частично функциональная система с полными высокоуровневыми структурами проектируется и кодируется, и эта система затем постепенно расширяется для выполнения требований проекта. Скелеты программ также иногда используются для высокоуровневых описаний алгоритмов . Скелет программы также может использоваться как шаблон, который отражает синтаксис и структуры, обычно используемые в широком классе задач.
Программы-скелеты используются в шаблоне проектирования метода шаблона , используемом в объектно-ориентированном программировании . В объектно-ориентированном программировании фиктивный код соответствует абстрактному методу , заглушке метода или фиктивному объекту . В номенклатуре удаленного вызова методов Java (Java RMI) заглушка взаимодействует на стороне клиента со скелетом на стороне сервера. [1]
Скелет класса — это схема класса , используемого в программной инженерии . Он содержит описание ролей класса и описывает цели переменных и методов , но не реализует их. Класс позже реализуется из скелета. Скелет также может быть известен как интерфейс или абстрактный класс с языками, которые следуют полиморфной парадигме.
Современное программное обеспечение [2] часто бывает сложным по ряду причин. Это может означать, что не один программист может его разработать, или что другие модули или части должны быть импортированы отдельно. Программы также могут быть слишком сложными сами по себе, некоторые из них имеют несколько методов, одновременно обращающихся к одной переменной или даже генерирующих пиксели для дисплеев. Скелетный код используется для того, чтобы помочь программистам разрабатывать свой код с наименьшим количеством ошибок во время компиляции .
Скелетный код чаще всего встречается в параллельном программировании , но также применяется в других ситуациях, например, в документации на языках программирования . Это помогает упростить основную функциональность потенциально запутанного метода. Его также можно использовать, чтобы разрешить небольшой функции в более крупной программе временно работать без полной функциональности. Этот метод программирования проще, чем написание полной функции, поскольку эти скелетные функции не обязательно должны включать основные функциональные возможности и вместо этого могут быть жестко закодированы для использования во время разработки. Они обычно включают синтаксически правильный код для представления метода, а также комментарии для указания работы программы. Это не всегда необходимо для вызова фрагмента текстового скелетного кода.
Псевдокод чаще всего встречается при разработке структуры нового программного обеспечения . Это простое описание на английском языке определенной функции в более крупной системе или даже может быть представлением целой программы. Псевдокод похож на скелетное программирование, однако отличается тем, что псевдокод в первую очередь является неформальным методом программирования. [3] Фиктивный код также очень похож на это, где код используется просто как заполнитель или для обозначения предполагаемого существования метода в классе или интерфейсе.
Программисты чрезвычайно зависимы от псевдокода, настолько, что он оказывает измеримое влияние на их психику . [3] Типичный программист настолько обусловлен идеей написания упрощенного кода каким-либо образом, будь то написание псевдокода или скелетного кода, или даже просто рисование диаграммы, что это оказывает измеримое влияние на то, насколько хорошо они могут написать свою окончательную реализацию. Это было обнаружено в ряде приложений, с разными программистами, работающими на разных языках и с различными парадигмами программирования .
Этот метод проектирования программ также чаще всего выполняется ручкой и бумагой, еще больше отдаляя текст от того, что фактически должно быть реализовано. Скелетное программирование имитирует это, но отличается тем, что оно обычно пишется в интегрированной среде разработки или текстовых редакторах . Это способствует дальнейшей разработке программы после начальной стадии проектирования . Скелетные программы также позволяют работать упрощенным функциям, если они запущены.
Скелетное программирование может быть реализовано в различных приложениях программирования.
Большинство, если не все языки программирования имеют скелетный код, используемый для помощи в определении всех встроенных функций и методов . Это обеспечивает простые средства для новых программистов, чтобы понять синтаксис и предполагаемую реализацию написанных методов.
Java , объектно-ориентированный язык , в значительной степени фокусируется на структурированной странице документации с полностью разделенными методами для каждой части объекта пакетов Java. [4] Объектно-ориентированные языки фокусируются на иерархической структуре своих реализаций, а не на простом подходе сверху вниз, который можно найти в других языках. «Объекты» хранят в себе данные и переменные, что позволяет писать обычно более эффективные программы. Эти объекты имеют отдельные функции, которые могут получать доступ к внутренним переменным, известным как методы.
Каждый метод определен в том же формате, с именем метода, а также синтаксисом, который будет использоваться в интегрированной среде разработки, четко видимым в верхней части блока. С фокусом Java на области действия , типах данных и наследовании , этот синтаксис чрезвычайно полезен для новых, если не для всех программистов. Затем следует подробное объяснение работы метода с ошибками ниже.
Python имеет похожий подход к документированию встроенных методов, однако имитирует отсутствие в языке фиксации на области действия и типах данных. [5] Эта документация содержит синтаксис каждого метода, а также краткое описание и пример типичного использования метода или функции. Скелетный код, представленный в примере, дает программистам хорошее понимание функции с первого взгляда.
Классы, написанные сторонними разработчиками, в основном как часть библиотек, также демонстрируют свое программирование в форме скелетного кода. Это помогает информировать любого, кто является новичком в библиотеке, о том, как работают функции и методы. P5.Js использует этот формат на своей странице документации для объяснения предполагаемого использования определенных включенных функций. [6] Однако это отличается от документации языка программирования, поскольку скелетный код используется для отображения параметров , а не всех возможных вариантов использования метода.
Интерфейсы естественного языка (NLI) чаще всего встречаются в ситуациях, когда программисты пытаются получить входные данные , обычно в разговорной речи называемые (без использования жаргона , специфичного для языка программирования ), и использовать их для создания программы или метода. Реализация этого использует небольшой набор скелетного кода, чтобы подразумевать функцию, работающую в фоновом режиме. [7]
Другие формы NLI используют различные формы ввода, начиная от других пользователей, говорящих на разных языках, до ввода на основе жестов, чтобы получить очень похожий результат. Поскольку языки программирования разрабатываются и пишутся в основном на английском языке, людям, говорящим на других языках, сложно разрабатывать новое программное обеспечение. NLI использовались в некоторых исследованиях [8] для помощи людям в таких ситуациях. Исследование показало классы, написанные на Java с использованием NLI. Это устранило необходимость изучения синтаксических правил, однако означало, что класс был написан с использованием базового набора скелетного кода.
Полиморфизм — это идеология, которая следует парадигме объектно-ориентированного программирования , где методы могут быть переопределены или перегружены (методы с тем же именем в дочернем классе, которые будут иметь приоритет над методом, написанным в родительском классе). Определение методов основано на каркасе, определяемом синтаксисом языка . [9]
Очень похоже на реализацию класса, скелетный код может использоваться для определения методов, которые являются частью интерфейса . Интерфейс по сути является планом класса, который позволяет строгим объектно-ориентированным языкам (таким как Java ) использовать классы из разных пакетов без необходимости полного понимания внутренних функций. Интерфейсы просто определяют методы, которые должны присутствовать в классе, позволяя любому другому использовать методы или реализовывать класс для своих личных нужд.
public_skeletonExample();
Абстрактный класс почти то же самое, что и реализация класса, однако в зависимости от языка, по крайней мере один метод определен как абстрактный. Это подразумевает, что любые дочерние классы этого класса (любые классы, которые расширяют или реализуют) должны иметь определенный для этого метод. Абстрактные классы имеют очень похожий стиль определения с интерфейсами, однако ключевое слово 'abstract' обычно используется для обозначения того факта, что он должен быть реализован в дочерних классах.
public abstract skeletonExample();
В этих примерах используется синтаксис Java.
Параллельное программирование — это работа нескольких функций одновременно, которая чаще всего используется для повышения эффективности. Обычно это самые сложные типы программ для разработки из-за их сложности и взаимосвязанности с рассматриваемым оборудованием . Многие разработчики пытались писать программы с этой базовой функциональностью, [10] однако это приводило к разным результатам.
Алгоритмические каркасные фреймворки используются в параллельном программировании для абстрактного описания рассматриваемых методов для последующей разработки. Фреймворки не ограничиваются одним типом, и каждый из этих типов имеет разные цели для повышения эффективности программы разработчика. Их можно разделить на три основных типа: параллельные данные , параллельные задачи и разрешение. [10]
Эти скелетные алгоритмы используются для разработки программ, которые работают с большим объемом данных, обычно определяя связи между данными для последующего использования. Алгоритмы параллельной обработки данных включают «карты», «разветвления» и «сокращения» или «сканирования».
Эти операции, как следует из их названия, работают над задачами. Каждый тип алгоритма в этом случае отличается из-за изменения поведения между задачами. Алгоритмы параллельных задач включают в себя «последовательности», «фермы», «трубы», «if», «for» и «while».
Эти скелеты сильно отличаются от типичных скелетов, найденных выше. Алгоритмы «разрешения» используют комбинацию методов для решения определенной проблемы. Заданная задача алгоритма может быть «семейством проблем». [10] Существует два основных типа этих скелетов: «разделяй и властвуй» или «клейми и связывай».