
Случай №9.1: "Отправка сообщения: в приеме сообщения отказано"
[Пользователь вводит сообщение и щелкает на кнопке Send] Устанавливаем соединение с удаленным узлом Вызываем абонента [Абонент отказывается принять сообщение]
Сообщаем пользователю об отказе [Пользователь получает код завершения]
Случай№9.2:"Отправкадлинногосообщенияпользователюсети"
[Пользователь вводит сообщение и щелкает на кнопке Send] Устанавливаем соединение с удаленным узлом Вызываем абонента [Абонент подтверждает наличие связи]
Отправляем сообщение по частям Выдаем подтверждение пользователю [Пользователь получает код завершения]
Последний этап — на основании сценариев графически изобразить ход работы программы. Важно, чтобы каждый сценарий был учтен и было показано, как входные данные изменяются на пути к пункту своего назначения.
Именование объектов
После того как потребности пользователей выяснены, необходимо приступить к анализу компонентов программной системы. Поведение каждого компонента определяется тем, что он "знает" (атрибуты) и что он "умеет делать" (методы).
Имя объекта задает его текущее поведение и возможную эволюцию. Хорошее имя всегда является существительным. Например, лучше назвать объект Socket, чем NetIO, поскольку работа в сети подразумевает не только ввод вывод. Следует избегать употребления глаголов и отглагольных существительных, так как в этом случае осуществляется привязка к тому, что объект делает сейчас, и ограничива ется его использование в будущем.
Разграничение этапов анализа и проектирова
ния
На этапе анализа важно не зайти слишком далеко, чтобы не "увязнуть" в не нужных деталях. Например, многие разработчики решают, что для проекта пона добится база данных, задолго до того, как будет проведен анализ задачи. Хорошо это или плохо?
Принятие подобных решений ставит конкретную технологию во главу угла и заставляет корректировать все остальные решения с учетом заранее выбранной технологии. Хороший архитектор не станет определять размер балки, не рассчи тав предварительно нагрузку на нее. Точно так же, если системный аналитик за являет, что программа должна быть написана на Java, не поняв всю проблему в целом, могут возникнуть серьезные трудности при реализации проекта.
На этапе анализа предметную область нужно рассматривать на макроуровне. Если кто то упоминает конкретную деталь реализации, она должна быть отнесена к этапу проектирования.
Глава 14. Ограничения объектно ориентированного... |
281 |
Ⱦɚɧɧɚɹ ɜɟɪɫɢɹ ɤɧɢɝɢ ɜɵɩɭɳɟɧɚ ɷɥɟɤɬɪɨɧɧɵɦ ɢɡɞɚɬɟɥɶɫɬɜɨɦ %RRNV VKRS Ɋɚɫɩɪɨɫɬɪɚɧɟɧɢɟ ɩɪɨɞɚɠɚ ɩɟɪɟɡɚɩɢɫɶ ɞɚɧɧɨɣ ɤɧɢɝɢ ɢɥɢ ɟɟ ɱɚɫɬɟɣ ɁȺɉɊȿɓȿɇɕ Ɉ ɜɫɟɯ ɧɚɪɭɲɟɧɢɹɯ ɩɪɨɫɶɛɚ ɫɨɨɛɳɚɬɶ ɩɨ ɚɞɪɟɫɭ piracy@books-shop.com
Системныеограничения
Иногда в список системных требований входят конкретные аппаратные или программные ограниче ния. Если их немного и они связаны с финансовым/обеспечением проекта, их можно учесть сразу. Однако в большинстве случаев их можно проигнорировать вплоть до этапа проектирования.
В процессе анализа подразумевается, что имеются все необходимые инстру менты реализации. Не беспокойтесь о том, как будет написан тот или иной мо дуль, а сконцентрируйтесь на рассмотрении основных компонентов системы, их взаимодействии друг с другом и сценариях их использования.
Правильный уровень детализации
Сценарии использования важны для осуществления анализа системы. Но, как и в целом на этапе анализа, важно абстрагироваться от чрезмерных деталей, что бы гарантировать соответствие структуры программы исходным требованиям. Ес ли, общаясь с заказчиками проекта, погрузиться в детали реализации, рано или поздно заказчики перестанут вас понимать или же запутаются в каком нибудь сценарии. Если же они захотят подробнее узнать о том, как реализован тот или иной модуль, значит, вы на правильном пути.
Избыточное наследование
На этапе проектирования классы, определенные на этапе анализа, наполняют ся деталями. Здесь необходимо быть очень внимательным, так как велико иску шение связать между собой все классы отношениями наследования. Основной довод здесь таков: "Мы провели тщательный и полноценный анализ. Давайте те перь так же тщательно выполним проектирование". Тем не менее подобная до тошность редко необходима.
Вбольшинстве случаев достаточно построить естественную иерархию классов
идобавить к ним пользовательский интерфейс. Порождать один класс от другого нужно только тогда, когда в нем изменяется модель поведения или добавляются новые функции. Если функция не была выявлена на этапе анализа, но появилась в процессе проектирования, проверьте, не является ли это упущением.
Избыточное наследование — это следствие неправильного моделирования обя занностей объектов. Когда все классы связаны между собой отношениями наследо вания, возникает сложная паутина отношений, и полученный проект трудно сопро вождать даже при наличии документации. Пытаясь модифицировать один класс в иерархии, неизбежно затрагиваешь другой, что противоречит сути инкапсуляции.
Неправильное повторное использование
Распространенный миф, прпулярный среди поклонников объектно ориентированного программирования, гласит, что любой компонент можно ис пользовать многократно. Это очень "абстрактная" вера. Многие классы наилуч шим образом используются именно там, где они изначально проектировались.
Если необходимо повторно использовать класс, нужно убедиться, что его на значение и интерфейс хорошо соответствуют новой ситуации. Когда большую часть интерфейса приходится переписывать, это говорит либо о несоответствии класса, либо о том, что он был плохо спроектирован. Вот вопросы, на которые нужно ответить.
282 |
Часть III. Объектно ориентированные сокеты |
www.books-shop.com
www.books-shop.com