Python Стили программирования

Python Стили программирования — выбираю подходящие.

Пламенный привет посетителям этой страницы, пришедшим из социальных сетей! С апреля 2021-го года наблюдаю удивительное явление: обильный поток посетителей из 4-х социальных сетей. В связи с этим настоятельно рекомендую всем неоднократно и регулярно посещать сайт rtbsm.ru — там в общих чертах изложена Российская Теннисная Балльная Система Марии (Шараповой).

Python Стили программирования — мне известны три основных стиля программирования: Процедурный, Объектно-ориентированный, Функциональный и Структурный.

Процедурный Стиль программирования — это программирование, основанное на использовании процедур:

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

Процедурное программирование является отражением архитектуры традиционных ЭВМ, которая была предложена Фон Нейманом в 1940-х годах.

Теоретической моделью процедурного программирования служит абстрактная вычислительная система под названием машина Тьюринга.

Основные сведения

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

Таким образом, с точки зрения программиста имеются программа и память, причём первая последовательно обновляет содержимое последней.

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

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

Привожу разъяснение особенностей императивных языков программирования:

Императивное программирование — это парадигма программирования (стиль написания исходного кода компьютерной программы), для которого характерно следующее:

  • в исходном коде программы записываются инструкции (команды);
  • инструкции должны выполняться последовательно;
  • при выполнении инструкции данные, полученные при выполнении предыдущих инструкций, могут читаться из памяти;
  • данные, полученные при выполнении инструкции, могут записываться в память.

Императивная программа похожа на приказы (англ. imperative — приказ, повелительное наклонение), выражаемые повелительным наклонением в естественных языках, то есть представляют собой последовательность команд, которые должен выполнить компьютер.

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

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

Основные черты императивных языков:

  • использование именованных переменных;
  • использование оператора присваивания;
  • использование составных выражений;
  • использование подпрограмм;
  • и др.

Объектно-ориентированный Стиль программирования — это стиль, который удовлетворяет трём изложенным ниже требованиям:

Объектно-ориентированное программирование (ООП) — методология программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определенного класса, а классы образуют иерархию наследования.

  • Необходимо обратить внимание на следующие важные части этого определения:
    • 1) объектно-ориентированное программирование использует в качестве основных логических конструктивных элементов объекты, а не алгоритмы;
    • 2) каждый объект является экземпляром определенного класса;
    • 3) классы образуют иерархии.

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

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

Основные понятия

Абстракция данных

Абстрагирование означает выделение значимой информации и исключение из рассмотрения незначимой. В ООП рассматривают лишь абстракцию данных (нередко называя её просто «абстракцией»), подразумевая набор значимых характеристик объекта, доступный остальной программе.

Инкапсуляция

Инкапсуляция — свойство системы, позволяющее объединить данные и методы, работающие с ними, в классе. Одни языки (например, С++, Java или Ruby) отождествляют инкапсуляцию с сокрытием, но другие (Smalltalk, Eiffel, OCaml) различают эти понятия.

Наследование

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

Полиморфизм подтипов

Полиморфизм подтипов (в ООП называемый просто «полиморфизмом») — свойство системы, позволяющее использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта. Другой вид полиморфизма — параметрический — в ООП называют обобщённым программированием.

Класс

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

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

Эти блоки называются «свойствами» и почти совпадают по конкретному имени со своим полем (например, имя поля может начинаться со строчной, а имя свойства – с заглавной буквы).

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

Переменная-объект, относящаяся к заданному классом типу, называется экземпляром этого класса.

При этом в некоторых исполняющих системах класс также может представляться некоторым объектом при выполнении программы посредством динамической идентификации типа данных.

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

В свою очередь, целостность предметной области объектов и их интерфейсов, а также удобство их проектирования, обеспечивается наследованием.

Объект

Сущность в адресном пространстве вычислительной системы, появляющаяся при создании экземпляра класса (например, после запуска результатов компиляции и связывания исходного кода на выполнение).

Функциональный Стиль программирования подробно описан в таком тексте:

Что такое функциональное программирование?

Лучше всего начать с труднейшего вопроса — а что, собственно, такое «функциональное программирование (FP)»?

Один из возможных ответов — «это когда Вы пишете на языке наподобие Lisp, Scheme, Haskell, ML, OCAML, Clean, Mercury или Erlang (или ещё на некоторых других)». Этот ответ, безусловно, верен, но не сильно проясняет суть.

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

Вспоминается притча о трёх слепцах и слоне. Возможно также определить FP, противопоставив его «императивному программированию» (тому, что Вы делаете на языках наподобие C, Pascal, C++, Java, Perl, Awk, TCL и на многих других — по крайнее мере, большей частью).

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

В языках, называемых функциональными, хорошо поддерживаются нижеперечисленные подходы, а все прочие подходы поддерживаются плохо или не поддерживаются вовсе:

  • Функции — объекты первого класса. Т. е. всё, что можно делать с «данными», можно делать и с функциями (вроде передачи функции другой функции в качестве параметра).
  • Использование рекурсии в качестве основной структуры контроля потока управления. В некоторых языках не существует иной конструкции цикла, кроме рекурсии.
  • Акцент на обработке списков (lists, отсюда название Lisp — LISt Processing). Списки с рекурсивным обходом подсписков часто используются в качестве замены циклов.
  • «Чистые» функциональные языки избегают побочных эффектов. Это исключает почти повсеместно распространенный в императивных языках подход, при котором одной и той же переменной последовательно присваиваются различные значения для отслеживания состояния программы.
  • FP не одобряет или совершенно запрещает утверждения (statements), используя вместо этого вычисление выражений (т. е. функций с аргументами). В предельном случае одна программа есть одно выражение (плюс дополнительные определения).
  • FP акцентируется на том, что должно быть вычислено, а не как.
  • Большая часть FP использует функции «высокого порядка» (функции, оперирующие функциями, оперирующими функциями).

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

Более того, высокие теоретики от компьютерной науки, логики и математики находят, что процесс доказательства формальных свойств для функциональных языков и программ много проще, чем для императивных.

Структурный стиль программирования:

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

В соответствии с данной методологией любая программа строится без использования оператора goto из трёх базовых управляющих структур: последовательность, ветвление, цикл; кроме того, используются подпрограммы. При этом разработка программы ведётся пошагово, методом «сверху вниз».

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

В 1970-е годы объёмы и сложность программ достигли такого уровня, что традиционная (неструктурированная) разработка программ перестала удовлетворять потребностям практики.

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

Методология структурной разработки программного обеспечения была признана «самой сильной формализацией 70-х годов».

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

Структурное программирование стало основой всего, что сделано в методологии программирования, включая и объектное программирование».

Подробная информация про Структурное программирование содержится на странице Python Структурное программирование.

Python Стили программирования — это и Процедурный, и Объектно-ориентированный, и Функциональный, и Структурный стили программирования, ибо Python допускает использование всех четырёх стилей программирования.

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

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

Простой пример двух решений одной задачи (используется один и тот же язык Python) иллюстрирует это.

# императивный стиль
target = [] # создать пустой список
for item in source_list: # для каждого элемента        

# исходного списка
‘ trans1 = G(item) # применить функцию G()
‘ trans2 = F(trans1) # применить функцию F()
‘ target.append(trans2) # добавить преобразованный элемент в список

Функциональная версия выглядит по-другому:

# функциональный стиль
# языки ФП часто имеют встроенную функцию compose()
compose2 = lambda A, B: lambda x: A(B(x))
target = map(compose2(F, G), source_list)

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

Более точно, существует четыре ступени развития функционального стиля, в порядке убывания роли данных в программах:

  • Рефал (для этой категории, представленной единственным языком, нет общепринятого названия);
  • Аппликативные (Лисп, ML, Tcl, Rebol);
  • Комбинаторные (APL/J/K, FP/FL);
  • Бесточечные (чистые конкатенативные) (Joy, Cat, Factor, подмножество PostScript).

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

Некоторые языки поддерживают ряд стилей: например, Haskell позволяет писать и в аппликативном, и в комбинаторном, и в бесточечном стилях.

Чтобы ещё больше запудрить Вам мозги, привожу информацию об Основных моделях программирования, а также о Подходах и приёмах:

Основные модели программирования

  • Императивное программирование
  • Декларативное программирование
  • Структурное программирование
  • Функциональное программирование
  • Логическое программирование
  • Объектно-ориентированное программирование
    • Программирование, основанное на классах
    • Программирование, основанное на прототипах
    • Субъектно-ориентированное программирование

Подходы и приёмы

  • Структурное программирование
  • Процедурное программирование
  • Аппликативное программирование
  • Обобщённое программирование
  • Доказательное программирование
  • Порождающее программирование
  • Аспектно-ориентированное программирование
  • Агентно-ориентированное программирование
  • Рекурсия
  • Автоматное программирование
  • Событийно-ориентированное программирование
  • Компонентно-ориентированное программирование
  • Грамотное программирование

Чтобы разобраться во всех особенностях современных методов, подходов и приёмов программирования, нужно годами заниматься программированием профессионально и сильно перестроить своё мышление.

У меня нет сил и времени на это, да и мозги перестраивать нет желания, поэтому буду заниматься Процедурным и  Структурным программированием. ООП не потяну и принципиально не хочу его осваивать.

Приглашаю всех высказываться в Комментариях. Критику и обмен опытом одобряю и приветствую. В хороших комментариях сохраняю ссылку на сайт автора!

И не забывайте, пожалуйста, нажимать на кнопки социальных сетей, которые расположены под текстом каждой страницы сайта.
Python Стили программированияПродолжение тут…

Deviz_3

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Проверка комментариев включена. Прежде чем Ваши комментарии будут опубликованы пройдет какое-то время.