Парадигмы программирования — что это значит?
Парадигма программирования описывает основной стиль, в котором разрабатывается программа. Он диктует, какие принципы применяются и какие подходы используются.
Приветствую моего брата и наставника Тобиаса Стренга —
Если вам понравилась эта статья и вы хотите узнать больше о программировании в .Net и Angular, подпишитесь на нас :P
Мне, как разработчику C#, было очень интересно узнать о некоторых других концепциях, помимо объектно-ориентированного программирования или программирования баз данных. Поэтому я решил написать очень небольшое резюме о различных концепциях программирования.
В этой статье я затрону следующие темы:
- Функционально-ориентированное программирование
- Клиент — Сервер — программирование
- Программирование баз данных
- Объектно-ориентированное программирование
- императивное программирование
- параллельное программирование
- логическое программирование
Функционально-ориентированное программирование:
Важно понимать, что это языки, в которых отсутствуют присваивания значений. Наиболее важной теоретической основой является лямбда-вычисление
— типичные представители функциональных и функционально-ориентированных языков являются:
Функциональное программирование — это создание программного обеспечения с использованием чистых функций. Чистая функция — это совершенно обычная функция программы, которая имеет только два особых свойства:
- Для одних и тех же входных параметров всегда предоставляется одно и то же возвращаемое значение.
- Нет побочных эффектов.
Эти две характеристики делают чистую функцию сравнимой с простой математической функцией y = f(x), которая всегда определяет одно и то же значение y для одного и того же значения x.
На практике это означает, что вся программная логика функции работает исключительно с данными из входных параметров и результатом является ровно одно возвращаемое значение. Во время вызова функции нет побочных эффектов, таких как изменение состояния переменных вне функции или входных параметров, запись в базу данных или файл или вызов других функций, которые сами имеют побочные эффекты.
Клиент-серверное программирование:
Модель клиент-сервер — это способ распределения задач и услуг в сети. Задачи передаются программам, а затем выполняются ими. Эти программы являются клиентами и серверами.
Клиент:
Клиент — это компьютер или программа, которая взаимодействует с сервером (центральным компьютером) и использует данные и специальные сервисы с него.
Задача клиента — передавать запросы на сервер и таким образом подготавливать данные что пользователь может прочитать их на своем конечном устройстве. Сам клиент не выполняет никаких серверных задач, а лишь служит интерфейсом для пользователя. Типичным клиентом является, например, веб-браузер. Чтобы отобразить веб-сайт, веб-браузер должен связаться с веб-сервером, который затем отправляет нужную домашнюю страницу. Только теперь браузер может отображать веб-сайт. Многие клиенты работают в фоновом режиме как системная служба, например DNS-клиенты.
Сервер:
Сервер обычно представляет собой компьютер, имя которого происходит от «обслуживать». Сервер может работать либо только в закрытой (корпоративной) сети, либо также может быть доступен через Интернет. Это своего рода точка контакта в сети или Интернете, которая должна принимать, пересылать и отвечать на множество запросов. Для того, чтобы он мог с этим справиться, он оснащен высокопроизводительным оборудованием, соответствующим его задаче.
Программирование баз данных:
Обрабатываемые данные хранятся в более или менее структурированной форме в виде базы данных. Фактические расчеты результатов выполняются с помощью запросов к базе данных.
Для этого используются универсальные языки запросов. Самые известные — SQL (Structured Query Language) и XQuery (XML Query Language) — столь же мощны, как и алгоритмические языки программирования других парадигм.
База данных, короче: БД, представляет собой набор «связанных» данных в хорошо структурированной форме. С технической точки зрения БД можно рассматривать как (большой) файл. Что касается структурирования данных, то различают три категории:
- Плоская иерархия: представление данных в виде двумерных таблиц, при необходимости со ссылками на содержимое других таблиц
- Строгая иерархия: глубокая вложенность структур
- Простая структура: пары ключ-значение, сопоставимые со словарем.
Вот пример файла json:
Объектно-ориентированного программирования:
Если вы хотите узнать больше об объектно-ориентированном программировании, ознакомьтесь с моей статьей C# — объектно-ориентированное программирование (ООП).
Объекты:
Люди думают объектно-ориентированно. Они думают в терминах объектов, таких как стол, стул, человек и так далее. Объектно-ориентированные языки программирования имитируют человеческое мышление и содержат абстракции от объектов. Таким образом, объектная ориентация описывает способ лучшего представления написанного исходного кода. Это перспектива разработки программного обеспечения, которая описывает сложные системы с использованием объектов и использует для этой цели классы и методы. Таким образом, экземпляр класса является объектом. Чтобы более точно проиллюстрировать этот принцип класса, в качестве примера используется человек. У всех людей есть определенные характеристики, такие как имя или дата рождения. Каждый особый человек является объектом.
Если теперь классу Person присвоить свойства, такие как имя, возраст, рост и пол, то постепенно вырисовывается поверхностный образ человека. Указанные свойства еще не имеют никаких значений при создании класса, потому что здесь определяется только, какие свойства должен иметь более поздний объект, путем указания типа данных из которого происходит соответствующее имущество. Здесь используется своего рода план, чтобы определить, что такое человек.
Если требуется один объект, вы можете использовать команду new()для создания экземпляра класса Person. Вызывается конструктор, и разработчику предоставляется возможность присвоить значения. Например, здесь мы можем создать человека Петра с именем Петр, возрастом 41 год, ростом 1,82 и полом Мужской. Питер — это экземпляр/сформированный объект класса Person. Объект также может содержать методы.
Методы:
Под методом можно понимать своего рода «подпрограмму», в которой могут быть объединены определенные функции программы.
Существуют разные способы определения методов. Методы можно сделать видимыми или невидимыми для других классов в глобальном масштабе проекта с помощью ключевых слов public и private. Также можно определить тип возвращаемых данных, который может быть назначен как переменная, например, при вызове метода. Это возвращается в теле метода с ключевым словом return и указывается в заголовке метода как соответствующий тип данных, например. целое число. Если это не требуется, ключевое слово void пишется там же в заголовке метода. Кроме того, методы могут содержать и использовать параметры.
Метод может быть привязан к объекту, если не определен как статический и создается в классе, в котором определен план объекта. Например, в предыдущем примере Person вы могли бы добавить метод go(). Если метод не является статическим, его можно вызвать, только если он вызывается с использованием точечной нотации за экземпляром класса, т. е. объектом.
Однако, если метод должен вызываться без привязки к объекту, он можно определить как статический с помощью ключевого слова статический.
Императивное программирование:
Императивное программирование — старейшая парадигма программирования. Согласно этой парадигме, программа состоит из четко определенной последовательности инструкций для компьютера.
Таким образом, исходный код императивных языков объединяет команды, которые определяют, что компьютер должен делать и когда достичь желаемого результата. Значения, используемые в переменных, изменяются во время работы программы. Для управления командами в код интегрированы управляющие структуры, такие как циклы или ответвления.
Императивные языки программирования очень конкретны и работают близко к системе. С одной стороны, код прост для понимания, с другой стороны, требуется много строк исходного кода, чтобы описать, чего можно добиться в декларативных языках программирования с долей команд.
Императивный язык можно разделить еще на 3 части:
- структурированное программирование:
расширяет императивный базовый принцип конкретными управляющими структурами, последовательностями, выбором (выборкой) и итерацией (повторением) - процедурное программирование:
делит задачу, которую должна выполнять программа, на более мелкие подзадачи, которые описываются отдельно в коде. Таким образом создаются программные блоки, которые также можно использовать в других программах. - модульное программирование:
отдельные компоненты программы проектируются, разрабатываются и тестируются полностью независимо друг от друга. Только в конечном итоге отдельные модули образуют реальное программное обеспечение в сочетании.
Параллельное программирование:
Таким образом, параллельное программирование — это особый случай параллелизма, когда отдельные объекты работают вместе для достижения (как правило) высокой производительности и высокой пропускной способности.
Существует два типа параллельного программирования:
- неявный параллелизм:
- очень просто для программиста
- Программист только формулирует последовательный алгоритм и не заботится об организации параллельной обработки
- Очень высокие требования к компилятору - явный параллелизм
— должен быть явно сформулирован программистом в программе
— снижены требования к компилятору
Параллелизм означает, что несколько задач (программ, процессов, потоков, отдельных команд, отдельных операторов), сопоставимых по своему типу, выполняются одновременно, поскольку в структуре доступно несколько ресурсов, пригодных для выполнения уровень
Асинхронный != параллельный
Запуск чего-либо асинхронно означает, что оно не заблокировано. Вы запускаете его, не дожидаясь его завершения, и переходите к другим делам. Параллелизм означает запуск нескольких вещей параллельно одновременно. Параллелизм работает хорошо, когда вы можете разбивать задачи на независимые работы.
Возьмем, к примеру, рендеринг кадров 3D-анимации. Анимация долго рендерится. Когда вы начинаете рендеринг в своем программном обеспечении для редактирования анимации, убедитесь, что оно работает асинхронно, чтобы ваш пользовательский интерфейс не блокировался, и вы могли выполнять другие задачи. Теперь каждый кадр этой анимации можно рассматривать и как отдельное задание. Если доступно несколько процессоров/ядер или несколько компьютеров, мы можем рендерить несколько кадров параллельно, чтобы ускорить общее использование.
Большинство языков программирования предлагают варианты распараллеливания процессов. Однако некоторые языки разработаны с нуля для параллельного программирования или имеют эту возможность изначально:
- новостной свод
- Оккам
- Царапать
- X10
- Эрланг
- Часовня
- Единая параллель C
- Ржавчина
- GO
На мой взгляд, параллельное программирование имеет большой потенциал, но также сопряжено с большим риском. Неправильное приложение может привести к очень высокому уровню ошибок и значительному снижению производительности. Опытный разработчик должен решить, где и насколько распараллеливание хорошо. Если вы принимаете правильные решения, вы можете сэкономить много времени и эффективности.
логическое программирование
Логическое программирование — это парадигма программирования, основанная на математической логике. В отличие от императивного программирования, логическая программа состоит не из последовательности инструкций, а из набора аксиом (аксиома =
принцип, признанный абсолютно правильным; действительная истина, не нуждающаяся в доказательстве), под которыми здесь следует понимать просто набор фактов или предположений. Если пользователь логической программы делает запрос, интерпретатор пытается вычислить решение только на основе аксиом.
Этот пример написан на естественном языке, чтобы показать принцип:
Факты:
Люсия — мать Минны.
Люсия — мать Клауса.
Минна — мать Надин.
Правило:
Если X — мать Y, а Y — мать Z, то X — бабушка Z.
Вопрос/Цель:
Кто бабушка Надин?
Ответ компьютера, вывод из фактов и правил:
Люси
Этот ничем не примечательный пример можно легко расширить, включив в него другие семейные отношения.
Области применения:
- Искусственный интеллект
- Базы данных
- Экспертные системы
- Симуляторы
- Генераторы
- Математика
- CAD/CAM-системы
Пожалуйста, ознакомьтесь с другими моими статьями:
- LINQ — Как избежать вложенных циклов в C#
- .Net C# — чистая архитектура и принцип инверсии зависимостей
- C# — объектно-ориентированное программирование (ООП)
- C# — простота объяснения единой ответственности
- OCP — Что действительно важно
- 8 лучших советов по повышению вашей мотивации как программиста
- Краткий экскурс в Сети
- Отправка и получение — 7-уровневая модель OSI
- Сетевые протоколы 7-го уровня легко объясняются
Источник:
Programmmierparadigmen — Кристиан Вагенкнехт