Что должно быть в классе, а чего не должно быть? На этот вопрос отвечает абстракция. Кстати, на мой взгляд, она является самым простым для понимания принципом ООП.
В объектно-ориентированном программировании абстракция означает создание упрощённой модели реального объекта, сосредотачиваясь только на самых важных вещах для решаемой задачи.
Содержание:
Что такое абстракция
Абстракция – её ещё называют абстрагированием – способ выделить важные свойства объекта, исключая неважные. Абстрагирование предполагает упрощение понимания предметной области. Это один из 4 китов ООП.
В ООП мы пишем классы. Всё строится на классах. Но что включать в эти классы? Как понять, какой класс соответствует ООП?
Класс в объектно-ориентированном программировании представляет собой шаблон или описание сущности, определяющий её характеристики и поведение. Объект же представляет конкретное воплощение этого шаблона. Можно сказать, что класс подобен чертежу, а объект – конкретному экземпляру, созданному на основе этого чертежа. Если ассоциировать объекты с языком, то можно сказать, что объекты – это существительные, свойства – прилагательные, а методы – глаголы.
Так вот, представьте, что вы создаёте сайт с фильмами. Вам нужно создать классы фильмов. Фильм – вполне себе сущность. Можно назвать такой класс Movie. У фильма, в свою очередь, может быть множество всяких характеристик: продолжительность съёмок, день рождения главного героя, рост режиссёра… И вряд ли вы будете включать эти переменные в объект Movie. Напротив, вы выделите самые важные для вашей задачи – сайта с фильмами – характеристики. Это могут быть:
- Название фильма
- Описание фильма
- Год выпуска
- Жанр
- Режиссёр
- Актёрский состав
- Рейтинг
Это будет название (строка), описание (строка), год выпуска (дата) и так далее. От всех остальных свойств (которых у фильма, как и у любого понятия, множество) можно и нужно попросту абстрагироваться.
Абстракция относится не только к полям классов. Относится она и к методам. Ведь каждое понятие может много чего уметь. Но отражать в коде нужно, опять же, лишь то, что важно для задачи, которую вы решаете.
Примеры кода
Поговорили-обсудили, а код где? Давайте с примерами сразу, чего далеко ходить.
Например, класс сотрудника Employee. Сюда мы, скорее всего, не будем включать цвет глаз сотрудника, его размер обуви, любимый цвет и хобби. А вот что мы включим, согласно типичным задачам, где требуется класс Employee:
1 2 3 4 5 6 7 8 9 |
public class Employee { private String firstName; private String lastName; private int age; private StaffPosition position; private double salary; ... } |
Это имя и фамилия, возраст, должность и зарплата. Возможны ещё какие-либо поля, или отсутствие некоторых отсюда. Ведь все задачи разные и для каждой конкретной пригодятся свои поля.
Давайте рассмотрим ещё один пример. Книга Book. Что нам покажется бесполезным при создании мобильного приложения для книжного клуба? Например, количество символов в книге. Или шрифт текста. Или поля в сантиметрах. Ну или количество часов, которое автор потратил на эту книгу. Все эти данные можно было бы включить, да вот не нужны они нам для этой задачи. От слова совсем. А вот то, что мы с большей вероятностью включим в класс Book:
1 2 3 4 5 6 7 8 9 10 |
public class Book { private String title; private String author; private int publishingYear; private double price; private Image image; ... } |
Здесь нам пригодились название книги, её автор, год публикации, цена, а также картинка. Куда без картинки в приложении? Покупатели любят, когда всё с картинками. А то непонятно, что покупаешь.
Абстракция словно стратегия. Если стратегия неудачна, то даже самая гениальная тактика не сможет исправить положение.