Все презентации к лекциям можно найти по ссылке github.com/is-oop-y27
В самом начале развития компьютерных наук и программирования код выглядел как-то так:
VAR i
SET i 1
PRINT i
INC i
JIFLS i 10 2
Такой код писался на языке ассемблера, который в те времена был уникален под почти каждый процессор. Язык ассемблера использовал базовые команды, такие как “прибавить два числа” или “прыгнуть по заданному адресу”, которые напрямую переводились в понятные процессору инструкции
Писать на языке ассемблера было очень неудобно, поэтому придумали структурное программирование:
for (var i = 1; i < 10; i++)
{
Console.WriteLine(i);
}
Его отличие в том, что поток управления программы теперь определяется с помощью циклов и условных выражений. Но при увеличении кода стало неудобно и это, поэтому придумали функции и процедурное программирование - разбиение кода на маленькие независимые участки (функции и модули). Но вскоре появилась надобность разделять бизнес-логику, данные и сохранять инвариант данных - набор корректных состояний данных, определяемый набором бизнес-требований к этим данным
Поэтому появилась парадигма объектно-ориентированное программирование
Выделяют 3 основных концепции ООП:
Инкапсуляция - объединение данных и их поведения в один класс
Сокрытие - управление доступа к полям класса, тем самым сохранение инварианта
Стоит заметить, что сокрытие не является основной концепцией ООП, так как сокрытие необязательно в языках с объектно-ориентированной парадигмой, например, Python
Полиморфизм - это отделение абстракции от реализации, позволяющее пользователю прозрачно использовать различные реализации поведений
Концепция полиморфизма заключается в более абстрактном понимании объектов
Примером абстракции может быть объект для доступа к базе данных - мы можем создать классы для доступа к базам данным SQL и NoSQL, которые имеют одни и те же публичные методы с одинаковыми аргументами - и тогда мы приходим к понятию интерфейса, который описывает одинаковые методы у классов, имеющих разную логику, но одинаковое поведение
Наследование
Реализация интерфейса (то есть наследование поведений) - это механизм, при котором класс предоставляет конкретную реализацию всех методов, свойств и событий, объявленных в интерфейсе. Интерфейс задаёт только контракт (какие данные должен метод принять и какие вернуть), но не содержит реализации
В C# реализовывать интерфейсы могут как классы, так и структуры. Если класс Point реализует интерфейс IPoint, то говорят, что тип реализует интерфейс
Наследование реализаций - это механизм, при котором один класс (его называют дочерним или производным) наследует поля, свойства, методы и другую реализацию от другого класса (его называют родительским или базовым). Производный класс может дополнять или переопределять поведение базового класса
Также говорят, что класс является наследником другого класса, либо же его подклассом, например, класс Cat является наследником класса Animal
Объект - набор атрибутов и поведений, реализаций и данные которого сокрыты от конечного пользователя объекта. Также объект - это абстракция, представляющая какой-то объект моделируемой предметной области
Также выделяют композицию, агрегацию и ассоциацию:
Источники: https://www.infoworld.com/article/2243500/exploring-association-aggregation-and-composition-in-oop.html, https://itsobes.com/ru/it/v-chem-raznica-mezhdu-agregaciej-kompoziciej-i-associaciej/, https://www.geeksforgeeks.org/association-composition-aggregation-java/
Таким образом, подведем итоги: