Спецификации представляют собой полное и точное описание функций и ограничений разрабатываемого программного обеспечения. При этом одна часть спецификаций (функциональные) описывает функции разрабатываемого программного обеспечения, а другая часть (эксплуатационные) определяет требования к техническим средствам, надежности, информационной безопасности и т. д.  
Определение отражает главные требования к спецификациям. Применительно к
функциональным спецификациям подразумевается, что:
- требование полноты означает, что спецификации должны содержать всю существенную информацию, где ничего важного не было бы упущено, и отсутствует несущественная информация, например детали реализации, чтобы не препятствовать разработчику в выборе наиболее эффективных решений
- требование точности означает, что спецификации должны однозначно восприниматься как заказчиком, так и разработчиком.
  
Последнее требование выполнить достаточно сложно в силу того, что естественный язык для описания спецификаций не подходит: даже подробные спецификации на естественном языке не обеспечивают необходимой точности. Точные спецификации можно определить, только разработав некоторую формальную модель разрабатываемого программного обеспечения.  
Формальные модели, используемые на этапе определения спецификаций можно разделить на 2 группы: 
- Модели, зависящие от подхода к разработке (структурного или объектно-ориентированного)
- Модели, не зависящие от него. 
  
Так диаграммы переходов состояний, которые демонстрируют особенности поведения разрабатываемого программного обеспечения при получении тех или иных сигналов извне, и математические модели предметной области используют при любом подходе к разработке.  
В рамках структурного подхода на этапе анализа и определения спецификаций используют
3 типа моделей: 
- Модели, ориентированные на функции
- Модели, ориентированные на данные
- Модели, ориентированные на потоки данных. 
  
Каждую модель целесообразно использовать для своего специфического класса программных разработок.  
#### Классификация моделей разрабатываемого программного обеспечения, используемых на этапе определения спецификаций
Модели этапа анализа и определения спецификаций:
- Не зависящие от подхода к разработке
	- Диаграммы переходов состояний
	- Математические модели предметной области
- Структурного подхода
	- Функциональные диаграммы
	- Диаграммы потоков данных
	- Диаграммы отношений компонентов данных
- Объектного подхода
	- Диаграммы вариантов использования
	- Контекстные диаграммы классов
	- Диаграммы последовательностей
	- Диаграммы деятельности
  
Следует иметь в виду, что все функциональные спецификации описывают одни и те же характеристики разрабатываемого программного обеспечения: перечень функций и состав обрабатываемых данных. Они различаются только системой приоритетов (акцентов), которая используется разработчиком в процессе анализа требований и определения спецификаций. Диаграммы переходов состояний определяют основные аспекты поведения программного обеспечения во времени, диаграммы потоков данных - направление и структуру потоков данных, а концептуальные диаграммы классов - отношение между основными понятиями предметной области.  
Поскольку разные модели описывают проектируемое программное обеспечение с разных сторон, рекомендуется использовать сразу несколько моделей и сопровождать их текстами: словарями, описаниями и т. п., которые поясняют соответствующие диаграммы.  
Так методологии структурного анализа и проектирования, основанные на моделировании потоков данных, обычно используют комплексное представление проектируемого программного обеспечения в виде совокупности моделей:
- **диаграмм потоков данных (DFD - Data Flow Diagrams)**, описывающих взаимодействие источников и потребителей информации через процессы, которые должны быть реализованы в системе
- **диаграмм «сущность-связь» (ERD - Entity-Relationship Diagrams)**, описывающих базы данных разрабатываемой системы
- **диаграмм переходов состояний (STD - State Transition Diagrams)**, характеризующих поведение системы во времени
- **спецификаций процессов** - обычно представляют в виде краткого текстового описания, схем алгоритмов, псевдокодов, Flow-форм или диаграмм Насси-Шнейдермана. Поскольку описание процесса должно быть кратким и понятным как разработчику, так и заказчику, для их спецификации чаще всего используют псевдокоды.
- **словаря терминов** - представляет собой краткое описание основных понятий, используемых при составлении спецификаций. Он должен включать определение основных понятий предметной области, описание структур элементов данных, их типов и форматов, а также всех сокращений и условных обозначений. Он предназначен для повышения степени понимания предметной области и исключения риска возникновения разногласий при обсуждении моделей между заказчиками и разработчиками.
  
Взаимосвязь элементов такой обобщенной модели:  
![Взаимосвязь элементов](../Pictures/12_01.%20Взаимосвязь%20элементов.png)  
Обычно описание термина в словаре выполняют по следующей схеме:
- Термин
- Категория (понятие предметной области, элемент данных, условное обозначение и т. д.);
- Краткое описание.
  
В качестве примера приведем описание одного из терминов системы решения комбинаторно-оптимизационных задач:
- Термин - Алгоритм
- Категория - Понятие предметной области
- Описание - В настоящем проекте используется для обозначения обобщенного понятия «реализация процедуры решения конкретной задачи выбранным методом»
  
Кроме указанных моделей в состав полной спецификации при любом подходе могут входить математические модели описания объектов предметной области, которые позволяют уточнить основные соотношения анализируемых величин и накладываемые на них ограничения.