Разработка приложений на базе объектно-ориентированного программ. Контрольная работа на тему Эволюция методологий программирования. Парадигмы программирования по учебной дисциплине Разработка приложений на базе объектноориентированного программирования
Скачать 31.68 Kb.
|
Частное учреждение образовательная организация высшего образования "Омская гуманитарная академия" КОНТРОЛЬНАЯ РАБОТА на тему: Эволюция методологий программирования. Парадигмы программирования. по учебной дисциплине: Разработка приложений на базе объектно-ориентированного программирования
Омск, 2022 Введение Знаменитый гуру программирования Гради Буч в 2001 году сделал важное признание в статье Through the Looking Glass: «Я был неправ: все-таки есть нечто более глубокое, нечто поистине более богатое возможностями, чем объекты». Этими словами Буч представил аспектно-ориентированное программирование (АОП) — на тот момент новейшую парадигму программирования. История индустрии ПО началась с огромных машин и машинного кода — ни о чем не говорящих человеку рядов чисел, поэтому решение вычислительных задач с точки зрения проектирования и программирования было чрезвычайно трудоемким. Требовались простые, удобные механизмы абстракции для упрощения процессов моделирования и программирования. Машинные языки сменил ассемблер, который в 60-х — начале 70-х уступил место структурным и процедурным языкам, позднее вытесненным объектно-ориентированным с его принципами инкапсуляции, наследования и полиморфизма. Эволюция парадигм программирования происходила в связи с потребностью в разделении ответственности (separation of concerns): артефактов, концепций или особенностей, интересующих участников проекта разработки ПО. Зона ответственности может быть функциональной (например, добавление элемента к списку) или нефункциональной (например, быстродействие, безопасность и т. д.) либо относиться к этапам жизненного цикла разработки ПО, например к проектированию. Разделение ответственности остается главным принципом программной инженерии, а его основа — общеизвестный метод снижения сложности с помощью абстрагирования. Процедурные языки изолируют и абстрагируют зоны ответственности в виде процедур и функций, тогда как в объектно-ориентированных языках в качестве абстракций используются классы и объекты. Эволюция парадигм программирования закономерна и происходит по мере появления различных прагматических соображений, например, потребностей усовершенствования процессов моделирования, многократного использования или сопровождения ПО. Типичная программа представляет собой набор взаимосвязанных друг с другом компонентов (например, отвечающих за управление транзакциями), обычно имеющих взаимозависимости по тем или иным функциям. Такое взаимосоединение называется сквозной функциональностью (cross-cutting concern), и аспектно-ориентированное программирование занимается ее систематизацией, преобразованием в отдельные модули и их управлением. Основным инструментом АОП являются аспекты — модули, реализующие сквозную функциональность. На сегодня существует несколько аспектно-ориентированных языков и инструментов — например, AspectJ и PostSharp. С появлением АОП возникло немало вопросов о нужности и сферах применения новых парадигм, поэтому продуманный стандарт, предоставляющий логическую и систематизированную базу оценки и классификации парадигм, мог бы стать ценным подспорьем для участников разработки ПО. 1 Фундаментальные принципы эволюции парадигмЛюбая задача, которую можно решить с помощью какой-либо парадигмы программирования в иерархии из рисунка, должна быть решаемой с помощью остальных парадигм. Весь код должен преобразовываться в машинный, чтобы для каждой программы в любой парадигме с высоким уровнем абстракции существовала эквивалентная программа на машинном коде. Поскольку любую программу, составимую в машинном коде, также можно составить на ассемблере или процедурном языке, то можно утверждать эквивалентность всех программ в иерархии. Парадигмы в приведенной иерархии имеют слабую эквивалентность, то есть хотя они все позволяют вычислить одну и ту же функцию, делать это они могут по-разному. Принцип превосходства: Любая новая парадигма в иерархии должна превосходить предшественниц и предоставлять новые механизмы абстрагирования и программирования, которые удовлетворяют больше потребностей, чем предыдущие. Проиллюстрируем этот принцип примерами: управляющие структуры процедурного программирования превосходят регистры, команды адресации, флаги и всевозможные переходы, присущие программированию на ассемблере; процедуры и модули в процедурном программировании превосходят блоки кода в ассемблере; классы в объектно-ориентированном программировании превзошли структуры данных и процедуры, характерные для процедурного программирования; наследование и полиморфизм в ООП превзошли наборы процедур и механизмы вызова, свойственные процедурному программированию; аспекты в АОП превзошли разбросанный и запутанный код ООП; точки соединения (join point) и срезы (pointcut) в АОП абстрагируют статическое и динамическое связывание, а также другие особенности ООП. Место новой парадигмы программирования в иерархии зависит от уровня ее превосходства по сравнению с существующими. Принцип связанных абстракций. Любой очередной механизм абстрагирования или программирования, предоставляемый новой парадигмой, должен быть абстракцией одного или более механизмов непосредственной предшественницы этой парадигмы. Этот принцип иллюстрируется теми же примерами, что и принцип превосходства. Принцип ограниченной видимости. Новая парадигма программирования создается ради выполнения определенных потребностей, но круг этих потребностей ограничен свойственным авторам парадигмы пониманием текущих и будущих требований моделирования и написания кода. Предусмотреть можно далеко не все, поэтому слабости и недостатки различных методов обычно открываются лишь в повседневном использовании. Данный принцип иллюстрируют следующие примеры: структурное программирование, лишенное переходов, было изобретено, чтобы удовлетворить потребность в интеллектуальном и семантическом контроле над управляющими структурами (ассемблер не давал возможности ощутить преимущества программирования без Goto, инкапсуляции и процедурных абстракций); ограничения процедурного программирования были связаны с невозможностью признать классы, наследование и полиморфизм в качестве более удачных механизмов абстрагирования; объектно-ориентированному программированию были свойственны ограничения в связи с неспособностью осознать преимущества инкапсуляции сквозной функциональности. Данный принцип указывает на то, что для разработчиков языков нужна способность прогнозировать будущие требования программной инженерии. Принцип порога полезности У каждой парадигмы есть свой порог полезности, определенный типом задач, которые она позволяет решить. Этот порог достигается, когда задачи, для которых не подходят абстракции конкретной парадигмы, становятся серьезным препятствием к ее использованию. Этот принцип отвечает на два важных вопроса: как узнать, когда нужна новая, более мощная парадигма программирования, и каковы задачи, трудности и зоны ответственности, для которых конкретная парадигма не подходит? Следующие примеры иллюстрируют этот принцип: порог полезности для программирования на ассемблере был достигнут, когда на первый план вышли потребности переносимости, понятности и сопровождаемости кода; порог полезности процедурного программирования был достигнут, когда стала первоочередной потребность в уменьшении семантического пробела между задачами реального мира и программными моделями наряду с потребностью в инкапсуляции данных, а также в более развитых абстракциях для управления данными и алгоритмами; порог полезности ООП был достигнут, когда стала жизненно важной потребность в инкапсуляции и управлении запутанным и разбросанным кодом. Этот принцип не означает, что язык уже нельзя использовать после достижения им порога полезности: ряд языков (например, Кобол) прошли свои пороги, но по-прежнему применяются. Однако данный принцип указывает на маловероятность того, что новые программные проекты будут разрабатываться на каком-либо языке, уже прошедшем свой порог полезности. Принцип продления срока жизни Если парадигма программирования способна выполнять потребности помимо тех, для которых она была создана, а ее механизмы абстракции и программирования удовлетворяют потребностям, которые появились только у следующих поколений разработчиков, значит, эта парадигма превзошла свой срок жизни. Было бы идеальным, если бы каждая новая парадигма обладала существенно продленным сроком жизни — тогда появились бы гарантии большей преемственности и совместимости в моделировании и программировании, чем было достигнуто за последние несколько десятилетий. Принцип неизбежности сложностей Каждая новая парадигма программирования приносит с собой неизбежные сложности, связанные с переходом на новые механизмы абстракции и программирования. Этот принцип хорошо иллюстрируется проблемами, обнаруженными в предыдущих парадигмах, — например, с ООП связаны аномалии наследования, такие как «проблема йо-йо» (чрезмерная размытость сильно связанного кода — чем глубже наследование, тем сложней отследить поведение конечных классов) и трудности тестирования в контексте динамического связывания. Процедурное программирование создало проблемы, вызванные возможностью доступа к одной и той же области памяти через разные имена переменных, а во многих процедурных языках отсутствовала простая возможность выполнения низкоуровневых вычислений, стандартных для ассемблера. Заключение Грамотное, или литературное, программирование – это экстремальная технология самодокументируемого кода, предложенная знаменитым специалистом в вычислительной технике Дональдом Кнутом. Он написал книгу под этим названием, в которой и описал эту технологию (Knuth 92). Это радикальная альтернатива традиционной модели программирования, хотя некоторые считают, что период грамотного программирования был крупной неудачей в карьере Д. Кнута. Лежащая в основе идея проста: нужно писать не программу, а документ. Язык документации тесно привязан к языку программирования. Ваш документ в основном описывает то, что программируется, но при этом допускает компиляцию в нужную программу. Таким образом, исходный код – это документация, и наоборот. Из приведенных принципов можно сделать следующие выводы. Во-первых, студентов стоит приучать всегда решать задачи с помощью новых механизмов абстракции. Во-вторых, хорошей проверкой долговечности любой парадигмы или метода программирования является их ценность с точки зрения будущих поколений. Перечисленные принципы будут определять и дальнейшее развитие индустрии программирования. Список использованных источников Тузовский, А. Ф. Объектно-ориентированное программирование : учебное пособие для вузов / А. Ф. Тузовский. — Москва : Издательство Юрайт, 2022. — 206 с. Мегатренды: основные траектории эволюции мирового порядка в XXI веке : учебник / А. А. Байков, Э. Я. Баталов, А. В. Бирюков [и др.] ; под редакцией Т. А. Шаклеиной, А. А. Байкова. — 3-е изд. — Москва : Аспект Пресс, 2022. — 520 c. Золин, А. Г. Программирование на С++ : учебное пособие для СПО / А. Г. Золин, А. Е. Колоденкова, Е. А. Халикова. — Саратов : Профобразование, 2022. — 126 c. Логанов, С. В. Объектно-ориентированное программирование : учебное пособие для СПО / С. В. Логанов, С. Л. Моругин. — Саратов, Москва : Профобразование, Ай Пи Ар Медиа, 2022. — 215 c. Шорохова, С. П. Логика и методология научного исследования : учебное пособие / С. П. Шорохова. — Москва : Институт мировых цивилизаций, 2022. — 134 c. |