Языки и технологии программирования. Основные парадигмы программирования.

Сложность – мера усилий, требуемых для решения поставленной задачи.

Виды сложности:

количественная сложность – много букв;

сложность восприятия кода;

сложность изменения (гибкость) кода;

алгоритмическая сложность или интеллектуальная сложность;

структурная сложность - сложность архитектуры программы;

сложность обучения или порог вхождения;

сложность понимания поставленной задачи.

Чем сложнее код, тем сильнее усложняется каждый из этапов программирования. Для упрощения восприятия, существует два основных подхода:

    Алгоритмическая декомпозиция Объектно-ориентированная декомпозиция

Внесение порядка в хаос.

divide et impera  (разделяй и властвуй)

Юлий Цезарь

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

ООП использует в качестве базовых элементов  объекты, а не алгоритмы

каждый объект является экземпляром какого-либо определенного класса.

Классы организованы иерархически.

Объектно-ориентированные языки программирования должны поддерживать объекты, то есть абстракции  данных, имеющие интерфейс в виде  именованных операций и собственные данные, с  ограничением доступа к ним.

Объекты относятся к соответствующим типам  (классам).

НЕ нашли? Не то? Что вы ищете?

Типы (классы) могут наследовать атрибуты  супертипов (суперклассов).

Основные принципы объектной модели:

    Абстрагирование Инкапсуляция Модульность Иерархичность Типизация Параллелизм

Абстрагирование проявляется в нахождении сходств между определенными объектами,  ситуациями или процессами реального мира.

Абстракция выделяет существенные характеристики некоторого объекта, отличающие его от всех других видов объектов и, таким образом, четко определяет его концептуальные границы с точки зрения наблюдателя.

Примеры абстракций:

Датчик температуры

// Температура по Цельсию

typedef float Temperature;

class TemperatureSensor {

public:

       TemperatureSensor ();

       ~TemperatureSensor();

       void Сalibrate(Temperature actualTemperature);

       Temperature СurrentTemperature() const;

private:

...

};

Инкапсуляция  – это принцип, согласно которому  любой класс должен рассматриваться как чёрный  ящик — пользователь класса должен видеть и  использовать только интерфейсную часть класса и не вникать в его внутреннюю реализацию.

Инкапсуляция - это процесс отделения друг от друга элементов объекта, определяющих его устройство и поведение; инкапсуляция служит для того, чтобы изолировать контрактные обязательства абстракции от их реализации.

Пример инкапсуляции:

class SerialPort {

public:

       SerialPort();

       ~SerialPort();

       void Open();

       void Close();

       int Write(char*, int size);

       int Read(char*, int size);

private:

       char        portName[];

       bool        opened;

};

“Модульность - это разделение программы на фрагменты, которые компилируются по отдельности, но могут устанавливать связи с другими модулями«

Барбара Лисков

"Разделение программы на модули до некоторой степени позволяет уменьшить ее сложность... Однако гораздо важнее тот факт, что внутри модульной программы создаются множества хорошо определенных и документированных интерфейсов."

Скот Майерс

Иерархия – это упорядочение абстракций, расположение их по уровням.

Виды иерархических структур:

    структура классов (иерархия "is-a") одиночное наследование множественное наследование структура объектов (иерархия "part of")

Типизация – это способ защититься от использования объектов одного класса вместо другого, или, по крайней мере, управлять таким использованием.

Сохраняемость – способность объекта существовать во времени, переживая породивший его процесс, и (или) в пространстве, перемещаясь из своего первоначального адресного пространства.

Преимущества объектной модели:

    Объектная модель позволяет в полной мере использовать выразительные возможности объектных и объектно-ориентированных языков программирования. Использование объектного подхода существенно повышает уровень унификации разработки и пригодность для повторного использования не только программ, но и проектов. Объектная модель уменьшает риск разработки сложных систем. Объектная модель ориентирована на человеческое восприятие мира.

Выводы

Программам присуща сложность, которая нередко превосходит возможности человеческого разума.

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

Сложные структуры часто принимают форму иерархий; полезны обе иерархии: и классов, и объектов.

Познавательные способности человека ограничены; мы можем раздвинуть их рамки, используя декомпозицию, выделение абстракций и создание иерархий.

Объектно-ориентированный анализ и проектирование - метод, использующий объектную декомпозицию; объектно-ориентированный подход имеет свою систему условных обозначений и предлагает богатый набор логических и физических моделей, с помощью которых мы можем получить представление о различных аспектах рассматриваемой системы.