Абстракции
Чтобы создать эти карты вашего кода, нам сначала нужен общий набор абстракций для создания универсального языка, который мы можем использовать для описания статической структуры программной системы. А система программного обеспечения состоит из одного или нескольких контейнеры (приложения и хранилища данных), каждое из которых содержит один или несколько компонентыкоторые, в свою очередь, реализуются одним или несколькими элементы кода (классы, интерфейсы, объекты, функции и т. д.). И люди может использовать программные системы, которые мы создаем.
Человек
Человек представляет одного из пользователей вашей программной системы (например, актеров, ролей, персонажей и т. д.).
Система программного обеспечения
Программная система представляет собой высший уровень абстракции и описывает что-то, что представляет ценность для ее пользователей, независимо от того, являются ли они людьми или нет. Сюда входит система программного обеспечения, которую вы моделируете, и другие системы программного обеспечения, от которых зависит ваша система программного обеспечения (или наоборот). Во многих случаях программная система «принадлежит» одной команде разработчиков программного обеспечения.
Контейнер (приложения и хранилища данных)
Не Докер! В модели C4 контейнер представляет собой приложение или хранилище данных. Контейнер — это то, что должно быть запущено для работы всей программной системы. На самом деле контейнер — это что-то вроде:
- Серверное веб-приложение: веб-приложение Java EE, работающее на Apache Tomcat, приложение ASP.NET MVC, работающее в Microsoft IIS, приложение Ruby on Rails, работающее на WEBrick, приложение Node.js и т. д.
- Клиентское веб-приложение: приложение JavaScript, работающее в веб-браузере с использованием Angular, Backbone.JS, jQuery и т. д.
- Клиентское настольное приложение: настольное приложение для Windows, написанное с использованием WPF, настольное приложение для OS X, написанное с использованием Objective-C, кроссплатформенное настольное приложение, написанное с использованием JavaFX и т. д.
- Мобильное приложение: приложение Apple iOS, приложение Android, приложение Microsoft Windows Phone и т. д.
- Серверное консольное приложение: автономное приложение (например, «public static void main»), пакетный процесс и т. д.
- Бессерверная функция: одна бессерверная функция (например, Amazon Lambda, функция Azure и т. д.).
- База данных: Схема или база данных в системе управления реляционными базами данных, хранилище документов, графовой базе данных и т. д., например MySQL, Microsoft SQL Server, база данных Oracle, MongoDB, Riak, Cassandra, Neo4j и т. д.
- Большой двоичный объект или хранилище содержимого: хранилище BLOB-объектов (например, Amazon S3, Microsoft Azure Blob Storage и т. д.) или сеть доставки контента (например, Akamai, Amazon CloudFront и т. д.).
- Файловая система: Полная локальная файловая система или часть более крупной сетевой файловой системы (например, SAN, NAS и т. д.).
- Сценарий оболочки: отдельный сценарий оболочки, написанный на Bash и т. д.
- и т. д.
Контейнер — это, по сути, контекст или граница, внутри которой выполняется некоторый код или хранятся некоторые данные. И каждый контейнер представляет собой отдельно развертываемую/выполняемую вещь или среду выполнения, обычно (но не всегда) работающую в собственном пространстве процессов. По этой причине связь между контейнерами обычно принимает форму межпроцессного взаимодействия.
Компонент
Слово «компонент» — чрезвычайно перегруженный термин в индустрии разработки программного обеспечения, но в этом контексте компонент — это группа связанных функций, инкапсулированных за четко определенным интерфейсом. Если вы используете такой язык, как Java или C#, самый простой способ представить компонент — это набор классов реализации, лежащих в основе интерфейса. Такие аспекты, как упаковка этих компонентов (например, один компонент или множество компонентов на файл JAR, DLL, общую библиотеку и т. д.), представляют собой отдельную и ортогональную проблему.
Здесь важно отметить, что все компоненты внутри контейнера обычно выполняются в одном и том же пространстве процесса.
В модели C4 компоненты не являются отдельно развертываемыми единицами.