На этом шаге рассмотрим пример, иллюстрирующий применение абстрагирования.
Проиллюстрируем сказанное несколькими примерами. В теплице, использующей гидропонику, растения выращиваются в питательном растворе, а не в почве. Обеспечение соответствующей окружающей среды — тонкая работа, зависящая как от сорта выращиваемой культуры, так и ее возраста. Для этого необходимо контролировать разнообразные факторы: температуру, влажность, освещение, кислотность и концентрацию питательных веществ.
В больших хозяйствах широко используются автоматические системы, контролирующие и регулирующие эти факторы. Проще говоря, цель автоматизации - добиться соблюдения режима выращивания разнообразных растений при минимальном вмешательстве человека.
Одна из ключевых абстракций в такой задаче — датчик. Существует несколько разновидностей датчиков. Все, что влияет на урожайность, должно быть измерено, поэтому необходимо иметь датчики температуры воды и воздуха, влажности, кислотности и концентрации питательного раствора и т.д. С точки зрения наблюдателя датчик температуры — это объект, предназначенный для измерения температуры в конкретном месте. Температура - это числовой параметр, изменяющийся в ограниченном диапазоне и измеряемый с определенной точностью по шкалам Фаренгейта, Цельсия или Кельвина. Местоположение датчика - это некоторое четко определенное место в теплице, температуру в котором нам необходимо измерить. Таких мест, как правило, немного. Для датчика температуры существенно, не где он расположен, а то, что он в принципе может быть размещен в конкретном месте, отдельно от других датчиков.
Что должен делать датчик температуры? Допустим, в соответствии с проектом датчик должен измерять температуру в точке своего размещения и сообщать ее по запросу.
Какие действия клиент может выполнять с датчиком? Пусть проектное решение предусматривает, что клиент может калибровать датчик и запрашивать у него текущее значение температуры.
Описанная абстракция (рис. 1) была пассивной: клиент должен попросить объект ДАТЧИК ТЕМПЕРАТУРЫ измерить температуру.
Рис.1. Пассивная абстракция датчика температуры
Однако есть и другая вполне разумная абстракция, расширяющая возможности системы. В частности, датчик мог бы быть активным и самостоятельно сообщать другим объектам об изменении температуры в определенном месте на заданное количество градусов. Эта абстракция мало отличается от предыдущей, за исключением новой формулировки обязанностей объекта: теперь датчик должен самостоятельно сообщать об изменении температуры, а не по запросу. Какие новые операции нужны ему в связи с этим?
Новая абстракция лишь ненамного сложнее первой (рис. 2).
Рис.2. Активная абстракция датчика температуры
Клиент этой абстракции может изменять пороговое значение датчика температуры. Обязанность датчика — сообщать об изменении текущей температуры, когда ее текущее значение становится выше или ниже порогового. При вызове этой функции датчик сообщает свое местоположение и текущую температуру, снабжая клиента требуемой информацией.
Способ выполнения обязательств абстракции Active Temperature Sensor зависит от ее внутреннего представления и не должен интересовать внешних клиентов. Эта информация является секретом класса и реализуется его закрытой частью совместно с определениями функций-членов.
Рассмотрим теперь другую абстракцию. Для каждой культуры должен существовать производственный план, описывающий изменение во времени температуры, освещения, подкормки и ряда других факторов, обеспечивающих максимально высокий урожай. Этот план также можно абстрагировать, поскольку он является частью предметной области.
Производственный план должен предусматривать средства контроля всех необходимых действий по выращиванию растений и содержать их временное расписание. Например, для некоторой культуры на 15-е сутки роста план может требовать в течение 16 часов поддерживать температуру на уровне 25 градусов, причем 14 часов из них — с освещением, а затем понизить температуру до 18 градусов на остальное время суток. Кроме того, план может предусматривать внесение дополнительных удобрений в середине дня, чтобы поддержать слабую кислотность. С точки зрения внешнего наблюдателя клиент должен иметь возможность составлять план, модифицировать его и запрашивать его содержание, как показано на рис. 3.
Рис.3. Абстракция План выращивания
Проектное решение заключается в том, что в обязанности абстракции плана не входит выполнение самого плана, — это будет обязанностью другой абстракции (например, Plan Controller). Таким образом, можно разделить понятия между разными частями системы, уменьшив концептуальный размер каждой отдельной абстракции. Например, объект может предусматривать взаимодействие человека и компьютера, допуская ручное изменение плана. Объект, содержащий детали плана выращивания, должен уметь изменять состояние объекта Growing Plan. Кроме того, должен существовать объект, выполняющий план. Для этого он должен иметь возможность прочитать план в определенный момент времени. Как следует из описанного примера, ни один объект не изолирован от других. Все объекты взаимодействуют друг с другом для обеспечения определенного поведения. Проектное решение, регламентирующее взаимодействие между объектами, определяет границы абстракций и протокол каждого объекта.
На следующем шаге рассмотрим еще одну составную часть объектного подхода - инкапсуляцию.