Скачиваний:
45
Добавлен:
29.01.2021
Размер:
5.08 Mб
Скачать
    1. Взаимодействие функциональностей

Важной и трудной проблемой в обеспечении правильного функционирования программной системы является так называемое взаимодействие функций (feature interaction), когда несколько правильно работающих функций системы перестают работать правильно при их интеграции в единый продукт. Эта проблема часто возникает при развитии программного продукта, функциональность которого наращивается поэтапно. Поиски причин нарушения целостности такой системы при добавлении новой функциональности (корректно реализованной и работающей правильно в изоляции) могут привести к серьезным переделкам кода и оказаться чреватыми к внесению в него новых ошибок. Возможной мерой предотвращения таких «сюрпризов» может быть исследование поведения системы на ее формальной модели.

Рассмотрим простую систему телефонной связи (Plain Old Telephone System – POTS), в которой реализованы три независимые функциональности: переадресация звонка (Forward), трехсторонняя связь (3WayCall) и ожидание (CallWaiting) – Рис. 42.

Рис. 42. Простая телефонная система с дополнительными функциями

Телефоны взаимодействуют между собой через установленные каналы связи телефонной сети и могут быть в состоянии «свободен» или «занят». В системе реализована переадресация звонка (Forward) и добавляются 2 независимые функции 3WayPhone и CallWaiting, которые, как выясняется, могут взаимно влиять друг на друга. Очевидная формализация отдельных шагов этих функций приведена на Рис. 43.

Телефоны m, n, и k все на связи;

Телефон k кладет трубку и переходит в состояние idle;

Телефоны m и n получают dialtone.

req 3WAY teardown 2: Forall(m,n,k) (

rel(m,n,3wayconnected k)

-> after(onhook k)(

state(k,idle) &

state(m,(idle;offhook m)) &

state(n,(idle;offhook n)) &

3WAY k

)

);

Трехсторонняя связь – 3WayPhone

Телефон n ожидает соединения с k;

Телефоны k и m соединены;

Телефон m отсоединяется и переходит в состояние idle;

k получает сигнал “busy” от m;

Телефоны n и k становятся соединенными.

req CW teardown 1: Forall(m,n,k) (

rel(k,n,cw hold connect m)

-> after(onhook m)

(state(m,idle) & rel(k,n,(cw hold connect m;onhook m)) )

);

req CW teardown 11: Forall(m,n,k) (

rel(k,n,(cw hold connect m;onhook m))

-> after(busy k.flash k)

(rel(k,n,connected) & CW(k))

)

Ожидание – CallWaiting

Рис. 43. Формализация отдельных шагов 3WayPhone и CallWaiting

Пусть теперь имеется 4 телефона С1, С2, С3 и Р1, причем Р1 с функцией трехсторонней связи. Рассмотрим, сценарий, представленный на Рис. 44.

1.

2.

3.

4.

Рис. 44. Пример незапланированного взаимодействия функциональностей

1. Пары телефонов (С1, С2) и (Р1, С3) соединены и ведут независимые разговоры.

2. Телефон Р1 переводит С3 в состояние ожидания трехсторонней связи и вызывает С2.

3. Телефон С2 переводит С1 в режим ожидания, после чего устанавливается трехсторонняя связь между телефонами Р1, С2 и С3.

4. Телефон Р1 кладет трубку и переходит в состояние «свободен». В какое состояние в этом случае переходит телефон С2? С одной стороны, по правилу 3WAY teardown 2 для трехсторонней связи оба телефона С2 и С3 должны получить сигнал dialtone; с другой стороны, по правилу CW teardown 1 телефон С2 должно получить сигнал «занято».

Исправить ситуацию; т.е., убрать возникшую неоднозначность, можно лишь при дальнейшем уточнении поведения телефонов, когда присутствуют эти новые функциональности.