<?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE article PUBLIC "-//NLM/DTD JATS (Z39.96) Journal Publishing DTD v1.2 20120330//EN" "http://jats.nlm.nih.gov/publishing/1.2/JATS-journalpublishing1.dtd">
    <!--<?xml-stylesheet type="text/xsl" href="article.xsl">-->
<article xmlns:ns0="http://www.w3.org/1999/xlink" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" article-type="research-article" dtd-version="1.2" xml:lang="en">
	<front>
		<journal-meta>
			<journal-id journal-id-type="issn">2303-9868</journal-id>
			<journal-id journal-id-type="eissn">2227-6017</journal-id>
			<journal-title-group>
				<journal-title>Международный научно-исследовательский журнал</journal-title>
			</journal-title-group>
			<issn pub-type="epub">2303-9868</issn>
			<publisher>
				<publisher-name>ООО Цифра</publisher-name>
			</publisher>
		</journal-meta>
		<article-meta>
			<article-id pub-id-type="doi">10.60797/IRJ.2026.166.125</article-id>
			<article-categories>
				<subj-group>
					<subject>Brief communication</subject>
				</subj-group>
			</article-categories>
			<title-group>
				<article-title>Паттерн проектирования Draft System: эффективное управление черновиками в информационных системах</article-title>
			</title-group>
			<contrib-group>
				<contrib contrib-type="author" corresp="yes">
					<contrib-id contrib-id-type="orcid">https://orcid.org/0009-0005-1563-6794</contrib-id>
					<contrib-id contrib-id-type="rinc">https://elibrary.ru/author_profile.asp?id=1249642</contrib-id>
					<name>
						<surname>Андреев</surname>
						<given-names>Роман Андреевич</given-names>
					</name>
					<email>grand-roman@yandex.ru</email>
					<xref ref-type="aff" rid="aff-1">1</xref>
				</contrib>
			</contrib-group>
			<aff id="aff-1">
				<label>1</label>
				<institution>Хакасский государственный университет имени Н.Ф. Катанова</institution>
			</aff>
			<pub-date publication-format="electronic" date-type="pub" iso-8601-date="2026-04-17">
				<day>17</day>
				<month>04</month>
				<year>2026</year>
			</pub-date>
			<pub-date pub-type="collection">
				<year>2026</year>
			</pub-date>
			<volume>7</volume>
			<issue>166</issue>
			<fpage>1</fpage>
			<lpage>7</lpage>
			<history>
				<date date-type="received" iso-8601-date="2025-11-06">
					<day>06</day>
					<month>11</month>
					<year>2025</year>
				</date>
				<date date-type="accepted" iso-8601-date="2026-04-06">
					<day>06</day>
					<month>04</month>
					<year>2026</year>
				</date>
			</history>
			<permissions>
				<copyright-statement>Copyright: &amp;#x00A9; 2022 The Author(s)</copyright-statement>
				<copyright-year>2022</copyright-year>
				<license license-type="open-access" xlink:href="http://creativecommons.org/licenses/by/4.0/">
					<license-p>
						This is an open-access article distributed under the terms of the Creative Commons Attribution 4.0 International License (CC-BY 4.0), which permits unrestricted use, distribution, and reproduction in any medium, provided the original author and source are credited. See 
						<uri xlink:href="http://creativecommons.org/licenses/by/4.0/">http://creativecommons.org/licenses/by/4.0/</uri>
					</license-p>
					.
				</license>
			</permissions>
			<self-uri xlink:href="https://research-journal.org/archive/4-166-2026-april/10.60797/IRJ.2026.166.125"/>
			<abstract>
				<p>В статье предложен и формализован паттерн Draft System для управления черновыми изменениями доменных объектов с чётким разделением подтверждённого состояния (original_entity) и временных данных (draft_data). Описана архитектурная модель, включающая абстракцию DraftSystem: доступ к черновику через raw, определение наличия правок через has_changes, а также синхронизацию и сохранение черновика посредством save_draft(). Дополнительно рассматривается компонент DraftState, реализующий жизненный цикл «инициализация–модификация–проверка–фиксация–отмена» и задающий правила переходов между стадиями. Для выявления изменений предложен механизм контроля на основе сравнения контрольных хешей состояния, позволяющий быстро определять факт модификации и снижать издержки на проверку. Показана реализация управляемого доступа к данным и централизованной проверки: DraftProperty перехватывает операции чтения/записи и обеспечивает единообразное применение черновых значений, а DraftValidator выполняет валидацию как на уровне отдельных полей, так и на уровне бизнес-правил перед публикацией изменений в подтверждённую сущность. Обсуждаются области применения и направления развития подхода, включая версионирование, распределённое хранение, поддержку аудита изменений и сценарии коллаборативного редактирования.</p>
			</abstract>
			<kwd-group>
				<kwd>система управления черновиками</kwd>
				<kwd> шаблоны проектирования</kwd>
				<kwd> программная архитектура</kwd>
				<kwd> управление состоянием</kwd>
				<kwd> валидация данных</kwd>
			</kwd-group>
		</article-meta>
	</front>
	<body>
		<sec>
			<title>HTML-content</title>
			<p>1. Введение</p>
			<p>Современные информационные системы всё чаще сталкиваются с проблемой потери несохранённых изменений и высокой сложностью управления промежуточными состояниями данных. В многосценарных процессах редактирования система должна уметь изолировать «незавершённые» изменения от подтверждённой версии объекта, обеспечивая согласованность, воспроизводимость и контролируемое применение правок.</p>
			<p>Литературный обзор показывает, что в практике разработки для управления изменениями применяются как классические поведенческие паттерны, так и инфраструктурные механизмы хранения состояния. Так, паттерн Command используется для инкапсуляции операций и поддержки Undo/Redo, но он не определяет модель долговременного хранения черновых данных и правила их публикации. Memento позволяет сохранять снимки состояния, однако при масштабировании приводит к существенным накладным расходам на хранение, а также слабо отвечает на вопросы частичных (инкрементальных) изменений и доменной валидации перед фиксацией. Подход Unit of Work и транзакционные механизмы обеспечивают согласованную фиксацию в рамках сессии, но ориентированы на короткоживущую единицу работы и не покрывают сценарии длительного ведения черновика между сессиями пользователя. State Tracking в ORM автоматизирует выявление изменений, однако привязан к жизненному циклу ORM-контекста и, как правило, не задаёт доменно-ориентированных правил безопасного редактирования, восстановления и контролируемой публикации. Следовательно, в существующем наборе подходов отсутствует целостная и доменно-ориентированная схема, которая одновременно хранит черновик независимо от транзакции ORM, допускает частичные и потенциально неконсистентные изменения, формализует проверки и обеспечивает управляемую фиксацию.</p>
			<p>Существующие решения покрывают лишь отдельные аспекты этой задачи. Command удобен для инкапсуляции операций и поддержки отмены, но не задаёт модели хранения и жизненного цикла черновика. Memento позволяет сохранять снимки состояния, однако при практическом использовании приводит к громоздкости хранения и не отвечает на вопросы частичных изменений и валидации. Unit of Work и транзакционные механизмы ориентированы на согласованную фиксацию в рамках сессии, но не обеспечивают длительное ведение черновых данных между сессиями и не разделяют явно временное и финальное состояния. State Tracking в ORM автоматизирует отслеживание модификаций, однако остаётся привязанным к единице работы ORM и не предоставляет доменно-ориентированных правил безопасного редактирования, восстановления и публикации изменений.</p>
			<p>В связи с этим цель работы формулируется как разработка и формализация специализированного паттерна проектирования Draft System, устраняющего указанные ограничения за счёт явного разделения подтверждённой сущности и её черновых изменений, а также формализации операций редактирования, проверки и контролируемой фиксации.</p>
			<p>Для достижения цели решаются следующие задачи:</p>
			<p>1. Определить ключевые требования к системам управления черновиками данных.</p>
			<p>2. Разработать архитектурную модель Draft System, включающую основные компоненты и механизмы.</p>
			<p>3. Оценить теоретическую и практическую значимость паттерна для различных сценариев использования.</p>
			<p>4. Провести анализ преимуществ и возможных ограничений предложенного подхода.</p>
			<p>Полученные результаты. В работе:</p>
			<p>1. Сформулированы требования к системам управления черновиками данных;</p>
			<p>2. Предложена и формализована архитектурная модель паттерна Draft System;</p>
			<p>3. Разработан механизм отслеживания изменений на основе фиксации и сравнения контрольных хешей состояния;</p>
			<p>4. Описаны компоненты DraftProperty и DraftValidator, обеспечивающие управляемый доступ к данным черновика и централизованную валидацию на уровне полей и бизнес-правил.</p>
			<p>Актуальность обусловлена быстрым ростом числа приложений со сложной бизнес-логикой, когда порождается опасность потери неконсервированных данных или ошибок из-за преждевременного распространения изменений.</p>
			<p>Научная новизна заключается в разработке паттерна Draft System как целостной доменно-ориентированной схемы управления жизненным циклом данных, которая обеспечивает хранение черновика независимо от транзакций и ORM-контекста, допускает частичные и потенциально неконсистентные промежуточные изменения и формализует операции валидации и контролируемой фиксации изменений в подтверждённую сущность [1, С. 129–130].</p>
			<p>Оригинальность подхода состоит в объединении в одном паттерне: отдельного контейнера изменений draft_data, формализованного жизненного цикла «редактирование–проверка–публикация/отмена» и сочетания хеш-фиксации состояния с перехватом записи в свойства через DraftProperty и централизованной валидацией DraftValidator</p>
			<p>Теоретическая значимость заключается в расширении методологии архитектурного проектирования специализированными паттернами для управления жизненным циклом данных. Практическая значимость паттерна Draft System заключается в возможности его встраивания в современные информационные системы для повышения устойчивости, надежности, управляемости и сохранности данных на всех этапах работы [2, С. 48].</p>
			<p>2. Основные
представления о структуризации паттерна</p>
			<p>Паттерн Draft System описывает принцип организационного разделения рабочих состояний объектов и их подтвержденных версий. В терминах системного анализа это механизм управления модифицируемыми данными, позволяющий изолировать незавершенные изменения и впоследствии синхронизировать их с исходными сущностями по явному событию подтверждения.</p>
			<p>Базовая структура паттерна представляет собой абстрактный класс , инкапсулирующий логику двухфазного взаимодействия с данными: фазу модификации и фазу персистентности. Это обеспечит транзакционность операций с сущностями и сохранит изменения изолированными до их явного подтверждения [3, С. 79].</p>
			<p>Паттерн включает следующие ключевые элементы:</p>
			<p>1. Оригинальная сущность (original_entity) — первичный источник данных, представляющий подтверждённое состояние доменного объекта и, в терминах DDD, выступающий в роли Aggregate Root.</p>
			<p>2. Хранилище черновика (draft_data) — контейнер для временного сохранения изменений, реализуемый как JSON-представление набора полей доменной модели, сохраняемое в отдельном атрибуте модели базы данных. Такой подход позволяет хранить частично заполненные или несогласованные данные без нарушения целостности основной схемы, а также обеспечивает гибкость при эволюции структуры черновика.</p>
			<p>3. Методы доступа и управления состоянием — формализованный интерфейс взаимодействия с паттерном, обеспечивающий чтение, модификацию, валидацию и фиксацию данных черновика в исходной сущности.</p>
			<p>Структура паттерна представлена на рис. 1.</p>
			<fig id="F1">
				<label>Figure 1</label>
				<caption>
					<p>Структура паттерна</p>
				</caption>
				<alt-text>Структура паттерна</alt-text>
				<graphic ns0:href="/media/images/2026-04-13/893f2e97-9a24-4ae3-ac1d-be39cf645e42.png"/>
			</fig>
			<p>Метод _compare_with_original() выполняет проверку по принципу хэша: при первоначальном создании черновика вычисляется контрольный хэш на основе сериализованного представления данных; затем при сравнении вычисляется хэш текущего состояния черновика тем же алгоритмом. Если хэши различаются, значит черновик был изменён. При этом доступ к данным черновика осуществляется прозрачно через свойство raw, предоставляющее прямое взаимодействие с временным хранилищем. Для синхронизации изменений предусмотрен метод save_draft(), который выполняет их контролируемую и атомарную передачу из черновика в основную сущность.</p>
			<p>В контексте системного анализа данный архитектурный паттерн может быть классифицирован как реализация принципа разделения ответственности, где логика управления изменениями отделена от логики хранения данных. Это позволяет значительно повысить гибкость и надежность системы при работе с потенциально нестабильными состояниями объектов в процессе их модификации [5, С. 201].</p>
			<p>Паттерн управления черновиками предусматривает эффективный механизм отслеживания изменений, который является краеугольным элементом всей архитектуры. Данный механизм обеспечивает контроль над изменениями состояния объекта и предоставляет основу для принятия решений относительно необходимости сохранения данных.</p>
			<p>Управление в рамках паттерна реализуется через специализированный компонент , который инкапсулирует логику фиксации исходного состояния и выявления изменений. Ключевыми составляющими данного компонента являются:</p>
			<p>1. Хранилище текущего состояния объекта.</p>
			<p>2. Фиксатор исходного состояния (через хеш-значение).</p>
			<p>3. Механизм сравнения текущего и исходного состояний [6, C. 121].</p>
			<p>Механизм управления основан на вычислении хеш-значений от состояния объекта в различные моменты времени. При инициализации объекта или после подтверждения изменений фиксируется хеш текущего состояния. В последующем, сравнение этого начального хеша с хешем текущего состояния позволяет определить, были ли внесены какие-либо изменения.</p>
			<p>На рисунке 2 представлен жизненный цикл управления состоянием.</p>
			<fig id="F2">
				<label>Figure 2</label>
				<caption>
					<p>Жизненный цикл состояния</p>
				</caption>
				<alt-text>Жизненный цикл состояния</alt-text>
				<graphic ns0:href="/media/images/2026-04-13/bd862628-e461-455b-ae5e-840cacf0738a.png"/>
			</fig>
			<p>Структурная схема компонента показана на рисунке 3.</p>
			<fig id="F3">
				<label>Figure 3</label>
				<caption>
					<p>Структурная схема компонента</p>
				</caption>
				<alt-text>Структурная схема компонента</alt-text>
				<graphic ns0:href="/media/images/2026-04-13/1d602e37-2ebe-4ab3-b60b-ff94dc12621d.png"/>
			</fig>
			<p>Предлагаемый механизм управления состоянием формирует надежный фундамент для построения более сложных моделей взаимодействия с данными, таких как отложенное сохранение, отмена операций или валидация изменений перед фиксацией в основном хранилище. Благодаря четкой разграниченности ответственности и контролю над жизненным циклом изменений, система приобретает значительную устойчивость к ошибкам, связанным с непреднамеренной модификацией данных [11, C. 97–120].</p>
			<p>3. Реализация паттерна</p>
			<p>Предложим далее к рассмотрению компонент DraftProperty. Он представляет собой дескриптор данных, который обеспечивает контролируемый доступ к отдельным свойствам черновика. Он инкапсулирует логику доступа к данным и их валидацию, сохраняя при этом единообразный интерфейс взаимодействия для клиентского кода </p>
			<p>[12, C. 145]</p>
			<p>Основные функции дескриптора:</p>
			<p>1. Определение имени свойства для однозначной идентификации.</p>
			<p>2. Связывание правил валидации с конкретным свойством.</p>
			<p>3. Контроль над операциями чтения и записи данных </p>
			<p>[13, C. 213]</p>
			<p>Дескриптор действует как промежуточный слой между клиентским кодом и внутренним представлением данных, обеспечивая согласованность и защиту состояния черновика </p>
			<p>[14, C. 104]</p>
			<fig id="F4">
				<label>Figure 4</label>
				<caption>
					<p>Управление свойствами</p>
				</caption>
				<alt-text>Управление свойствами</alt-text>
				<graphic ns0:href="/media/images/2026-04-13/905d4fac-32f0-41bb-8bf9-0ac71d3d3ff6.png"/>
			</fig>
			<p>Система валидации данных основана на принципе разделения ответственностей и обеспечивает проверку целостности данных как на уровне отдельных свойств, так и на уровне бизнес-правил, действующих на черновик в целом [15, C. 71–76].</p>
			<p>Валидатор DraftValidator реализует стратегический подход к проверке корректности операций над данными черновика, что обеспечивает централизованное управление правилами целостности данных. Такой подход позволяет выполнять сложные проверки, которые охватывают несколько полей одновременно, а также предотвращать операции, способные нарушить установленную бизнес-логику [16, C. 115].</p>
			<p>DraftValidator интегрируется с DraftProperty через механизм перехвата операций — при попытке записи DraftProperty вызывает соответствующий валидатор, передаёт ему новое значение и контекст черновика; только при успешном прохождении всех проверок DraftProperty продолжает операцию записи [17, C. 83]. На рисунке 5 показан процесс валидации: DraftProperty перехватывает запрос клиента, делегирует проверку DraftValidator и только затем, при успешной валидации, выполняет запись в черновик, тем самым исключая сохранение некорректного состояния.</p>
			<fig id="F5">
				<label>Figure 5</label>
				<caption>
					<p>Процесс валидации данных</p>
				</caption>
				<alt-text>Процесс валидации данных</alt-text>
				<graphic ns0:href="/media/images/2026-04-13/4b2f93bb-62f1-4871-a5a2-e820841c3c7a.png"/>
			</fig>
			<p>[18, C. 171]</p>
			<p>Реализация валидации предусматривает раннее обнаружение ошибок за счет проактивного подхода, что позволяет своевременно предотвращать возможные проблемы. Процесс сопровождается информативными сообщениями об ошибках, которые полезны как для пользователей, так и для разработчиков. Также обеспечивается поддержка как синхронной, так и асинхронной проверки данных, а валидаторы могут быть комбинированы для реализации сложных бизнес-правил </p>
			<p>[19, C. 59]</p>
			<p>Такой подход к валидации обеспечивает необходимую гибкость при расширении системы и добавлении новых типов черновиков, одновременно поддерживая строгую типизацию и согласованность данных </p>
			<p>[20, C. 141]</p>
			<p>4. Заключение</p>
			<p>Паттерн Draft System предоставляет собой эффективный механизм управления временным состоянием объектов в информационных системах. Его применение особенно целесообразно в системах с комплексной логикой изменения данных и необходимостью валидации перед окончательным сохранением.</p>
			<p>В рамках выполненного системного анализа установлено, что данный паттерн обеспечивает необходимый уровень абстракции для разделения процессов модификации и сохранения данных, что способствует повышению надежности и гибкости архитектуры информационных систем.</p>
			<p>Архитектурная модель, представленная в работе, демонстрирует различные аспекты реализации паттерна: от базовой структуры с компонентами DraftSystem и DraftState до специализированных механизмов управления свойствами через дескрипторы DraftProperty и валидации с помощью DraftValidator.</p>
			<p>В современных условиях развития информационных систем, характеризующихся повышением сложности бизнес-процессов и ростом требований к надежности, паттерн Draft System представляет собой ценный инструмент в арсенале архитектора программного обеспечения.</p>
			<p>Итоговые результаты: сформулированы требования к системам черновиков; предложена архитектурная модель паттерна Draft System; разработан механизм отслеживания изменений на основе контрольных хешей; описаны компоненты DraftProperty и DraftValidator для управляемого доступа и валидации данных черновика.</p>
			<p>Научная новизна: предложена доменно-ориентированная схема, отделяющая подтверждённую сущность от черновых изменений и не зависящая от транзакций и ORM-контекста, с формализацией операций проверки и контролируемой фиксации.</p>
			<p>Оригинальность: объединение в одном паттерне отдельного хранилища изменений, жизненного цикла публикации и механизма хеш-контроля изменений вместе с перехватом записи и централизованной валидацией.</p>
			<p>Его дальнейшее совершенствование включает интеграцию с системами управления версиями, распределенными хранилищами данных и механизмами коллаборативного редактирования.</p>
		</sec>
		<sec sec-type="supplementary-material">
			<title>Additional File</title>
			<p>The additional file for this article can be found as follows:</p>
			<supplementary-material xmlns:xlink="http://www.w3.org/1999/xlink" id="S1" xlink:href="https://doi.org/10.5334/cpsy.78.s1">
				<!--[<inline-supplementary-material xlink:title="local_file" xlink:href="https://research-journal.org/media/articles/22183.docx">22183.docx</inline-supplementary-material>]-->
				<!--[<inline-supplementary-material xlink:title="local_file" xlink:href="https://research-journal.org/media/articles/22183.pdf">22183.pdf</inline-supplementary-material>]-->
				<label>Online Supplementary Material</label>
				<caption>
					<p>
						Further description of analytic pipeline and patient demographic information. DOI:
						<italic>
							<uri>https://doi.org/10.60797/IRJ.2026.166.125</uri>
						</italic>
					</p>
				</caption>
			</supplementary-material>
		</sec>
	</body>
	<back>
		<ack>
			<title>Acknowledgements</title>
			<p/>
		</ack>
		<sec>
			<title>Competing Interests</title>
			<p/>
		</sec>
		<ref-list>
			<ref id="B1">
				<label>1</label>
				<mixed-citation publication-type="confproc">Kleppmann M. Designing Data-Intensive Applications / M. Kleppmann. — Sebastopol, CA: O'Reilly Media, 2017. — 616 p.</mixed-citation>
			</ref>
			<ref id="B2">
				<label>2</label>
				<mixed-citation publication-type="confproc">Turnbull J. The Art of Monitoring / J. Turnbull. — Sebastopol, CA: O'Reilly Media, 2016. — 769 p.</mixed-citation>
			</ref>
			<ref id="B3">
				<label>3</label>
				<mixed-citation publication-type="confproc">Gamma E. Design Patterns: Elements of Reusable Object-Oriented Software / E. Gamma, R. Helm, R. Johnson [et al.]. — Boston, MA: Addison-Wesley, 1994. — 448 p.</mixed-citation>
			</ref>
			<ref id="B4">
				<label>4</label>
				<mixed-citation publication-type="confproc">Fowler M. Patterns of Enterprise Application Architecture / M. Fowler. — Boston, MA: Addison-Wesley, 2002. — 544 p.</mixed-citation>
			</ref>
			<ref id="B5">
				<label>5</label>
				<mixed-citation publication-type="confproc">Evans E. Domain-Driven Design: Tackling Complexity in the Heart of Software / E. Evans. — Boston, MA: Addison-Wesley, 2003. — 560 p.</mixed-citation>
			</ref>
			<ref id="B6">
				<label>6</label>
				<mixed-citation publication-type="confproc">Martin R.C. Clean Architecture: A Craftsman's Guide to Software Structure and Design / R.C. Martin. — Hoboken, NJ: Prentice Hall, 2017. — 432 p.</mixed-citation>
			</ref>
			<ref id="B7">
				<label>7</label>
				<mixed-citation publication-type="confproc">Buschmann F. Pattern-Oriented Software Architecture, Volume 1: A System of Patterns / F. Buschmann, R. Meunier, H. Rohnert [et al.]. — Chichester: John Wiley &amp;amp; Sons, 1996. — 344 p.</mixed-citation>
			</ref>
			<ref id="B8">
				<label>8</label>
				<mixed-citation publication-type="confproc">Vernon V. Implementing Domain-Driven Design / V. Vernon. — Boston, MA: Addison-Wesley, 2013. — 657 p.</mixed-citation>
			</ref>
			<ref id="B9">
				<label>9</label>
				<mixed-citation publication-type="confproc">Nystrom R. Game Programming Patterns / R. Nystrom. — Genever Benning, 2014. — 354 p.</mixed-citation>
			</ref>
			<ref id="B10">
				<label>10</label>
				<mixed-citation publication-type="confproc">Evans E. Domain-Driven Design Distilled / E. Evans, V. Vernon. — Boston, MA: Addison-Wesley, 2016. — 160 p.</mixed-citation>
			</ref>
			<ref id="B11">
				<label>11</label>
				<mixed-citation publication-type="confproc">Sussna J. Designing Delivery: Rethinking IT in the Digital Service Economy / J. Sussna. — Sebastopol, CA: O'Reilly Media, 2015. — 432 p.</mixed-citation>
			</ref>
			<ref id="B12">
				<label>12</label>
				<mixed-citation publication-type="confproc">Newman S. Building Microservices: Designing Fine-Grained Systems / S. Newman. — Sebastopol, CA: O'Reilly Media, 2015. — 624 p.</mixed-citation>
			</ref>
			<ref id="B13">
				<label>13</label>
				<mixed-citation publication-type="confproc">Richards M. Fundamentals of Software Architecture: An Engineering Approach / M. Richards, N. Ford. — Sebastopol, CA: O'Reilly Media, 2020. — 448 p.</mixed-citation>
			</ref>
			<ref id="B14">
				<label>14</label>
				<mixed-citation publication-type="confproc">Hohpe G. Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions / G. Hohpe, B. Woolf. — Boston, MA: Addison-Wesley, 2003. — 650 p.</mixed-citation>
			</ref>
			<ref id="B15">
				<label>15</label>
				<mixed-citation publication-type="confproc">Taibi D. Microservices AntiPatterns and Pitfalls / D. Taibi, V. Lenarduzzi. — Piscataway, NJ: IEEE Press, 2016. — 81 p.</mixed-citation>
			</ref>
			<ref id="B16">
				<label>16</label>
				<mixed-citation publication-type="confproc">Brown W.J. AntiPatterns: Refactoring Software, Architectures, and Projects in Crisis / W.J. Brown, R.C. Malveau, H.W. McCormick [et al.]. — Chichester: John Wiley &amp;amp; Sons, 1998. — 309 p.</mixed-citation>
			</ref>
			<ref id="B17">
				<label>17</label>
				<mixed-citation publication-type="confproc">Kruchten P. The Rational Unified Process: An Introduction / P. Kruchten. — 3rd ed. — Boston, MA: Addison-Wesley, 2004. — 310 p.</mixed-citation>
			</ref>
			<ref id="B18">
				<label>18</label>
				<mixed-citation publication-type="confproc">Larman C. Applying UML and Patterns: An Introduction to Object-Oriented Analysis and Design / C. Larman. — 3rd ed. — Upper Saddle River, NJ: Prentice Hall, 2004. — 736 p.</mixed-citation>
			</ref>
			<ref id="B19">
				<label>19</label>
				<mixed-citation publication-type="confproc">Metz S. Practical Object-Oriented Design: An Agile Primer Using Ruby / S. Metz. — Boston, MA: Addison-Wesley, 2018. — 288 p.</mixed-citation>
			</ref>
			<ref id="B20">
				<label>20</label>
				<mixed-citation publication-type="confproc">Feathers M. Working Effectively with Legacy Code / M. Feathers. — Upper Saddle River, NJ: Prentice Hall, 2004. — 464 p.</mixed-citation>
			</ref>
		</ref-list>
	</back>
	<fundings/>
</article>