Процедурное программирование c
Процедурное программирование
Процедурное (императивное) программирование является отражением архитектуры традиционных ЭВМ, которая была предложена фон Нейманом в 1940-х годах. Теоретической моделью процедурного программирования служит алгоритмическая система под названием Машина Тьюринга.
Содержание
Основные сведения
Выполнение программы сводится к последовательному выполнению операторов с целью преобразования исходного состояния памяти, то есть значений исходных данных, в заключительное, то есть в результаты. Таким образом, с точки зрения программиста имеются программа и память, причем первая последовательно обновляет содержимое последней.
Процедурный язык программирования предоставляет возможность программисту определять каждый шаг в процессе решения задачи. Особенность таких языков программирования состоит в том, что задачи разбиваются на шаги и решаются шаг за шагом. Используя процедурный язык, программист определяет языковые конструкции для выполнения последовательности алгоритмических шагов.
Процедурные языки программирования
- Ada(язык общего назначения)
- Basic (версии начиная с Quick Basic до появления Visual Basic)
- Си
- КОБОЛ
- Фортран
- Модула-2
- HAL/S
- Pascal
- ПЛ/1
- Рапира
- REXX
См. также
- Функциональное программирование (контраст)
- Логическое программирование
- Императивное программирование
- Парадигмы программирования
- Язык программирования
- Объектно-ориентированное программирование
Литература
- Джозеф Джарратано, Гари Райли Глава 10. Процедурное программирование // «Экспертные системы: принципы разработки и программирование» : Пер. с англ. — М. : 2006. — 779—851 стр., «Вильямс»
Ссылки
- Проверить достоверность указанной в статье информации.
- Найти и оформить в виде сносок ссылки на авторитетные источники, подтверждающие написанное.
- Добавить иллюстрации.
Wikimedia Foundation . 2010 .
Смотреть что такое «Процедурное программирование» в других словарях:
Программирование — Эта статья должна быть полностью переписана. На странице обсуждения могут быть пояснения. У этого термина существуют и другие значения, см. Программи … Википедия
Парадигма (программирование) — Парадигма программирования это совокупность идей и понятий, определяющая стиль написания программ. Парадигма, в первую очередь, определяется базовой программной единицей и самим принципом достижения модульности программы. В качестве этой единицы … Википедия
Структурное программирование — Эта статья или раздел нуждается в переработке. Пожалуйста, улучшите статью в соответствии с правилами написания статей … Википедия
Неструктурированное программирование — Структурное программирование методология разработки программного обеспечения, в основе которой лежит представление программы в виде иерархической структуры блоков. Предложена в 70 х годах XX века Э. Дейкстрой, разработана и дополнена Н. Виртом. В … Википедия
Аспектно-ориентированное программирование — Парадигмы программирования Агентно ориентированная Компонентно ориентированная Конкатенативная Декларативная (контрастирует с Императивной) Ограничениями Функциональная Потоком данных Таблично ориентированная (электронные таблицы) Реактивная … Википедия
Императивный язык программирования — Процедурное (императивное) программирование является отражением архитектуры традиционных ЭВМ, которая была предложена фон Нейманом в 40 х годах. Теоретической моделью процедурного программирования служит алгоритмическая система под названием… … Википедия
C++ — У этого термина существуют и другие значения, см. C. См. также: Си (язык программирования) C++ Семантика: мультипарадигмальный: объектно ориентированное, обобщённое, процедурное, метапрограммирование Тип исполнения: компилируемый Появился в … Википедия
ООАП — Объектно ориентированное программирование (ООП) парадигма программирования, в которой основными концепциями являются понятия объектов и классов (либо, в менее известном варианте языков с прототипированием прототипов). Класс это тип, описывающий… … Википедия
Объектно-ориентированный подход — Объектно ориентированное программирование (ООП) парадигма программирования, в которой основными концепциями являются понятия объектов и классов (либо, в менее известном варианте языков с прототипированием прототипов). Класс это тип, описывающий… … Википедия
ДРАКОН (алгоритмический язык) — У этого термина существуют и другие значения, см. Дракон (значения). Пример блок схемы алгоритма на языке ДРАКОН дракон схемы ДРАКОН (Дружелюбный Русский Алгоритмический язык, Который Обеспечивает Наглядность) визуальный… … Википедия
Парадигмы программирования
3.1. Введение. Общие сведения о парадигмах
Общие сведения о парадигмах программирования
За те пятьдесят с небольшим лет, которые существует дисциплина: «программирование», — сменилось несколько поколений правил, концепций, моды, взглядов на то, как надо «писать программы». Все эти правила, концепции, взгляды, мода, наконец, позже назвали в информатике » парадигмами программирования «. Вот неполный список парадигм, вместе с датами их появления:
- 1957г., процедурная парадигма, язык ФОРТРАН, создатель Бэкус;
- 1967г., функциональная парадигма, язык ЛИСП , создатель Маккарти;
- 1970г., структурированная парадигма, язык ПАСКАЛЬ, создатель Вирт;
- 1974г., логическая парадигма, язык ПРОЛОГ;
- 1983г., объектно-ориентированная парадигма, пример — язык C++, создатель Страуструп.
В конце списка представлены языки программирования и их создатели, внесшие значительный вклад в популяризацию этих парадигм.
В процессе своего развития эти парадигмы «мутировали», «отпочковывались», «объединялись» (так, язык Си объединил в себе процедурную и структурированную парадигму). В результате этих » мутаций » по состоянию на 01.06.2008 года оформились следующие парадигмы программирования :
- Процедурная (или модульная) парадигма;
- Логическая парадигма;
- Объектно-ориентированная парадигма.
Эти три совершенно разные по подходу парадигмы составляют основу современного программирования. Хотя в настоящее время наиболее «модной» является объектно-ориентированная парадигма, остальные парадигмы также используются на практике и изучаются в ВУЗах. Их мы и рассмотрим ниже.
Кроме деления языков программирования по парадигмам, существует также деление языков на » императивные » и «декларативные».
Императивными называются такие языки программирования, в которых описываются в основном «инструкции» по пошаговому выполнению алгоритмов. Все внимание в них отводится лишь реализации этой последовательности действий, а данным и их структуре отводится второстепенная роль. Примером такого рода языков может служить языки создания драйверов устройств: Assembler и C++. При использовании этих языков мы не знаем, какие данные будет отправлять/получать устройство, но зато мы знаем, какие действия нужно осуществить над данными.
Декларативными называются языки программирования, в которых алгоритм работы с данными «зашит» в языке программирования, а сама программа представляет собой данные, упорядоченные и структурированные таким образом, что их легко обрабатывают «стандартные» алгоритмы вывода. В декларативных языках как бы «нет разницы» между данными и алгоритмом, их обрабатывающим. От «значения» данных, подаваемых на вход программы, зависит дальнейшее направление расчетов. Примерами декларативных языков могут служить языки: LISP и Prolog . И программа, и данные на языке ЛИСП представляют собой «списки» вместе с функциями, выполняемыми над ними. На языке ПРОЛОГ есть условное разделение программы на данные («факты») и код («правила», «продукции»). Но это разделение достаточно условно: и факты, и правила имеют одну и ту же форму записи.
Декларативные языки лучше всего использовать в случаях, когда «данные управляют программой»: при написании экспертных систем, при конструировании трансляторов с языков программирования, для большинства задач искусственного интеллекта. Именно там их использование приведет к наибольшей эффективности.
3.2. Процедурная парадигма
Эта парадигма является самой «древней» и, одновременно, — самой простой в реализации и обучении программирования. На основе этой парадигмы изучаются языки программирования в школе. И поэтому, вполне естественно, автор поставил ее на первое место .
3.2.1. История возникновения парадигмы
«Истоки» процедурной парадигмы программирования лежат в далеких 50-х годах прошлого века. После появления ЭВМ с архитектурой «фон Неймана» появилась возможность компьютеру «самому», без участия человека, проводить сложные вычисления. Эти годы и стали переломными в становлении профессии «программист». Чтобы произвести сложные вычисления, нужно сначала написать сложный алгоритм. Поскольку сложный алгоритм трудно реализовать в ЭВМ так же, как на калькуляторе, появилась необходимость в «записи» алгоритмов на более «понятном» человеку языке, чем язык машинных кодов ЭВМ. Так, вначале появился язык ассемблера, представляющий машинные коды в » удобочитаемом » виде.
В 1957 году Бэкус разработал первый язык высокого уровня: ФОРТРАН. Эта аббревиатура переводится как: » FORmula TRANslator», — переводчик формул. Как следует из его названия, его назначение — это числовые вычисления. С помощью этого языка можно было «кодировать» численные алгоритмы, не вдаваясь в архитектуру ЭВМ, количество регистров в ее процессоре, особенности ее функционирования, и другие, «не важные» для прикладного программиста вопросы. Вскоре, в начале 60-х годов прошлого века, появился язык: » COBOL «, — язык, предназначенный для коммерческих вычислений. Аббревиатура » COBOL » расшифровывается как: «COmmon Business Oriented Language» — «язык, ориентированный на общий бизнес».
В реализации этих языков была предусмотрена (как и в ассемблере) возможность «разбивки общего алгоритма» на несколько независимых модулей: «процедур». «Нанизывая» процедуры в основном модуле программы, как гирлянды на нитку, можно получить алгоритмы любой сложности. В этом и состоит преимущество процедурного программирования .
Таким образом, возникла «процедурная парадигма», гласящая:
«Реализацию алгоритмов вычислений необходимо создавать с помощью мелких, не зависимых друг от друга процедур, которые вызывают друг друга в соответствии с логикой программы».
Эта парадигма проста не только в «написании» алгоритма, но и его отладке: нужно убедиться в «работоспособности» каждого из модулей, что намного проще, чем отладка всего алгоритма целиком.
3.2.2. Языки, поддерживающие парадигму
Среди языков, поддерживающих процедурную парадигму программирования, используются следующие языки программирования:
- Ассемблер ;
- Фортран;
- Кобол;
- Алгол ;
- PL 1;
- Бейсик;
- Си;
- Паскаль;
- Perl;
- VB Script;
- Jscript ;
- Multi Edit Macro Script;
- MS-DOS Command Shell;
- NDOS Shell;
- Bash shell;
- tc shell;
- REXX ;
- язык SQL-запросов;
- и др.
Все они поддерживают создание «модулей» — функций и подпрограмм, которые разрабатываются и тестируются независимо, и осуществление «вызовов» между ними.
3.2.3. Представление программ и реализация вычислений
Прежде, чем передать код программы на обработку компилятору, программист должен соответствующим образом оформить код программы. В этом разделе даются общие правила оформления кода программы на разных языках программирования.
3.2.3.1. Quick Basic
В языке Quick Basic есть следующие правила оформления программ:
- Программа на языке Quick Basic находится в файле с расширением «*. bas «;
- Основная программа начинается с первого ее оператора;
- Желательно «нумеровать» все строки файла метками — натуральными числами. Нумерацию строк желательно начинать с числа 10 и задать шаг нумерации тоже 10;
- Заканчиваться вычисления в программе должны оператором: » STOP «;
- Завершаться описание всех алгоритмических конструкций в программе необходимо оператором: » END «;
- На каждый оператор выделяется одна строка;
- Комментарии к строкам алгоритма должны начинаться отдельной строкой, после ключевого слова: » REM «, которые указываются сразу после метки (или вместо метки);
- Подпрограммы на языке: «Quick Basic», оформляются отдельно, внутри файла;
- Оформление подпрограмм начинается с ключевого слова: » SUB «, за которым идет имя подпрограммы;
- Выполнение программы на языке «Quick Basic», открытой в его оболочке («qbasic.exe»), начинается после выбора меню: «Run» -> «Continue», или нажатием клавиши: «F5».
3.2.3.2. C/C++
На языке Си и, частично, С++, существуют следующие правила оформления программ:
- Программа на языке Си находится в файле с расширением: «*.c», а на языке C++ — с расширением «*. cpp «;
- Файлы с «заголовочной частью» к основной программе находятся в файлах с расширением «*.h» и «*.hpp»;
- Основная программа (которая затем будет запускаться по имени файла, например, «myprog.exe»), должна иметь имя и расширение «myprog.c». То есть, в общем случае, имя основного файла проекта — » .c» (для программ на Си) или » . cpp » (для программ на языке С++), где будет соответствовать имени Вашей программы после компиляции;
- Файл с программой начинается с включения (в заголовочной части) файлов с расширением «*.h» и «*.hpp», с помощью прагма оператора: » include «. При этом имена заголовочных файлов, находящихся в одном каталоге с файлами-описаниями алгоритма, заключаются в кавычки, а имена файлов, пути к которым прописаны в переменной операционной системы: » INCLUDE «, заключаются между знаками: » «, например:
- #include
- #include «myprog.h»
main( int argc, char *argv[], char *env[]) , где
- argc — число аргументов у функции. Эта переменная принимает значение 1 в случае отсутствия опций и параметров, 2 в случае присутствия одного параметра и т.п.;
- *argv[] — массив символьных переменных — указателей на опции и аргументы программы, запускаемой из командной строки. При этом элементу «0» соответствует полное путевое имя файла с запускаемой программой. Элементам с номерами: «1» — «argc-1» соответствуют аргументы программы, набранные в командной строке, с соответствующими номерами (по-порядку);
- *env[] — массив символьных переменных — указателей на системное окружение операционной системы, в которой запускается скомпилированная программа.
Подробнее о других аспектах программирования на C/C++ смотри: [31, 51, 92,78]
3.2.3.3. Perl
В языке Perl существуют следующие правила оформления программных модулей:
Процедурно-ориентированное программирование
В части II были представлены базовые компоненты языка С++: встроенные типы данных (int и double), типы классов (string и vector) и операции, которые можно совершать над данными. В части III мы увидим, как из этих компонентов строятся функции, служащие для реализации алгоритмов.
В каждой программе на С++ должна присутствовать функция main(), которая получает управление при запуске программы. Все остальные функции, необходимые для решения задачи, вызываются из main(). Они обмениваются информацией при помощи параметров, которые получают при вызове, и возвращаемых значений. В главе 7 представлен соответствующие механизмы С++.
Функции используются для того, чтобы организовать программу в виде совокупности небольших и не зависящих друг от друга частей. Она инкапсулирует алгоритм или набор алгоритмов, применяемых к некоторому набору данных. Объекты и типы можно определить так, что они будут использоваться в течение всего времени работы программы. Однако, если некоторые объекты или типы применяются только в части программы, предпочтительнее ограничить область их использования именно этой частью и объявить внутри той функции, где они нужны. Понятие видимости предоставляет в распоряжение программиста механизм, позволяющий ограничивать область применения объектов. Различные области видимости, поддерживаемые языком С++, мы рассмотрим в главе 8.
Для облегчения использования функций С++ предлагает множество средств, рассматриваемых нами в части III. Первым из них является перегрузка. Функции, которые выполняют семантически одну и ту же операцию, но работают с разными типами данных и потому имеют несколько отличающиеся реализации, могут иметь общее имя. Например, все функции для печати значений разных типов, таких, как int, string и т.д., называются print(). Поскольку программисту не приходится запоминать много разных имен для одной и той же операции, пользоваться ими становится проще. Компилятор сам подставляет нужное в зависимости от типов фактических аргументов. В главе 9 объясняется, как объявлять и использовать перегруженные функции и как компилятор выбирает подходящую из набора перегруженных.
Вторым средством, облегчающим использование функций, является механизм шаблонов. Шаблон — это обобщенное определение, которое используется для конкретизации — автоматической генерации потенциально бесконечного множества функций, различающихся только типами входных данных, но не действиями над ними. Этот механизм описывается в главе 10.
Функции обмениваются информацией с помощью значений, которые они получают при вызове (параметров), и значений, которые они возвращают. Однако этот механизм может оказаться недостаточным при возникновении непредвиденной ситуации в работе программы. Такие ситуации называются исключениями, и, поскольку они требуют немедленной реакции, необходимо иметь возможность послать сообщение вызывающей программе. Язык С++ предлагает механизм обработки исключений, который позволяет функциям общаться между собой в таких условиях. Этот механизм рассматривается в главе 11.
Наконец, стандартная библиотека предоставляет нам обширный набор часто используемых функций — обобщенных алгоритмов. В главе 12 описываются эти алгоритмы и способы их использования с контейнерными типами из главы 6 и со встроенными массивами.
Объектно-ориентированное программирование: на пальцах
Статья не мальчика, но мужа.
Настало время серьёзных тем: сегодня расскажем про объектно-ориентированное программирование, или ООП. Это тема для продвинутого уровня разработки, и мы хотим, чтобы вы его постигли.
Из этого термина можно сделать вывод, что ООП — это такой подход к программированию, где на первом месте стоят объекты. На самом деле там всё немного сложнее, но мы до этого ещё доберёмся. Для начала поговорим про ООП вообще и разберём, с чего оно начинается.
Обычное программирование (процедурное)
Чаще всего под обычным понимают процедурное программирование, в основе которого — процедуры и функции. Функция — это мини-программа, которая получает на вход какие-то данные, что-то делает внутри себя и может отдавать какие-то данные в результате вычислений. Представьте, что это такой конвейер, который упакован в коробочку.
Например, в интернет-магазине может быть функция «Проверить email». Она получает на вход какой-то текст, сопоставляет со своими правилами и выдаёт ответ: это правильный электронный адрес или нет. Если правильный, то true, если нет — то false.
Функции полезны, когда нужно упаковать много команд в одну. Например, проверка электронного адреса может состоять из одной проверки на регулярные выражения, а может содержать множество команд: запросы в словари, проверку по базам спамеров и даже сопоставление с уже известными электронными адресами. В функцию можно упаковать любой комбайн из действий и потом просто вызывать их все одним движением.
Что не так с процедурным программированием
Процедурное программирование идеально работает в простых программах, где все задачи можно решить, грубо говоря, десятком функций. Функции аккуратно вложены друг в друга, взаимодействуют друг с другом, можно передать данные из одной функции в другую.
Например, вы пишете функцию «Зарегистрировать пользователя интернет-магазина». Внутри неё вам нужно проверить его электронный адрес. Вы вызываете функцию «Проверить email» внутри функции «Зарегистрировать пользователя», и в зависимости от ответа функции вы либо регистрируете пользователя, либо выводите ошибку. И у вас эта функция встречается ещё в десяти местах. Функции как бы переплетены.
Тут приходит продакт-менеджер и говорит: «Хочу, чтобы пользователь точно знал, в чём ошибка при вводе электронного адреса». Теперь вам нужно научить функцию выдавать не просто true — false, а ещё и код ошибки: например, если в адресе опечатка, то код 01, если адрес спамерский — код 02 и так далее. Это несложно реализовать.
Вы залезаете внутрь этой функции и меняете её поведение: теперь она вместо true — false выдаёт код ошибки, а если ошибки нет — пишет «ОК».
И тут ваш код ломается: все десять мест, которые ожидали от проверяльщика true или false, теперь получают «ОК» и из-за этого ломаются.
Теперь вам нужно:
- либо переписывать все функции, чтобы научить их понимать новые ответы проверяльщика адресов;
- либо переделать сам проверяльщик адресов, чтобы он остался совместимым со старыми местами, но в нужном вам месте как-то ещё выдавал коды ошибок;
- либо написать новый проверяльщик, который выдаёт коды ошибок, а в старых местах использовать старый проверяльщик.
Задача, конечно, решаемая за час-другой.
Но теперь представьте, что у вас этих функций — сотни. И изменений в них нужно делать десятки в день. И каждое изменение, как правило, заставляет функции вести себя более сложным образом и выдавать более сложный результат. И каждое изменение в одном месте ломает три других места. В итоге у вас будут нарождаться десятки клонированных функций, в которых вы сначала будете разбираться, а потом уже нет.
Это называется спагетти-код, и для борьбы с ним как раз придумали объектно-ориентированное программирование.
Объектно-ориентированное программирование
Основная задача ООП — сделать сложный код проще. Для этого программу разбивают на независимые блоки, которые мы называем объектами.
Объект — это не какая-то космическая сущность. Это всего лишь набор данных и функций — таких же, как в традиционном функциональном программировании. Можно представить, что просто взяли кусок программы и положили его в коробку и закрыли крышку. Вот эта коробка с крышками — это объект.
Программисты договорились, что данные внутри объекта будут называться свойствами, а функции — методами. Но это просто слова, по сути это те же переменные и функции.
Объект можно представить как независимый электроприбор у вас на кухне. Чайник кипятит воду, плита греет, блендер взбивает, мясорубка делает фарш. Внутри каждого устройства куча всего: моторы, контроллеры, кнопки, пружины, предохранители — но вы о них не думаете. Вы нажимаете кнопки на панели каждого прибора, и он делает то, что от него ожидается. И благодаря совместной работе этих приборов у вас получается ужин.
Объекты характеризуются четырьмя словами: инкапсуляция, абстракция, наследование и полиморфизм.
Инкапсуляция — объект независим: каждый объект устроен так, что нужные для него данные живут внутри этого объекта, а не где-то снаружи в программе. Например, если у меня есть объект «Пользователь», то у меня в нём будут все данные о пользователе: и имя, и адрес, и всё остальное. И в нём же будут методы «Проверить адрес» или «Подписать на рассылку».
Абстракция — у объекта есть «интерфейс»: у объекта есть методы и свойства, к которым мы можем обратиться извне этого объекта. Так же, как мы можем нажать кнопку на блендере. У блендера есть много всего внутри, что заставляет его работать, но на главной панели есть только кнопка. Вот эта кнопка и есть абстрактный интерфейс.
В программе мы можем сказать: «Удалить пользователя». На языке ООП это будет «пользователь.удалить()» — то есть мы обращаемся к объекту «пользователь» и вызываем метод «удалить». Кайф в том, что нам не так важно, как именно будет происходить удаление: ООП позволяет нам не думать об этом в момент обращения.
Например, над магазином работают два программиста: один пишет модуль заказа, а второй — модуль доставки. У первого в объекте «заказ» есть метод «отменить». И вот второму нужно из-за доставки отменить заказ. И он спокойно пишет: «заказ.отменить()». Ему неважно, как другой программист будет реализовывать отмену: какие он отправит письма, что запишет в базу данных, какие выведет предупреждения.
Наследование — способность к копированию. ООП позволяет создавать много объектов по образу и подобию другого объекта. Это позволяет не копипастить код по двести раз, а один раз нормально написать и потом много раз использовать.
Например, у вас может быть некий идеальный объект «Пользователь»: в нём вы прописываете всё, что может происходить с пользователем. У вас могут быть свойства: имя, возраст, адрес, номер карты. И могут быть методы «Дать скидку», «Проверить заказ», «Найти заказы», «Позвонить».
На основе этого идеального пользователя вы можете создать реального «Покупателя Ивана». У него при создании будут все свойства и методы, которые вы задали у идеального покупателя, плюс могут быть какие-то свои, если захотите.
Идеальные объекты программисты называют классами.
Полиморфизм — единый язык общения. В ООП важно, чтобы все объекты общались друг с другом на понятном им языке. И если у разных объектов есть метод «Удалить», то он должен делать именно это и писаться везде одинаково. Нельзя, чтобы у одного объекта это было «Удалить», а у другого «Стереть».
При этом внутри объекта методы могут быть реализованы по-разному. Например, удалить товар — это выдать предупреждение, а потом пометить товар в базе данных как удалённый. А удалить пользователя — это отменить его покупки, отписать от рассылки и заархивировать историю его покупок. События разные, но для программиста это неважно. У него просто есть метод «Удалить()», и он ему доверяет.
Такой подход позволяет программировать каждый модуль независимо от остальных. Главное — заранее продумать, как модули будут общаться друг с другом и по каким правилам. При таком подходе вы можете улучшить работу одного модуля, не затрагивая остальные — для всей программы неважно, что внутри каждого блока, если правила работы с ним остались прежними.
Плюсы и минусы ООП
У объектно-ориентированного программирования много плюсов, и именно поэтому этот подход использует большинство современных программистов.
- Визуально код становится проще, и его легче читать. Когда всё разбито на объекты и у них есть понятный набор правил, можно сразу понять, за что отвечает каждый объект и из чего он состоит.
- Меньше одинакового кода. Если в обычном программировании одна функция считает повторяющиеся символы в одномерном массиве, а другая — в двумерном, то у них большая часть кода будет одинаковой. В ООП это решается наследованием.
- Сложные программы пишутся проще. Каждую большую программу можно разложить на несколько блоков, сделать им минимальное наполнение, а потом раз за разом подробно наполнить каждый блок.
- Увеличивается скорость написания. На старте можно быстро создать нужные компоненты внутри программы, чтобы получить минимально работающий прототип.
А теперь про минусы:
- Сложно понять и начать работать. Подход ООП намного сложнее обычного функционального программирования — нужно знать много теории, прежде чем будет написана хоть одна строчка кода.
- Требует больше памяти. Объекты в ООП состоят из данных, интерфейсов, методов и много другого, а это занимает намного больше памяти, чем простая переменная.
- Иногда производительность кода будет ниже. Из-за особенностей подхода часть вещей может быть реализована сложнее, чем могла бы быть. Поэтому бывает такое, что ООП-программа работает медленнее, чем функциональная (хотя с современными мощностями процессоров это мало кого волнует).
Что дальше
Впереди нас ждёт разговор о классах, объектах и всём остальном важном в ООП. Крепитесь, будет интересно!
Почему мы должны изучать процедурное программирование, прежде чем изучать объектно-ориентированное программирование [закрыто]
Сейчас я учусь на 4-м курсе в ИТ-университете, и когда я говорю с моим профессором на эту тему, он отвергает мое мнение и дает мне очень жесткую критику (в моем университете нас учили C (ANSI) (в классе процедурного программирования — в 1-м курсе в университете) до C ++ (в классе ООП в 2-м курсе) и другие .
Но в 13 лет я научил моего брата Java прежде всего. Теперь он может делать практически все, что может делать обычный студент 2-го курса с Java.
Для вас, профессионалов, я хотел бы знать, почему вы думаете, что мы должны сначала научиться процедурному программированию.
12 ответов
Краткое описание.
Потому что в реальном мире рано или поздно вам придется работать с процедурным кодом.
Потому что процедурные языки могут работать как расширение или введение в объектно-ориентированные языки, а не просто как альтернатива.
Дополнение к ответу 2. Потому что О.П. это сложнее, чем процедурное программирование, поэтому лучше сначала изучить процедурное программирование.
Поскольку в реальном мире программисты работают и объединяют несколько способов решения проблем, А.К.А. «мультипарадигмальное программирование», а не просто парадигма.
Большинство языков программирования являются мультипарадигмальными, на каком-то уровне, даже если их дизайнеры или обычные разработчики говорят обратное.
[NEW] Поскольку модульное программирование, которое обычно смешивается и путается с процедурным программированием, может применяться к O.O.P. Поэтому вопрос можно прочитать как «Почему мы должны изучать модульное программирование, прежде чем мы изучим объектно-ориентированное программирование»
Расширенное описание скучно:
Точка 1 очень ясна, дальнейших объяснений нет.
Точка 2, Классы, Наследование, Полиморфизм, Интерфейсы и т. д .
Пункт 3, я кодирую Процедурный Паскаль, прежде чем я изучил Объектно-ориентированный Паскаль, когда я туда попал, я сказал: «Послушайте, классы похожи на небольшие процедурные программы . . и вы можете заставить их говорить друг с другом, круто . ».
Я слышал то же самое от людей, которые перешли от простого C к C плюс плюс.
Пункт 4. В большинстве случаев программисты сочетают несколько методов программирования или парадигм или способов решения проблемы. Функциональный, процедурный, обычный, логический.
Даже Java «Pure O.O.» не такое простое объектное программирование, как говорится.
+1 балл за «процедурное программирование» вместо «структурное программирование». Или Модульное Программирование. Это важно.
Несмотря на то, что эти термины часто учат вместе и взаимозаменяемы, это не так. Структурированное программирование включает в себя множество концепций, а не просто использование процедур, и одна из них заставляет программу не выглядеть как «код спагетти».
Сегодня я прочитал несколько «чистых» О.О. программы, которые выглядят как «объектно-ориентированный код спагетти», это означает, что программист использовал O.O.P., но его код выглядит как беспорядок.
Много раз я могу читать О.О. код и скажите, что программист изучил структурированное программирование до O.O.P., потому что код понятен и упорядочен.
А для модульного программирования я видел несколько приложений. в C ++ и PHP, которые не используют модули. *
Я думаю, что аналогия будет похожа на математику. Вам нужно сначала изучить некоторые основные понятия (сложение / вычитание / . ), а затем перейти к более сложным темам (алгебра / исчисление). Процедурная программа очень линейна, и ее легче понять, когда вы изучаете синтаксис. ООП, возможно, считается более сложным, он основан на более простых конструкциях, используемых в процедурных языках, но является более абстрактным и более сложным для понимания. Начало работы с такими языками, как C, также приближает вас к аппаратному обеспечению и заставляет решать проблемы распределения памяти и указателей, которые вам необходимо понимать, но которые вы не можете использовать в таких языках, как Java / C #. В школе есть какая-то реальная ценность подвергаться этому независимо от того, идет ли он первым или вторым.
FWIW, он обязательно изменится в конце концов. Когда я пошел в школу, мы учились на Паскале и PL / 1. Мы не добрались до C, пока урок продвинутого языка (который встречается со мной). Я не изучал Java до аспирантуры — она еще не была изобретена!
Объектно-ориентированное программирование — это организованный сборник процедурных фрагментов. Я думаю, что урок, который вы изучаете, заключается в том, что объектно-ориентированная методология помогает поддерживать организацию и ремонтопригодность. Есть много программистов, которые не могут сделать это различие и будут утверждать, что их программы являются объектно-ориентированными, когда они более процедурны.
Вы не делаете.
Сначала мы изучили функциональное программирование с помощью Scheme. Затем мы перешли к процедурному, затем ООП и затем декларативному программированию. И верьте, хотите нет, хотя я уже знал программирование, я думаю, что на самом деле это было проще и для других людей: потому что FP — это точно так же, как математика! Так что вы уже знаете основы.
Я много раз обсуждал это с собой и в конечном итоге пришел к выводу, что это действительно зависит от того, насколько хорошо ваш учитель научит вас концепциям.
Единого ответа нет, потому что:
Начинать с чего-то процедурного, например C (или даже сборки), может быть хорошим выбором, потому что вы узнаете, как на самом деле работают компьютеры
Начинать с чего-то объектно-ориентированного Java может быть хорошим выбором, потому что его относительно легко изучить и применить ООП в реальной жизни, а также потому, что он учит вас ** формированию
Начинать с функционального программирования, такого как Scheme, может быть хорошим выбором, поскольку он учит вас думать более абстрактно (в терминах функций вместо переменных), что в конечном итоге делает вас лучшим программистом
Если ваш учитель не учит этому хорошо, то не имеет значения, с чего вы начинаете; они в значительной степени получатся одинаковыми.
Язык может быть объектно-ориентированным, как C ++, Java или C #. И вы можете начать с этих языков. Но дело в том, что даже с этими ОО-языками вы должны сначала изучить процедурное программирование, а затем ООП. Я думаю, вы сделали то же самое с вашим братом.
Процедурное программирование, по крайней мере, на языке, подобном C, расширяет возможности программирования до самых простых методов: алгоритмов и структур данных, а также на уровне абстракции, который является удачной средой между понятным для человека исходным кодом и кодом сборки.
Таким образом, учащиеся могут одновременно изучить немного науки (алгоритмы, структуры данных) и немного техники (машинная компиляция «источник-объект», архитектура фон-Неймана (вероятная)).
ООП через C ++ / obj-C вводит шаблон организации кода, который является еще одной вещью, которую нужно изучить. Это может усложнить изучение приведенных выше концепций.
ООП через Java (помимо прочего) идет еще дальше, абстрагируясь от оборудования и среды. Теперь базовый продукт — это не машинный код, а своего рода посредник, который не показывает, как работает базовое оборудование, но в результате он позволяет студенту сосредоточиться на шаблонах организации кода.
В конце концов, я думаю, что это компромисс между изучением работы аппаратного обеспечения и изучением шаблона организации кода. Что касается того, что более важно, я действительно не знаю. Реальный мир требует знания обоих, по крайней мере, в некоторой степени.
Я собираюсь предположить, что программа бакалавриата, которая начинается с низкоуровневого процедурного программирования, вероятно, производит компьютерных ученых / компьютерных инженеров, а программа, которая начинается с понятий более высокого уровня, производит инженеров-разработчиков / разработчиков / программистов.
Сущность объектов ООП состоит из процедурного программирования.
Если вы не можете сделать цикл for, используйте указатели правильно, объявите ваши типы и функции, вы не сможете писать интерфейсы для своих классов, тем более заставляете внутренности делать что-то стоящее.
В любом случае, вы бы действительно не изучали ООП во вводном классе, это был бы просто синтаксис — переход прямо в ООП усложнил бы понимание (на первый взгляд), чем он уже есть.
ООП не о каком-то объявлении синтаксиса для формирования классов, а о структурах данных, шаблонах проектирования, полиморфизме, наследовании и композиции.
Чтобы сделать все эти вещи, которые вам нужны для изучения процедурного программирования, что-то легко сделать в C. Вы можете перенести большинство всего, что вы узнали с помощью C, в Java или C ++, вам, возможно, придется переосмыслить некоторые вещи, которые вы считали само собой разумеющимся в C, НО . Вы должны знать грамматику (где вы находитесь во вводном C), чтобы писать предложения (должны писать процедуры для определения интерфейсов), затем параграфы (должны знать структуры данных) тогда и потом знать некоторые шаблоны проектирования (трагедия, комедия, ущербный герой, как они взаимодействуют; и когда их не использовать), прежде чем вы сможете написать законченные романы (полная система ООП).
На вашем месте я бы взял некоторые из следующих книг: Язык программирования C , Язык программирования Java , Шаблоны проектирования , Банда четырех и Выкройка шаблонов . Я бы определенно взял копию языка программирования C , если бы я серьезно относился к C / C ++.
Если вы просто хотите пройти весь путь до Java (и делаете это за $), найдите несколько книг по шаблонам проектирования Java и о том, как использовать Java с веб-серверами Apache и Tomcat, и несколько книг по программированию баз данных SQL. Java так много задевает в Интернете, извините, но у PHP была история с множеством дыр в безопасности, из-за которой Windows и задница доставляли такую же боль, как и Windows, чтобы не получить рутования вашего сервера или внедрения баз данных SQL.
Вы также должны уделить время изучению SQL, Oracle MySQL Postgresql и MSSQL имеют много общего в отношении синтаксиса, но если мне нужно было просто выбрать изучение одного для себя, то я выберу Postgresql только потому, что он лицензирован по BSD вместо GPL (вы должны посмотреть сравните и сопоставьте лицензии GPL / BSD тоже)