Иллюстрированный самоучитель по Java

       

Модульность


Этот принцип утверждает — каждый класс должен составлять отдельный модуль. Члены класса, к которым не планируется обращение извне, должны быть инкапсулированы.

В языке Java инкапсуляция достигается добавлением модификатора private к описанию члена класса. Например:

private int mouseCatched;

private String name;

private void preserve();

Эти члены классов становятся

закрытыми,

ими могут пользоваться только экземпляры того же самого класса, например, tuzik может дать поручение

sharik.preserve().

А если в классе

Master

мы напишем

private void getFood(int food, int drink);



то метод

getFood()

не будет найден, и несчастный

sharik

не сможет получить пищу. ,

В противоположность закрытости мы можем объявить некоторые члены класса

открытыми,

записав вместо слова

private

модификатор

public

, например:

public void getFood(int food, int drink);

К таким членам может обратиться любой объект любого класса.

Знатокам C++

В языке Java словами

private, public

и

protected

отмечается каждый член класса в отдельности.

Принцип модульности предписывает открывать члены класса только в случае необходимости. Вспомните надпись: "Нормальное положение шлагбаума — закрытое".

Если же надо обратиться к полю класса, то рекомендуется включить в класс специальные

методы доступа

(access methods), отдельно для чтения этого поля (get method) и для записи в это поле (set method). Имена методов доступа рекомендуется начинать со слов

get

и

set

, добавляя к этим словам имя поля. Для JavaBeans эти рекомендации возведены в ранг закона.

В нашем примере класса

Master

методы доступа к полю

Name

в самом простом виде могут выглядеть так:

public String getName(){

return name;

public void setName(String newName)

{

name = newName; 

}

В реальных ситуациях доступ ограничивается разными проверками, особенно в

set-методах,

меняющих значения полей. Можно проверять тип вводимого значения, задавать диапазон значений, сравнивать со списком допустимых значений.


Кроме методов доступа рекомендуется создавать проверочные

is-методы,

возвращающие логическое значение

true

или

false

. Например, в класс

Master

можно включить метод, проверяющий, задано ли имя хозяина:

public boolean isEmpty(){

return name == null ? true : false; 

}

и использовать этот метод для проверки при доступе к полю

Name

, например:

if (masterOl.isEmpty()) masterOl.setName("Иванов");

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

зацепление

(low coupling) между классами. Тогда структура программы сильно упрощается. Кроме того, такие классы удобно использовать как строительные блоки для построения других программ.

Напротив, члены класса должны активно взаимодействовать друг с другом, как говорят, иметь тесную функциональную

связность

(high cohestion). Для этого в класс следует включать все методы, описывающие поведение моделируемого объекта, и только такие методы, ничего лишнего. Одно из правил достижения сильной функциональной связности, введенное Карлом Ли-берхером (Karl J. Lieberherr), получило название

закон Деметра.

Закон гласит: "в методе т() класса А следует использовать только методы класса А, методы классов, к которым принадлежат аргументы метода т(), и методы классов, экземпляры которых создаются внутри метода m ().

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

Будут ли закрытые члены класса доступны его наследникам? Если в классе

Pet

написано

private Master person;

то можно ли использовать

sharik.person

? Разумеется, нет. Ведь в противном случае каждый, интересующийся закрытыми полями класса

А

, может расширить его классом

B

, и просмотреть закрытые поля класса



А

через экземпляры класса

B

.

Когда надо разрешить доступ наследникам класса, но нежелательно открывать его всему миру, тогда в Java используется

защищенный

(protected) доступ, отмечаемый модификатором

protected

, например, объект

sharik

может обратиться к полю

person

родительского класса

pet

, если в классе

Pet

это поле описано так:

protected Master person;

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

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

Но, говоря о принципах ООП, я не могу удержаться от того, чтобы не напомнить основной принцип всякого программирования.


Содержание раздела