Во первых, не все так плохо.
Спецификация каждого use case, полученная с помощью диаграммы деятельности или по Коберну (я генерю спецификации по своему шаблону из диаграмм, и они получается точь в точь, как описания Коберна) - это почти готовый тесткейс (добавить, что ввести и что ждать). Почти готовое руководство пользователя.
Когда в диаграмме описываются взаимодействия, они могут описываться в термина граничных классов анализа (boandory).
Диаграмму последовательности многие используют как раз для поиска необходимых модельных элементов. Есть такая замечательная книжка Лармана: Применение UML и шаблонов проектирования. И в RUPе, насколько я помню, эта технология используется.
Откуда брать классы? Придумывать? Не метод для проектировщика, и тем более для аналитика! Смотрим на диаграмму Эдуарда. Там в описании написано:
- Система выводит сообщение о необходимости оплаты
- Пользователь вводит в приемное устройство купюры достоинством ...
На диаграмме создаем линию жизни приемного устройства. Это экземпляр граничного класса. Думаем, создаем класс. От пользователя рисуем сообщение (принятьДеньги()) к созданной ранее линии жизни устройства. В классе ручками или автоматом создаем операцию с тем же именем.
Скорее всего, устройство приема будет идентифицировать дензнаки и считать. Соответственно нужны приватные операции идентифицироватьДензнак() и т.д.
Для хранения суммы создаем атрибут.
И т.д. по диаграмме деятельности (или по описанию Коберна).
Необходимые классы, их атрибуты и операции "вытекают" из логики use case. Use Case - очень продуктивная идея!
При реализации следующего use case какие-то элементы уже есть. Может быть, к ним надо добавить атрибуты и операции, или использовать уже имеющиеся.
Конечно, это еще не окончательные классы. Разные языки, платформы, особенности технологии! Но такую систему можно сделать!