Все презентации к лекциям можно найти по ссылке github.com/is-oop-y27
В самом начале развития Computer Science код выглядел как-то так:
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
Наследование реализаций: используются классы, в C# одна структура не может быть унаследована от другой, либо от класса. Говорят, что класс является наследником другого класса, либо же его подклассом (класс
Catявляется наследником классаAnimal)
При этом наследники могут переопределять методы класса/интерфейса и определять новые
Объект - набор атрибутов и поведений, реализаций и данные которого сокрыты от конечного пользователя объекта. Также абстракция, представляющая какой-то объект моделируемой предметной области
Также выделяют композицию, агрегацию и ассоциацию1:
Несмотря на это, некоторые источники(1, 2, 3) говорят, что: