Главная страница
Навигация по странице:

  • Информационная закрытость. Связность. Виды связности

  • Сцепление. Типы сцепления.

  • Тема 6 Основы работы с базами данных Специальные библиотеки.

  • Базовый синтаксис SQL.

  • Создание таблицы, работа с данными.

  • Python DB-API модули

  • Объектно-реляционное отображение (ORM)

  • лекции. Лекции по дисциплине _Разработка программных модулей_. Лекции на специальности спо базовой подготовки 09. 02. 07 Информационные системы и программирование 2 Содержание


    Скачать 0.77 Mb.
    НазваниеЛекции на специальности спо базовой подготовки 09. 02. 07 Информационные системы и программирование 2 Содержание
    Анкорлекции
    Дата29.09.2022
    Размер0.77 Mb.
    Формат файлаpdf
    Имя файлаЛекции по дисциплине _Разработка программных модулей_.pdf
    ТипЛекции
    #704300
    страница2 из 5
    1   2   3   4   5
    Тема 5 Модульный принцип разработки ПО.
    Основные критерии оптимизации модулей

    20
    Оптимизация программного кода — это модификация программ, выполняемая оптимизирующим компилятором или интерпретатором с целью улучшения их характеристик, таких как производительности или компактности, — без изменения функциональности.
    Поэтому возникает две задачи. Первая задача: подготовить такой набор тестов и применить к ним ПС, чтобы обнаружить в нем по возможности большее число ошибок. Однако чем дольше продолжается процесс тестирования (и отладки в целом), тем большей становится стоимость ПС.
    Отсюда вторая задача: определить момент окончания отладки ПС (или отдельной его компоненты). Признаком возможности окончания отладки является полнота охвата пропущенными через ПС тестами (т.е. тестами, к которым применено ПС) множества различных ситуаций, возникающих при выполнении программ ПС, и относительно редкое проявление ошибок в ПС на последнем отрезке процесса тестирования.
    Для каждого модуля, подвергаемого тестированию, разрабатывается тестовое окружение, включающее в себя драйвер и заглушки, готовятся тест- требования и тест-планы, описывающие конкретные тестовые примеры.
    Основная цель модульного тестирования – удостовериться в соответствии требованиям каждого отдельного модуля системы перед тем, как будет произведена его интеграция в состав системы. При этом в ходе модульного тестирования решаются четыре основные задачи.
    1. Поиск и документирование несоответствий требованиям – это классическая задача тестирования, включающая в себя не только разработку тестового окружения и тестовых примеров, но и выполнение тестов, протоколирование результатов выполнения, составление отчетов о проблемах.
    2. Поддержка разработки и рефакторинга низкоуровневой архитектуры системы и межмодульного взаимодействия. Даже при классической схеме тестирования модульные тесты могут выявить проблемы в дизайне системы и нелогичные или запутанные механизмы работы с модулем.

    21 3. Поддержка рефакторинга модулей – эта задача связана с поддержкой процесса изменения системы. Достаточно часто в ходе разработки требуется проводить рефакторинг модулей или их групп – оптимизацию или полную переделку программного кода с целью повышения его сопровождаемости, скорости работы или надежности.
    4. Поддержка устранения дефектов и отладки — эта задача сопряжена с обратной связью, которую получают разработчики от тестировщиков в виде отчетов о проблемах. Подробные отчеты о проблемах, составленные на этапе модульного тестирования, позволяют локализовать и устранить многие дефекты в программной системе на ранних стадиях ее разработки или разработки ее новой функциональности.
    Информационная закрытость. Связность. Виды связности
    Принцип информационной закрытости утверждает: содержание модулей должно быть скрыто друг от друга. Модуль должен определяться и проектироваться так, чтобы его содержимое (процедуры и данные) было недоступно тем модулям, которые не нуждаются в такой информации
    (клиентам).
    Информационная закрытость означает следующее:
    1) все модули независимы, обмениваются только информацией, необходимой для работы;
    2) доступ к операциям и структурам данных модуля ограничен.
    Достоинства информационной закрытости:
     обеспечивается возможность разработки модулей различными, независимыми коллективами;
     обеспечивается легкая модификация системы (вероятность распространения ошибок очень мала, так как большинство данных и процедур скрыто от других частей системы).

    22
    Идеальный модуль играет роль «черного ящика», содержимое которого невидимо клиентам. Он прост в использовании — количество «ручек и органов управления» им невелико (аналогия с эксплуатацией телевизора).
    Его легко развивать и корректировать в процессе сопровождения программной системы. Для обеспечения таких возможностей система внутренних и внешних связей модуля должна отвечать особым требованиям.
    Связность модуля (Cohesion) — это мера зависимости его частей. Связность
    — внутренняя характеристика модуля. Чем выше связность модуля, тем лучше результат проектирования, то есть тем «черней» его ящик (капсула, защитная оболочка модуля), тем меньше «ручек управления» на нем находится и тем проще эти «ручки».
    Для измерения связности используют понятие силы связности (СС).
    Существует 7 типов связности:
    1. Связность по совпадению (СС=0). В модуле отсутствуют явно выраженные внутренние связи.
    2. Логическая связность (СС=1). Части модуля объединены по принципу функционального подобия. Например, модуль состоит из разных подпрограмм обработки ошибок. При использовании такого модуля клиент выбирает только одну из подпрограмм.
    Недостатки: сложное сопряжение; большая вероятность внесения ошибок при изменении сопряжения ради одной из функций.
    3. Временная связность (СС=3). Части модуля не связаны, но необходимы в один и тот же период работы системы.
    Недостаток: сильная взаимная связь с другими модулями, отсюда — сильная чувствительность внесению изменений.
    4. Процедурная связность (СС=5). Части модуля связаны порядком выполняемых ими действий, реализующих некоторый сценарий поведения.
    5. Коммуникативная связность (СС=7). Части модуля связаны по данным
    (работают с одной и той же структурой данных).

    23 6. Информационная (последовательная) связность (СС=9). Выходные данные одной части используются как входные данные в другой части модуля.
    7. Функциональная связность (СС=10). Части модуля вместе реализуют одну функцию.
    Сцепление. Типы сцепления.
    Сцепление модулей - это мера относительной независимости модулей.
    Слабое сцепление определяет высокий уровень независимости модулей.
    Модули являются полностью независимыми, если каждый из них не содержит о другом никакой информации. Чем больше информации о другом модуле в них используется, тем менее они независимы и тем более сцеплены.
    Независимое сцепление возможно, если модули не вызывают друг друга и не обрабатывают одну и ту же информацию.
    Модули сцеплены по данным, если они имеют общие простые элементы данных, которые передаются от одного модуля к другому как параметры. (пр, структура – массив, а передается в качестве параметра элемент массива; при этом изменения в структуре данных не повлияют на другой модуль). Модули со сцеплением по данным не имеют общей области данных (глобальных переменных).
    Модули сцеплены по образцу, если в качестве параметров используются структуры данных (например, в качестве параметра передается массив). Недостаток: оба модуля должны содержать информацию о другом модуле (внутренней структуре данных), т.е изменения должны отображаться и в др. модуле.
    Модули сцеплены по общей области, если они разделяют одну и ту же глобальную структуру данных.
    Модули сцеплены по управлению, если какой-либо из них управляет решениями внутри другого с помощью передачи флагов, переключателей и т.д.

    24
    Модуль сцеплен по внешним ссылкам, если у него есть доступ к данным другого модуля через внешнюю точку входа.
    Модули сцеплены по кодам, если коды их команд объединены друг с другом, используют общий участок памяти. Если модули косвенно обращаются друг к другу (ч/з другие модули), то между ними также существует сцепление.
    Сцепление модулей зависит от спроектированной структуры данных и способов взаимодействия между модулями. Необходимо использовать простые параметры и не применять глобальных данных
    Тема 6 Основы работы с базами данных
    Специальные библиотеки.
    Многие языки программирования имеют встроенные средства взаимодействия с СУБД, однако, другие требуют сторонних пакетов.
    Рассмотрим SQL‑библиотеки Python, которые для этого можно использовать:
    SQLite, MySQL и PostgreSQL.
    SQLite, вероятно, самая простая база данных, к которой можно подключиться из приложения Python и для этого нет необходимости подключать внешние модули. По умолчанию установка Python содержит
    SQL‑библиотеку с именем sqlite3, которую мы можем использовать для работы с SQLite.
    Более того, базы данных SQLite являются безсерверными и автономными, поскольку они читают и записывают данные в файл. Это означает, что, в отличие от MySQL и PostgreSQL, не нужно устанавливать и запускать сервер для выполнения операций с базой данных SQLite.
    В отличие от SQLite для подключения к базе данных MySQL требуется дополнительный модуль и нужно установить драйвер Python SQL. Одним из таких драйверов является mysql-connector-python. Можно загрузить этот модуль Python SQL с помощью pip:

    25
    $ pip install mysql-connector-python
    Обратите внимание, что MySQL является серверной системой управления базами данных. Один сервер MySQL может иметь несколько баз данных. В отличие от SQLite, где создание соединения равносильно созданию базы данных, база данных MySQL имеет двухступенчатый процесс создания базы данных:
     Установите соединение с сервером MySQL.
     Выполните отдельный запрос, чтобы создать базу данных.
    В библиотеке SQL Python, как и для MySQL нет функций, которые можно использовать для работы с базой данных PostgreSQL. Вместо этого нужно установить сторонний драйвер SQL для взаимодействия с PostgreSQL. Одним из таких драйверов SQL для PostgreSQL является psycopg2.
    Базовый синтаксис SQL.
    Подмножества языка SQL:
    ● Язык DDL (Data Definition Language) служит для создания и модификации структуры БД, т.е. для создания/изменения/удаления таблиц и связей.
    ● Язык DML (Data Manipulation Language) позволяет осуществлять манипуляции с данными таблиц, т.е. с ее строками. Он позволяет делать выборку данных из таблиц, добавлять новые данные в таблицы, а также обновлять и удалять существующие данные.
    ● Язык DCL (Transaction Control Language) предназначен для осуществления административных операций, присваивающих или отменяющих право
    (привилегию) использовать базу данных, таблицы и другие объекты базы данных, а также выполнять те или иные операторы SQL.
    ● Язык TCL (Transaction Control Language) - используется для обработки транзакций.
    В соответствии подмножеством языка SQL, операторы SQL делятся на:
    ● операторы определения данных (DDL):

    26
    ○ CREATE создаёт объект базы данных (саму базу, таблицу, представление, пользователя и так далее),
    ○ ALTER изменяет объект,
    ○ DROP удаляет объект;
    ● операторы манипуляции данными (DML):
    ○ SELECT выбирает данные, удовлетворяющие заданным условиям,
    ○ INSERT добавляет новые данные,
    ○ UPDATE изменяет существующие данные,
    ○ DELETE удаляет данные;
    ● операторы определения доступа к данным (DCL):
    ○ GRANT предоставляет пользователю (группе) разрешения на определённые операции с объектом,
    ○ REVOKE отзывает ранее выданные разрешения,
    ○ DENY задаёт запрет, имеющий приоритет над разрешением;
    ● операторы управления транзакциями (TCL):
    ○ COMMIT применяет транзакцию,
    ○ ROLLBACK откатывает все изменения, сделанные в контексте текущей транзакции,
    ○ SAVEPOINT делит транзакцию на более мелкие участки.
    SELECT - Возвращает строки из базы данных и позволяет делать выборку одной или нескольких строк или столбцов из одной или нескольких таблиц.
    Базовый синтаксис команды:
    SELECT [DISTINCT] список_столбцов или *
    FROM источник
    WHERE фильтр
    ORDER BY выражение_сортировки
    Создание таблицы, работа с данными.

    27
    Для установки соединения нужно указать название базы данных, к которой требуется подключиться. Если указать название той, что уже есть на диске, то произойдет подключение. Если же указать другое, то SQLite создаст новую базу данных.
    Для подключения к SQLite нужно выполнить следующие шаги:
     Использовать метод connect() из модуля sqlite3 и передать в качестве аргумента название базы данных.
     Создать объект cursor с помощью объекта соединения, который вернул прошлый метод для выполнения SQLite-запросов из Python.
     Закрыть объект cursor после завершения работы.
     Перехватить исключение базы данных, если в процессе подключения произошла ошибка.
    Понимание SQLite-подключения в подробностях import sqlite3
    Эта строка импортирует в программу модуль sqlite3. С помощью классов и методов из этого модуля можно взаимодействовать с базой данных SQLite. sqlite3.connect()
    С помощью метода connect() выполняется подключение к базе данных. Этот метод возвращает объект подключения SQLite. Объект connection не является потокобезопасным. Модуль sqlite3 не позволяет делиться подключением между потоками. Если попытаться сделать это, то можно получить исключение.
    Метод connect() принимает разные аргументы. В этом примере передается название базы данных. cursor=sqliteConnection.cursor()
    С помощью объекта соединения создается объект cursor, который позволяет выполнять SQLite-запросы из Python.
    Для одного соединения можно создать неограниченное количество cursor. Он также не является потокобезопасным. Модуль не позволяет делиться объектами cursor между потоками. Если это сделать, то будет ошибка.

    28
    После этого создается запрос для получения версии базы данных. cursor.execute()
    С помощью метода execute объекта cursor можно выполнить запрос в базу данных из Python. Он принимает SQLite-запрос в качестве параметра и возвращает resultSet — то есть, строки базы данных
    Получить результат запроса из resultSet можно с помощью методов, например, fetchAll() cursor.close() и connection.close()
    Хорошей практикой считается закрывать объекты connection и curosor после завершения работы, чтобы избежать проблем с базой данных.
    Шаги для создания таблицы в SQLite с помощью Python:
     Соединиться с базой данных с помощью sqlite3.connect().
     Подготовить запрос создания таблицы.
     Выполнить запрос с помощью cursor.execute(query).
     Закрыть соединение с базой и объектом cursor.
    Типы данных SQLite:
    NULL — значение NULL
    INTEGER — числовые значения. Целые числа хранятся в 1, 2, 3, 4, 6 и 8 байтах в зависимости от величины
    REAL — числа с плавающей точкой, например, 3.14, число Пи
    TEXT — текстовые значения. Могут храниться в кодировке UTF-8, UTF-
    16BE или UTF-16LE
    BLOB — бинарные данные. Для хранения изображений и файлов
    Python DB-API модули
    Несмотря на стандарт SQL (ISO/IEC 9075), отдельные СУБД имеют много различий. Чтобы программистам не вникать в реализацию каждой из них, придумали общее API, скрывающее эти детали. Вынесенная в заголовок аббревиатура объединяет два понятия: DB (Database, база данных) и API
    (Application Program Interface, интерфейс прикладной программы).

    29
    Таким образом, DB-API определяет интерфейс прикладной программы с базой данных. Этот интерфейс должны реализовывать все модули расширения, которые служат для связи Python-программ с базами данных.
    Единый API (в настоящий момент его вторая версия) позволяет абстрагироваться от марки используемой базы данных, при необходимости довольно легко менять одну СУБД на другую, изучив всего один набор функций и методов.
    DB API 2.0 регламентирует интерфейсы модуля расширения для работы с базой данных, методы объекта-соединения с базой, объекта-курсора текущей обрабатываемой записи, объектов различных для типов данных и их конструкторов, а также содержит рекомендации для разработчиков по реализации модулей. На сегодня Python поддерживает через модули расширения многие известные базы данных.
    Доступ к базе данных осуществляется с помощью объекта-соединения
    (connection object). DB-API-совместимый модуль должен предоставлять функцию-конструктор connect() для класса объектов-соединений.
    Конструктор должен иметь следующие именованные параметры:
     dsn Название источника данных в виде строки
     user Имя пользователя
     password Пароль
     host Адрес хоста, на котором работает СУБД
     database Имя базы данных.
    Модуль определяет константы, содержащие его основные характеристики:
     apilevel Версия DB-API ("1.0" или "2.0").
     threadsafety Целочисленная константа, описывающая возможности модуля при использовании потоков управления:
     0 Модуль не поддерживает потоки.
     1 Потоки могут совместно использовать модуль, но не соединения.
     2 Потоки могут совместно использовать модуль и соединения.

    30
     3 Потоки могут совместно использовать модуль, соединения и курсоры. (Под совместным использованием здесь понимается возможность использования упомянутых ресурсов без применения семафоров).
     paramstyle Тип используемых пометок при подстановке параметров.
    Возможны следующие значения этой константы:
     "format" Форматирование в стиле языка ANSI C (например, "%s",
    "%i" ).
     "pyformat" Использование именованных спецификаторов формата в стиле Python ( "%(item)s" )
     "qmark" Использование знаков "?" для пометки мест подстановки параметров.
     "numeric" Использование номеров позиций ( ":1" ).
     "named" Использование имен подставляемых параметров ( ":name" ).
    Модуль должен определять ряд исключений для обозначения типичных исключительных ситуаций: Warning (предупреждение), Error (ошибка),
    InterfaceError (ошибка интерфейса), DatabaseError (ошибка, относящаяся к базе данных). А также подклассы этого последнего исключения: DataError
    (ошибка обработки данных), OperationalError (ошибка в работе или сбой соединения с базой данных), IntegrityError (ошибка целостности базы данных), InternalError (внутренняя ошибка базы данных), ProgrammingError
    (программная ошибка, например, ошибка в синтаксисе SQL-запроса),
    NotSupportedError (при отсутствии поддержки запрошенного свойства).
    Объектно-реляционное отображение (ORM)
    ORM или Object-relational mapping (рус. Объектно-реляционное отображение) — это технология программирования, которая позволяет преобразовывать несовместимые типы моделей в ООП, в частности, между хранилищем данных и объектами программирования. ORM используется для упрощения процесса сохранения объектов в реляционную базу данных и их

    31 извлечения, при этом ORM сама заботится о преобразовании данных между двумя несовместимыми состояниями. Большинство ORM-инструментов в значительной мере полагаются на метаданные базы данных и объектов, так что объектам ничего не нужно знать о структуре базы данных, а базе данных
    — ничего о том, как данные организованы в приложении. ORM обеспечивает полное разделение задач в хорошо спроектированных приложениях, при котором и база данных, и приложение могут работать с данными каждый в своей исходной форме.
    Использование ORM решает проблему так называемой парадигмы
    «несоответствия», которая гласит о том, что объектные и реляционные модели не очень хорошо работают вместе. Реляционные базы представляют данные в табличном формате, в то время как объектно-ориентированные языки представляют их как связанный граф объектов.
    Основные проблемы и несоответствия возникают во время сохранения этого графа объектов в реляционную базу или его загрузки:
     реляционная модель может быть намного детальнее, чем объектная, т.е. для хранения одного объекта в реляционной базе данных используется несколько таблиц;
     реляционные СУБД не имеют ничего похожего на наследование — естественную парадигму объектно-ориентированных языков программирования;
     в СУБД определен только один параметр для сравнения записей — первичный ключ. В то время как ООП предоставляет как проверку идентичности объектов (a==b), так и их равенства (a.equals(b));
     для связи объектов СУБД использует понятие внешних ключей, в объектно-ориентированных языках связь между объектами может быть только однонаправленной. Если же нужно организовать двунаправленные отношения, то придется определить две однонаправленные ассоциации.
    Ключевой особенностью ORM является отображение, которое используется для привязки объекта к его данным в БД. ORM как бы создает

    32
    «виртуальную» схему базы данных в памяти и позволяет манипулировать данными уже на уровне объектов. Отображение показывает, как объект и его свойства связанны с одной или несколькими таблицами и их полями в базе данных. ORM использует информацию этого отображения для управления процессом преобразования данных между базой и формами объектов, а также для создания SQL-запросов для вставки, обновления и удаления данных в ответ на изменения, которые приложение вносит в эти объекты.
    1   2   3   4   5


    написать администратору сайта