Объектно-ориентированное программирование (ООП): Мыслить в объектах!

Прежде чем начать изучение языка C#, попробуем разобраться немного в теории ООП. За семь десятилетий использования компьютеров существенно поменялась парадигма программирования (совокупность идей и понятий, определяющих стиль написания компьютерных программ).
Все начиналось с императивного программирования (языки машинных команд, Ассемблер, Алгол, Фортран, Бейсик, Паскаль, С, Ада), когда данные и операторы рассматривались отдельно. В 21 веке вам предлагается мыслить в стиле ООП, основным понятием которого являются объекты.
Считается, что главной причиной смены парадигмы программирования явились возросшие объемы и сложность современных программ и программных комплексов.

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

Все основанные на объектах языки (C#, Java, С++, Smalltalk, Visual Basic и т.п.) отвечают трем основным принципам объектно-ориентированного программирования, которые перечислены ниже:
Инкапсуляция отвечает на вопрос: Как данный язык скрывает детали внутренней реализации объектов и предохраняет целостность данных?
Наследование определяет: Как данный язык стимулирует многократное использование кода?
Полиморфизм поясняет: Как данный язык позволяет трактовать связанные объекты сходным образом?

Обсудим каждый принцип по отдельности.

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

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

Например, предположим, что используется класс по имени Math, содержащий две константы и несколько методов вычисления математических функций. Класс Math прячет внутренние детали всех вычислений. Нет необходимости беспокоиться о многочисленных строках кода, которые работают «за кулисами». Все, что требуется, это вызвать необходимую константу или математическую функцию: Math.PI (число пи), Math.Sin(x), Math.Abs(x) или Math.Min(x,y).

С идеей инкапсуляции программной логики тесно связана идея защиты данных. В идеале данные состояния объекта должны быть специфицированы с использованием ключевого слова private (или, возможно, protected – для последующего наследования). Таким образом, объекты других классов должны попросить, если захотят изменить или получить лежащее в основе значение. Это хороший принцип, поскольку общедоступные элементы данных можно легко повредить (даже нечаянно, а не преднамеренно).

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

Код и данные, составляющие вместе класс, называют членами. Данные, определяемые классом, называют полями, или переменными экземпляра. А код, оперирующий данными, содержится в функциях-членах, самым типичным представителем которых является метод. В C# метод служит в качестве аналога подпрограммы (к числу других функций-членов относятся свойства, события и конструкторы). Таким образом, методы класса содержат код, воздействующий на поля, определяемые этим классом.

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

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

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

Полиморфизм, третий принцип ООП, обозначает способность языка трактовать связанные объекты в сходной манере. В частности, этот принцип ООП позволяет базовому классу определять набор членов (формально называемый полиморфным интерфейсом), которые доступны всем наследникам.
Полиморфный интерфейс класса конструируется с использованием любого количества виртуальных или абстрактных членов. По сути, виртуальный член — это член базового класса, определяющий реализацию по умолчанию, которая может быть изменена (или, говоря более формально, переопределена) в производном классе. В отличие от него, абстрактный (abstract) метод — это член базового класса, который не предусматривает реализации по умолчанию, а предлагает только сигнатуру.
Когда класс наследуется от базового класса, определяющего абстрактный метод, этот метод обязательно должен быть переопределен в производном классе. В любом случае, когда производные классы переопределяют члены, определенные в базовом классе, они по существу переопределяют свою реакцию на один и тот же запрос.
Понятие «виртуальный мир» в игре вам знакомо? Так и здесь: виртуальный метод (функция) — это метод, используемый вашим объектом заданного класса, метод (с тем же именем) объекта из класса-наследника может быть (но может и не быть) изменен (переопределен). Дальше поймете, насколько это удобно. Абстрактный метод задает только шаблон в базовом классе, его нельзя вызвать.
В более общем смысле полиморфизм подразумевает «одно наименование — множество методов». Это означает, что для группы взаимосвязанных действий можно разработать общий интерфейс.
Полиморфизм помогает упростить программу, позволяя использовать один и тот же интерфейс для описания общего класса действий. Выбрать конкретное действие (то есть метод) в каждом отдельном случае — это задача компилятора. Программисту не нужно делать это самому. Ему достаточно запомнить и правильно использовать общий интерфейс.

Пока вам эти принципы могут показаться излишне заумными, но после приобретения навыков ООП и написания серьезных программ вы сможете оценить по достоинству красоту и силу этих принципов.

Впрочем, пока достаточно теории, переходим к практике программирования. Для этого необходимо на Вашем компьютере установить интегрированную среду программирования, и пусть это будет Visual Studio от Microsoft.

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Пролистать наверх