Все презентации к лекциям можно найти по ссылке 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) говорят, что: