Эдуард, Сергей,
Спасибо за развернутые ответы. Конечно, все это в том или ином виде я читал. Для меня же важно услышать авторитетные мнения, основывающиеся на успешной практике. Также, думаю, что это будет полезным дополнением к статье.
В связи с моим вопросом «Значит ли из ответа на второй вопрос, что Include нельзя использовать в альтернативных потоках?» просто напишу следующее.
1. Когда-то ход мыслей у меня был примерно следующий:
В тексте базового ВИ мы ссылаемся на включаемый ВИ. По большому счету, это не более, чем кросс-референс на описание, которое не хочется повторять каждый раз. (По-моему, совершенно не важно, где такая ссылка появляется: в основном, или альтернативных потоках.)
Далее, у меня было некорректное понимание сущности расширяющих ВИ, что, якобы, они отличаются от включаемых только лишь тем, что включаются по ходу выполнения базового ВИ только при определенном условии (ну и зачем-то текстовое оформление ссылки на расширяющий ВИ чуть-чуть другое – Extension Point :-). Соответственно, становится не понятно, в чем же существенная разница между расширяющим ВИ и ВИ, включенном в один из альтернативных потоков. Другими словами, я не видел никакой существенной разницы между вызовом расширяющего ВИ и выполнением одинаковых последовательностей шагов в альтернативных потоках, которые выполняются при определенном условии (ведь такие шаги тоже можно вынести в отдельный ВИ и ссылаться на него из альтернативного потока).
Утверждения типа «В отношении «extend» любопытно то, что базовый ВИ ничего не знает о расширяющих ВИ, он просто предоставляет для них точки входа.» не имели для меня никакого практического смысла, т.к. какая разница, «знает» или «не знает», если мне все равно в базовом ВИ нужно прописать эти точки расширения, без которых ничего не произойдет (т.е. мне все равно нужно знать наперед, что тем или иным способом мне нужно вызвать такую-то функциональность и в таком-то месте. Не зная, какую функциональность я хочу вызвать, как я могу сказать, где заранее расставить точки расширения? Иначе, чтобы впоследствии не редактировать документ с базовым ВИ, придется наставить столько точек расширения, что потом вообще никому не объяснишь, кому это надо, зачем, и что с этим делать :-) Вот если бы можно было действительно как-то так написать расширяющий ВИ, чтобы документ с расширяемым ВИ редактировать не приходилось... :-)
Чтобы никого не сбивать с толку, процитирую еще раз «правильное» понимание:
…
Разница в том, что включение задает явную подцель пользователя, а расширение задает дополнительную цель, то есть какую-то прибавку к конечному результату. Чаще всего расширяющий вариант использования имеет самостоятельный смысл и ценность и не зависит от расширяемого. Включаемый вариант имеет смысл только в рамках одного или нескольких включащих и может быть использован для вынесения повторяющихся шагов нескольких сценариев в одно место. В результате расширяющий ВИ может иметь тот же уровень цели (по Коберну), что и расширяемый, а включаемый ВИ - это подцель, то есть уровень цели ниже.
…Я бы усил эффект
Альтернативы внутри базового ВИ либо показывают иные пути достижения заданной цели, либо показывают ситуации, когда Вы можете их не достичь, и что Вам следует делать в этих случаях.
…
2. Правда, я так и не нашел ответа на следующую проблему:
ВИ пишутся, для:
- клиентов – чтобы они могли понять, как ПО поможет им выполнять их работу, и чтобы они могли внести корректировки, если им нужна чуть-чуть другая «помощь», нежели предлагается.
- разработчиков – чтобы они могли понять, что должно делать ПО, на сколько это сложно и сколько будет стоить.
- тестировщиков – чтобы они могли написать тест-кейсы и проверить, что ПО работает так, как предполагалось.
По факту, никому из них не интересно вникать в правила и особенности написания ВИ.
Очевидно, ВИ не пишутся для самовыражения бизнес-/системных аналитиков :-)
Чем же наличие двух разных возможностей запустить определенную функциональность (в тексте ВИ) может помочь в достижении целей первых 3х? Что же эти возможности дают такого, что оправдывало бы дополнительную сложность простых вещей?
С одной стороны, можно было бы подумать, что предварительное разделение на Include и Extend может подсказать что-то архитектору, но, с другой стороны, нужна ли ему такая «помощь»?