Основы объектно-ориентированного проектирования


Доступ к сепаратным объектам


Последний пример показывает, как формальный сепаратный аргумент подпрограммы r используется в качестве цели сепаратных вызовов в ее теле. Преимущество этого подхода в том, что для внутренних вызовов не нужно беспокоиться о получении доступа к целевому объекту: об этом будет заботиться вызов r, резервирующий объект, ожидая, если требуется, его освобождения.

Можно пойти дальше и объявить эту схему единственной для сепаратных вызовов:

Правило сепаратного вызова

Цель сепаратного вызова должна быть формальным аргументом подпрограммы, осуществляющей этот вызов.

Напомним, что вызов a.r (...) является сепаратным, если его цель a - это сепаратная сущность или выражение. Правило запрещает вызов компонентов a, если a не является формальным аргументом вызывающей подпрограммы. Поэтому приходится вводить дополнительные подпрограммы. Например, если attrib -это атрибут, объявленный как сепаратный, то вместо непосредственного вызова attrib.r (...) придется вызывать подпрограмму rf(attrib, ...), где:

rf (x: separate SOME_TYPE; ... Другие аргументы ...) is -- Вызов r. do x.r (...) end

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

Следующий пример весьма типичен. Предположим, что имеется разделяемая структура данных - снова буфер - с компонентами remove для удаления элемента и count для запроса числа элементов. Тогда вполне "естественно" написать:

if buffer.count >= 2 then buffer.remove; buffer.remove end

Замысел состоит в удалении двух элементов.


Начало  Назад  Вперед



Книжный магазин