Skip to content

ООП 02. Преимущества и недостатки структурного программирования. Идеи Энтони Хоара. Преимущества и недостатки объектно‐ориентированного программирования.

Dmitriy Pisarenko edited this page Sep 6, 2023 · 1 revision

Технология структурного программирования

Преимущества

  1. Логические ошибки исправляются на ранних стадиях разработки ПО.
  2. При таком подходе почти нет "кода в корзину".
  3. Начиная с самых ранних стадий идет взаимодействие с заказчиком.
  4. Можно объединять этапы кодирования, проектирования и тестирования (вести параллельно).
  5. Комплексная отладка - тесты можно писать до этапа проектирования на основе ТЗ. Также отладка облегчается за счёт того, что можно ставить заглушки (нисходящая разработка это позволяет).
  6. Удобное распределение работы между программистами.
  7. Из-за иерархической структуры (многоуровневой абстракции) возникают естественные контрольные точки за наблюдением за проектом - легко контролировать процесс.
  8. Локализация ошибок. (много уровней абстракции, легко выявить место)
  9. Вероятность невыполнения проекта (отказ) сводится к нулю.
  10. Повторное использование кода (выделяются библиотеки).
  11. Плавное распределение ресурсов (нагрузки) при разработке программного продукта. Нет аврала в конце проекта.
  12. Стандартизация - использование базовых логических структур

На начальном этапе используется иерархический подход (на этапе распределения ролей), а потом операционный(разработка).

Иерархический - порядок программирования и тестирования модулей определяется их расположением в схеме иерархии

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

Недостатки

  1. Сложность модификации: изменение уже написанного кода понижает его надёжность (плюс трата времени на разбор чужого кода).
  2. Добавление нового функционала доставляет много проблем
  3. Исключительные ситуации обрабатываются вперемешку с логикой задачи - это приводит к большому количеству проверок и необходимости "протаскивать" ошибку через весь код до того места, где её можно будет обработать
  4. Может возникать дублирование кода, от которого сложно избавиться
  5. Сложно распределять коды ошибок между программистами, если их несколько.

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

Итого: писать код - великолепно, модифицировать - проблемно.

Технология объектно-ориентированного программирования

Преимущества

  1. Все недостатки пусты перед тем, что мы можем легко модифицировать программу.
  2. Более гибкая система, код легче поддерживать -> возможность легкой модификации (при грамотном анализе и проектировании) -> увеличивается показатель повторного использования кода.
  3. Более "естественная" декомпозиция ПО, которая существенно облегчает разработку.
  4. Сокращение количества межмодульных вызовов и уменьшение объемов информации, передаваемой между модулями.

Недостатки

  1. Невозможность совмещения этапов проектирования, кодирования, тестирования (что в структурном возможно). Сначала нужно построить начальную модель, потом рекурсивный дизайн, то есть эту модель мы можем развивать.
  2. В структурном подходе (СП) порог вхождении очень низкий, то есть вы сразу может начать писать программу используя СП. А что касается ООП порог вхождения выше и это проблема, требуется более высокая классификация программиста.
  3. Программист и проектировщик, и кодировщик. Другие требования к квалификации.
  4. Размер кода резко возрастает - резко увеличивается время выполнения, объем необходимой памяти увеличивается. Гораздо больше времени тратится на проектирование. В структурном подходе лавинный вызов метода.
  5. В СП легко контролировать ресурсы и правила черного ящика (если какая-то функция не может выполниться она не должна захватывать ресурс, при возвращении ресурса ответственность переходит на вызывающую программу). Что касается ООП - задача разбивается на куски, например, если проблема с утечкой памяти, ее определили и выявили место где ошибка, то не всегда можно избавиться от утечки памяти. Раньше в ООП программах были с утечками, сейчас более менее нормально. В принципе с С11 есть механизмы борьбы с проблемами памятью - висящие указатели.
  6. Возникновение "мертвого кода" (использую Qt Design не все используется, какие-то классы, члены, методы, характеристики) при модификации. Это занимает место, висит в памяти. Борьба с мертвым кодом - компилируется только тот код, который вызывается.

В современных ЯП и в C++11 и выше проблема решена на уровне языка.

  1. Сложность распределения работ на начальном этапе.
  2. Из-за рекурсивного дизайна возникает мертвый код - тот, который написан, но не используется.

В современных ЯП проблема решена за счёт совмещения выполнения и компиляции программы, т.е. компилируется только то, что используется.

Не все недостатки технологии ООП перекрываются возможностью лёгкого изменения программы.

Идеи Энтони Хоара

Чарльз Хоар, в 1966 провёл лекции по совместному использованию записей, выделив, таким образом, базовые понятия ООП:

  1. Если в программе меняется данное, то в структурном подходе мы вынуждены выявить все места, где оно используется и внести изменения в написанный код. Вот прикиньте, какой это объем работы? В ООП мы выносим действие над данным! Это не связка с другими данными! Эта идея называется инкапсуляцией. Инкапсуляция - объединение данных и действий над данными. Работа с данными идет только через действие. Пример: работа со структурой File в Qt и других программах. Поля разные, а функции одинаковые.
    image

  2. Изменение кода - понижение надежности. Для модификации программных сущностей использовать при возможности надстройку над существующими сущностями. Это наследование - надстройка над тем, что существует (возможность сокрытия/добавления полей/функций). Хоар не выделял это как требование, оно утвердилось позже. Безразличие к тому, что представляет функционал - полиморфизм. Полиморфизм — это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.
    image

  3. Формирование понятия: данные + действия. Возможность изменения как самих данных, так и надстройки без изменения самих данных.

Перенос взаимодействия из физического мира в программу. Синхронное (accessорное) взаимодействие или асинхронное (событийное) взаимодействие. Синхронное взаимодействие - вызов метода (если объект), функции. Асинхронное взаимодействие - событие произошло, изменение объекта или его состояния произойдут со временем, на уровне ЯП реализовать невозможно. Поддержка должна быть на другом уровне. (Реализация на callback вызове) Сначала начали реализовывать операционные оболочки. Сейчас это поддерживается на уровне ОС.

Clone this wiki locally