Component — C4 Model
Component
Слово «component» — чрезвычайно перегруженный термин в индустрии разработки ПО, но в C4 Model component — это группировка связанной функциональности, инкапсулированной за чётко определённым интерфейсом. Если вы используете язык вроде Java или C#, простейший способ подумать о component — это то, что это коллекция implementation classes за интерфейсом.
С C4 Model, components не являются отдельно разворачиваемыми единицами. Вместо этого, container — это разворачиваемая единица. Иными словами, все components внутри container выполняются в одном process space. Такие аспекты, как как components упакованы (например, один component против многих components per JAR файл, DLL, shared library и т.д.) — это ортогональная проблема.
Components vs code?
Component — это способ подняться на уровень абстракции выше от code-level building blocks, которые вы используете в языке программирования. Например:
- Object-oriented programming languages (например, Java, C#, C++ и т.д.): Component состоит из классов и интерфейсов.
- Procedural programming languages (например, C): Component может состоять из нескольких C файлов в определённом каталоге.
- JavaScript: Component может быть JavaScript module, состоящим из нескольких объектов и функций.
- Functional programming languages: Component может быть module (концепция, поддерживаемая языками вроде F#, Haskell и т.д.), который является логической группировкой связанных функций, типов и т.д.
Если вы используете object-oriented язык программирования, ваши components будут реализованы с использованием одного или более классов. Давайте посмотрим на быстрый пример для лучшего определения того, что такое component в контексте кода.
Приложение Spring PetClinic — это sample codebase, который иллюстрирует как построить Java web application с использованием Spring MVC framework. С нетехнической перспективы, это software system, предназначенный для воображаемой pet clinic, который хранит информацию о pets и их owners, визитах в clinic, и vets, которые там работают. Система предназначена только для использования сотрудниками clinic. С технической перспективы, Spring PetClinic system состоит из web application и relational database schema.
Web application версии 1, которую мы рассмотрим, — это типичная layered architecture, состоящая из множества web MVC controllers, service содержащего «business logic» и некоторых repositories для data access. Есть также некоторые domain и util classes. Если вы скачаете копию с GitHub, откроете в вашем IDE и визуализируете путём reverse-engineering UML class diagram из кода, вы получите что-то вроде этого.

Как вы и ожидали, эта diagram показывает вам все Java classes и interfaces, составляющие Spring PetClinic web application, плюс все relationships между ними. Properties и methods скрыты на diagram потому что добавляют слишком много шума. Это не complex codebase ни по какой мерке, но, показывая classes и interfaces, diagram показывает слишком много деталей.
Давайте удалим те classes, которые не полезны для имеения «architecture» discussion о системе. Иными словами, покажем только те classes/interfaces, которые имеют некоторую значимость с static structure perspective. В конкретных терминах, для этого конкретного codebase, это означает исключение model/domain classes (они просто data structures) и util classes.

После небольшого rearranging, у нас теперь более простая diagram с которой можно reasoning about software architecture. Мы также видим architectural layers again (controllers, services и repositories). Но эта diagram всё ещё показывает code-level elements (то есть classes и interfaces). Чтобы zoom up на один уровень, нам нужно identify which of these code-level elements can be grouped together to form «components». Strategy для grouping code-level elements в components будет варьироваться от codebase к codebase, но для этого codebase strategy может выглядеть так.

Каждый из blue boxes представляет «component» в этом codebase. В summary, каждый из web controllers — это separate component, вместе с результатом combining remaining interfaces и их implementation classes. Если мы удалим code level noise, мы получим picture вроде этой.

По сути, мы grouping classes и interfaces в components для formation units of related functionality. У вас вероятно будет shared code (например, abstract base classes, supporting classes, helper classes, utility classes и т.д.), который используется многими components, вроде JdbcPetVisitExtractor в этом примере. Некоторые можно refactored и moved «inside» particular component, но некоторые из них неизбежны.
Хотя этот example иллюстрирует traditional layered architecture, те же принципы применимы независимо от как вы упаковываете ваш code (например, by layer, feature или component) или architectural style в использовании (например, layered, hexagonal, ports and adapters и т.д.). Если ваш codebase достаточно мал, вы можете пройти через этот process manually. Для больших codebases though, вы вероятно захотите consider automatic generation of component diagrams путём reverse-engineering вашего codebase (example).
- 1 diagrams shown here do not reflect the latest version of the Spring PetClinic, but are sufficient for the discussion
- 2
git checkout 95de1d9f8bf63560915331664b27a4a75ce1f1f6is the version these diagrams were based upon
FAQ
Является ли Java JAR, C# assembly, DLL, module, package, namespace, folder и т.д. component?
Возможно, но, опять же, обычно нет. C4 Model — это о показе runtime units (containers) и как функциональность partitioned across them (components), а не organisational units вроде Java JAR файлов, C# assemblies, DLL, modules, packages, namespaces или folder structures.
Конечно, может быть one-to-one mapping между этими constructs и component; например, если вы строите hexagonal architecture, вы можете создать single Java JAR файл или C# assembly per component. С другой стороны, single component может быть реализован с использованием code из множества JAR файлов, что обычно происходит когда вы начинаете consider third-party frameworks/libraries, и как они embedded в ваш codebase.
Содержимое основано на c4model.com и лицензировано под Creative Commons Attribution 4.0 International License.