Последним в длинной цепи процессов проектирования программного обеспечения является процесс проектирования и собственно программирования (кодирования) внутренней логики каждого модуля. Очень часто идея тщательного планирования здесь отбрасывается, и программист разрабатывает модуль более или менее хаотично. Однако процесс разработки модуля может и должен тщательно планироваться. Следующие 11 шагов составляют набросок дисциплинированного подхода к проектированию модуля.
1. Выберите язык. Выбор языка обычно диктуется требованиями контракта или принятыми в организации стандартами. Хотя выбор языка и включен сюда, на самом деле язык должен быть выбран в начальный период работы над проектом, поскольку он влияет на планирование работы над проектом (например, обучение программистов, подготовка компиляторов и средств тестирования).
2. Спроектируйте внешние спецификации модуля. Это процесс определения внешних характеристик каждого модуля, о котором шла речь в предыдущем разделе.
3. Проверьте правильность внешних спецификаций. Правильность спецификаций каждого модуля должна быть проверена сравнением их с информацией о сопряжениях, полученной при проектировании структуры программы, и анализом их всеми программистами, разрабатывающими вызывающие модули.
4. Выберите алгоритм и структуры данных. Жизненно важным шагом в процессе проектирования логики является выбор алгоритма и соответствующих структур данных. Сегодня лишь немногие алгоритмы создаются впервые; огромное их число уже было изобретено, и весьма вероятно, что уже имеется один или несколько алгоритмов, вполне устраивающих проектировщика. Вместо того чтобы тратить время, заново изобретая алгоритмы и структуры данных, лучше поискать готовые решения. Если речь идет о нечисленных алгоритмах (т.е. о большинстве видов обработки данных), лучше всего начать с книги Д. Кнута о фундаментальных алгоритмах [4] и последующих томов этой серии. В случае численных алгоритмов начните с издаваемых АСМ «Избранных алгоритмов из САСМ» (Collected Algorithms from САСМ). Другим источником алгоритмов обоих типов являются учебники, технические статьи и существующие программы.
Обычно проектировщик обнаруживает несколько функционально эквивалентных алгоритмов и структур данных, и ему приходится выбирать один из них. Поскольку многие современные вычислительные системы имеют многоуровневую память (обычно это основная память, виртуальная память, быстрая буферная память), основная тенденция у программистов, стремящихся к истинной эффективности, – назад, к простейшим алгоритмам и структурам данных (например, в системе с многоуровневой памятью двоичный поиск может оказаться не намного быстрее, чем более простой последовательный). Это пример того, как эффективность и простота становятся не противоречивыми, а согласованными требованиями!
5. Напишите первое и последнее предложения. Следующий шаг – написать предложения PROCEDURE и END будущего модуля (или их эквиваленты, в зависимости от избранного языка программирования). Отметим, что мы здесь опустили традиционный этап вычерчивания блок-схем; причины этого будут рассмотрены ниже.
6. Объявите все данные из сопряжения. Следующий шаг состоит в написании тех предложений программы, которые определяют или объявляют все переменные для сопряжения создаваемого модуля.
7. Объявите остальные данные. Напишите предложения, которые определяют или объявляют все другие необходимые переменные. Поскольку трудно предсказать все переменные, которые понадобятся, этот шаг часто перекрывается со следующим.
8. Детализируйте текст программы. Следующий шаг – итеративный, он предполагает последовательную детализацию логики модуля, начиная с достаточно высокого уровня абстракции и заканчивая готовым текстом программы. На этом шаге используются методы пошаговой детализации и структурного программирования.
9. Отшлифуйте текст программы. Теперь модуль нужно отшлифовать для достижения «ясности» и снабдить его дополнительными комментариями, отвечающими на вопросы, которые могут возникнуть при чтении программы.
10. Проверьте правильность программы. Вручную проверяется правильность модуля. Соответствующие процедуры описаны в последнем разделе этой главы.
11. Компилируйте модуль. Последний шаг – компиляция модуля. Этот шаг отмечает переход от проектирования к тестированию; компиляцией, по существу, начинается тестирование программного обеспечения.