Подробный взгляд на "четырех китов" ООП (Оценка: +1)

Печать / RSS-лента
Здравствуйте.
Наверно многие из вас знакомы с такими основополагающими понятиями ОО подхода, как Инкапсуляция, Полиморфизм, Наследование и Абстрагированние. Уверен что любая статья на эту тему многим покажется скучной и устаревшей, но судя по статьям, заполнившим интернет, делаю вывод что ничего кроме сухого копирования материала они не включают. Хотелось бы ответить эти важные грани ОО подхода с практической стороны.
Абстрагированние
Хотелось бы сразу отметить что каждый из этих механизмов отвечает за решение различных задач. Абстрагированние отвечает за упрощение понимания предметной области, то есть то, что мы моделируем в нашей программе. Писали ли вы когда нибудь на партах в школе целые чаты? Думаю хотя бы видели подобное. Представим что мы хотим написать программу, которая избавит школу от вандалов, и переместит столь необычный способ общения в электронную среду школы - компьютерный класс! Предметной областью здесь будет являться своеобразный чат, который нам необходимо изучить и реализовать программно. Для этого нам обязательно надо избавиться от всего ненужного. Какие объекты должны присутствовать в электронном чате? Проведем ассоциации с предметной областью:
конкретная запись на парте - сообщение;
имя человека, подписавшегося под надписью на парте - автор сообщения;
столбик на парте, содержащий сообщения, связанные одной темой - комната чата, или даже лучше, список сообщений.
И так начало положено, теперь можно приступить к абстрагированнию.
Абстрагированние это выделение наиболее важного для решения задачи из всей совокупности. Так, при реализации сообщения, важно ли нам какой ручкой оно было написано, или какой нажим был на парту при написании? Стоит ли включать в класс Сообщение такие свойства как: положение сообщения, скорость записи, площадь используемой части парты; или достаточно одного свойства - текст сообщения? При написани классов, важно отсеить ненужное и оставить только важное (абстрагироваться от шелухи). Как это правильно сделать? Попробуйте начать с осмысления поставленной перед программой задачи, все что по вашему мнению для решения задачи вам не понадобится, можно смело опускать, но нужно помнить - задача должна быть поставлена правильно - иначе абстрагированние только повредит. Если бы в нашем примере было важно сохранить такие особенности предметной области, как цвет пасты, можно было бы добавить в класс Сообщение такое свойство, как - цвет текста.
Инкапсуляция
Используется для упрощения программы и возможности дополнять классы без серьезных изменений.
Представим что мы уже написали часть нашего школьного чата, и вдруг нам понадобилось знать дату написания каждого сообщения, а в нашем классе Сообщение есть только свойства: текст и цвет текста. Думаю многие усмехнуться и подумают - да что тут сложного, написал дополнительное свойство в класс и все дела - а ведь именно в этом прелесть инкапсуляции. Если говорить конкретно, то это свойство системы позволяет скрывать одни данные от других. Другими словами пользоваться своими данными может только объект, другие объекты могут только взаимодействовать с ним, а не изменять работать с его данными напрямую. Нам достаточно перенести свойства класса в приватный список, и после чего добавлять или удалять из этого списка все что угодно, при этом другие объекты даже этого не заметят, потому что изначально им был закрыт доступ к этим данным. Приведу другой пример. Представьте что у вас есть класс, который отвечает за чтение данных из файла построчно. Этот класс имеет внутренний указатель на текущую строку и при вызове метода - получить строку - из файла считывается строка, на которую указывает указатель. Есть также методы: следующая строка и предыдущая строка - которые смещают указатель соответственно вперед и назад при этом проверяю не достигнут ли конец или начало файла. В этом классе свойство - Текущая строка - естественно должно быть защищенным, а за его изменение должены отвечать только методы самого класса, иначе любой объект сможет поменять указатель строки на произвольное значение (на пример -1), что приведет к ошибке. С другой стороны если вам понадобится усовершенствовать ваш класс, заменив свойство Текущая строка на свойство Текущее предложение, вам достаточно будет изменить закрытое свойство и код в соответствующих методах, а внешние файлы даже не заметят изменений, так как изменения происходят внутри самого класса.

Автор статьи: Артур (08.01.12 / 21:09)
Инкапсуляция, Наследование, Полиморфизм
Рейтинг: +1
Просмотров: 1555
Комментарии (2) »