Файл: Анализ методов современного программирования ( Методики программирования ).pdf
Добавлен: 28.03.2023
Просмотров: 377
Скачиваний: 2
СОДЕРЖАНИЕ
Глава 1. Методики программирования
1.1 Методы систематического программирования
1.1.2 Объектно-ориентированный подход
1.1.4 Компонентное проектирование
1.1.5 Аспектно - ориентированное программирование
1.1.6 Генерирующее программирование
1.1.7 Агентное программирование
2.1. Теоретическое программирование
2.1.1 Алгебраическое программирование
2.1.2 Экспликативное программирование
2.1.3 Алгоритмическое программирование
Глава 2. Оптимизации программного кода
2.1. Основные принципы оптимизации кода
2.1.1. Выявление узких мест программы
2.1.2. Методы оптимизации программ
2.1.3. Параллельное программирование
2.2 Архитектура программных систем.
2.2.1 MVC (Model - View - Controller)
2.2.2 MVP (Model-View-Presenter)
2.2.3 MVVM (Model - View - ViewModel)
2.2.4 MVI (Model - View - Intent)
2.2.5 VIPER (View - Interactor - Presenter - Entity - Router)
2.1.3 Алгоритмическое программирование
Алгоритмическое программирование - структурная схемотология построения последовательных и параллельных программ с использованием алгебраических преобразований и стандартных форм описания логических и операторных выражений.
Основные понятия:
- операции над множествами, булевы операции, предикаты, функции и операторы
- бинарные и n-арные отношения, эквивалентность, частично и полностью упорядоченные множества
- граф-схемы и операции над графовыми структурами
- операции сигнатуры САА, аксиомы и правила вывода свойств программ на основе сверточной, разверточной и комбинированной стратегий
- символьная обработка и методы синтаксического анализа программ
Глава 2. Оптимизации программного кода
Оптимизация программного кода - различные методы преобразования кода ради улучшения его характеристик и повышения эффективности.
Основные принципы оптимизации кода:
- Естественность – код должен быть легко читабельным
- Производительность – увеличение быстродействия приложения
- Затраченное время – отладка должна занимать небольшой период времени
2.1. Основные принципы оптимизации кода
2.1.1. Выявление узких мест программы
Сначала выявляются узкие места программы. В первую очередь нужно обращать внимание на куски кода, которые выполняются регулярно в процессе работы.
Есть смысл оптимизировать код, если производительности или качества кода действительно не хватает для выполнения поставленной задачи, так как если все работает прекрасно, то оптимизация - лишняя трата ресурсов.
2.1.2. Методы оптимизации программ
- свертывание - оптимизация в компиляторах
- распространение констант – поиск постоянных значений и замена на эти значения. Например, было вместо вычисления в переменно, сразу будет результат.
- распространение копий – избавление от промежуточных значений. Например, от ненужных переменных.
- устранение – удаление неиспользуемого кода программы
Хороший оптимизирующий компилятор может повысить быстродействие кода на 40 и более процентов, тогда как многие из методик, используемых программистом вручную, только на 15-30%.
Необходимо проверить код на наличие устаревших или неиспользуемых фрагментов (устранение). Они могут использоваться и замедлять работу системы.
Необходимо изучить, где приложение работает медленнее всего или из-за какого участка кода может вылетать на определенных устройствах. Необходимо изучить код на ошибки и устранить их.
Иногда необходимо проверить настройки системы, возможно они настроены по стандарту или неверно и нужны некоторые корректировки.
Если используется язык Java, необходимо изучить и настроить работу виртуальной машины, это может увеличить производительность не только приложения, но и всей системы.
Для увеличения скорости работы приложения можно использовать подход сокращения ненужного кода (распространение копий). Вам нужно проанализировать, какие реализованные функции вашего приложения почти не используются пользователями и возможно стоит от них отказаться в пользу производительности.
2.1.3. Параллельное программирование
Процесс - это совокупность кода и данных, разделяющих общее виртуальное адресное пространство. Одна программа состоит из одного процесса. Процессы изолированы друг от друга и не имеют общий доступ к памяти друг друга.
Поток - это одна единица исполнения кода. Каждый поток последовательно выполняет инструкции процесса, независимо от других (при однопоточном программировании).
Параллельное программирование - адаптация алгоритмов, под программы для компьютерных систем с параллельной архитектурой. Обычно применяется при использовании многопроцессорных или многопоточных систем.
Каждый процесс имеет хотя бы один главный выполняющийся поток, с которого начинается выполнение программы.
При параллельном программировании увеличивается общая производительность работы программы, так как некоторые действия производятся параллельно, не мешая друг другу. Если нужно синхронизировать данные потоков, то используются специальные команды. Так же бывают случаи, когда потоки одновременно запрашивают данные у метода, тогда нужно выставить приоритет, кто будет иметь доступ к нему раньше, чтобы не было проблем с доступом. Так же бывают случаи, когда может случиться дедлок.
Дедлок - взаимная блокировка, которая происходит из-за цикличной зависимости потоков друг от друга.
Тема многопоточности довольно распространена на практике, так человечество накопило огромный пласт информации, которую нужно постоянно хранить и обрабатывать, и однопоточный приложений уже не справляются с этой задачей.
Ленивые или отложенные вычисления - метод заключается в том, что все расчеты откладываются до тех пор, пока не будет затребован их результат.
Это позволит снизить общий объем вычислений, так как ненужные операции не будут выполняться, когда не нужно пользователю.
Приближение - метод замены точного алгоритма на его приближенные значения, из-за чего теряется часть точности, зато мы получаем рост в производительности. Например, алгоритмы для вычисления координат GPS.
Нужно с умом подходить к выбору алгоритмов и конкретной метрике, однако сам метод может помочь с увеличением производительности.
Программа может медленно работать из-за того, что много времени занимает проверка типов, которая занимает дополнительное время. Чтобы избежать этого эффекта, можно применять фрагменты кода или модули, написанные на других языках. Однако это может создать уязвимости в безопасности, поэтому нужно тщательно протестировать код после.
2.2 Архитектура программных систем.
Архитектура - это организация системы программного обеспечения. Это набор компонентов системы, которые взаимодействую между собой через интерфейсы. Внутренние слои не должны знать о внешних.
Основные принципы построения архитектуры:
• Архитектура должна быть независима от различных фреймворков
• Система должна быть протестирована
• Независимость архитектуры от всего
Для построения архитектуры ПС, была изобретена четырехуровневая схема, где каждая окружность является определенным компонентом системы.
Схема состоит из следующих сущностей (начиная с внутреннего слоя):
• Бизнес-объекты (классы моделей с методами)
• Сценарии взаимодействия (основные методы для работы с системой)
• Слой представления (преобразование данных бизнес-объектов или сценариев взаимодействия в формат для работы системы)
• Фреймворки (конкретные инструменты для решения задач)
Так же для построения грамотной архитектуры используются паттерны проектирования и архитектурные паттерны.
Паттерн проектирования - это часто встречающееся решение определённой проблемы при проектировании архитектуры программ, что позволяет не «изобретать велосипед», а использовать готовый шаблон, проверенный многими специалистами.
Паттерн представляет общую концепцию решения проблемы. Для решения конкретной проблемы нужно использовать паттерн на конкретном языке программирования.
Существует 3 типа паттернов:
• Порождающие - отвечают за создание новых объектов или семейств объектов.
• Структурные - отвечают за построение удобных в поддержке иерархий классов.
• Поведенческие - решают задачи эффективного и безопасного взаимодействия между объектами программы.
Архитектурные паттерны - повторяемая архитектурная конструкция, представляющая собой решение проблемы проектирования, которая используют часть паттернов проектирования для создания архитектуры под определенную область деятельности (Рабочие компьютеры, Веб-сайты, Мобильные приложения), либо в рамках одной области.
Основные архитектурные паттерны:
• MVC (Model - View - Controller)
• MVP (Model – View - Presenter)
• MVVM (Model - View - ViewModel)
• MVI (Model - View - Intent)
• VIPER (View - Interactor - Presenter - Entity - Routing)
2.2.1 MVC (Model - View - Controller)
Model - предоставляет данные и реагирует на команды контроллера, изменяя своё состояние.
View - отвечает за отображение данных на экране пользователя.
Controller - интерпретирует действия пользователя, оповещая Model о необходимости изменений.
2.2.2 MVP (Model-View-Presenter)
Model - предоставляет данные и реагирует на команды Presentor’a.
View - отвечает за отображение данных Model пользователю, обращается к Presenter за обновлениями.
Presenter – является посредником между Model и View
Если пользователь нажал какой-либо элемент на экране устройства, то View сообщает об этом Presentor'у. View не просит Presenter загружать данные, она лишь уведомляет Presenter, что пользователь нажал элемент на экране. Дальше Presenter вызывает нужный метод, который должен сработать при нажатии на конкретный элемент. Если нужно, он так же запрашивает данные у Model и передает их во View, для отображения на экране, например, обновление счетчика при нажатии на кнопку на экране.
Если пользователь нажал какой-либо элемент на экране устройства, то View сообщает об этом Presentor'у.
View не просит Presenter загружать данные, она лишь уведомляет Presenter, что пользователь нажал элемент на экране. Дальше Presenter вызывает нужный метод, который должен сработать при нажатии на конкретный элемент. Если нужно, он так же запрашивает данные у Model и передает их уже View, для отображения на экране, например, обновление счетчика при нажатии на кнопку на экране.
Если View отображает данные из базы данных, то Model - это база данных. Presenter может подписаться на уведомления Model об обновлении. (паттерн: Наблюдатель).
Когда происходит обновление данных в БД, Model оповещает об этих изменениях Presenter. Presenter получает эти изменения и передает во View.
Presenter – это логика приложения, вынесенная из View в отдельный класс. View – отображает данные и взаимодействует с пользователем.
Если понадобиться создать еще несколько новых View, то можно будет воспользоваться готовым Presenter’ом.
Если нужно изменить саму логику приложения, то не нужно будет менять данные во View, вы меняете код в Presenter, либо можно создать новый Presenter и использовать его.
2.2.3 MVVM (Model - View - ViewModel)
Model - предоставляет данные и реагирует на команды ViewModel.
View - Представляет собой интерфейс, с которым взаимодействует пользователь на экране своего устройства.
ViewModel - объект, в котором описывается логика поведения View в зависимости от результата работы Model.
Компоненты MVVM не знаю друг о друге напрямую. Эти компоненты взаимодействуют между собой за счет механизма связывания данных (Bindings), который реализуется средствами той или иной системы.
При этом изменение данных во ViewModel автоматически меняет данные, отображаемые во View. Любое событие или изменение данных во View изменяет данные во ViewModel. Это позволяет держать эти компоненты очень слабо связными, что удобно при тестировании.
Data Binding - это фреймворк от Google, который позволяет выполнить связывание Java-кода и xml-файлов с помощью Binding-объекта. Можно полностью избавиться от работы со View в Java-коде.
С помощью Data Binding View в xml-разметке можно задать любые свойства, что скрывает некоторые детали реализации, однако это переполняет xml файл и не очень удобно при большом количестве Java-классов и переменных в xml.
2.2.4 MVI (Model - View - Intent)
Intent - метод, который принимает входные данные от пользователя (например, события пользовательского интерфейса) и переводит в то, что будет передано как параметр метода Model. Это может быть строка для установки значения Model или, объект.
Model - метод, который использует выходные данные из метода Intent в качестве входных данных для работы с Model. Результат работы - новая Model (с измененным состоянием). Все данные должны были неизменяемыми. Метод Model - часть кода, который создает новый объект модели.
View - Представляет собой интерфейс, с которым взаимодействует пользователь на экране своего устройства.