<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Форум 'Архитектура программного обеспечения' на RSDN</title>
    <link>http://rsdn.org/Forum/design/</link>
    <description>Форум "Архитектура программного обеспечения" предназначен для обсуждения вопросов, относящихся к стадии проектирования ПО.</description>
    <category>design</category>
    <language>ru-ru</language>
    <copyright>Copyright ©, RSDN, 2001-2007</copyright>
    <webMaster>forum@rsdn.org</webMaster>
    <generator>RSDN RSS Generator 1.3</generator>
    <image>
      <url>http://rsdn.org/rsdn.gif</url>
      <title>RSDN</title>
      <link>http://rsdn.org</link>
    </image>
    <lastBuildDate>Tue, 07 Apr 2026 12:56:03 GMT</lastBuildDate>
    <ttl>5</ttl>
	<item>
		<title>Отмена перехвата консоли дочернего процесса</title>
		<link>http://rsdn.org/Forum/design/9047422.1</link>
		<guid isPermaLink="true">http://rsdn.org/Forum/design/9047422</guid>
		<comments>http://rsdn.org/Forum/design/9047422</comments>
		<wfw:comment>http://rsdn.org/Forum/PostRssComment.aspx?mid=9047422</wfw:comment>
		<wfw:commentRss>http://rsdn.org/Forum/RSS/9047422</wfw:commentRss>
		<trackback:ping>http://rsdn.org/Forum/Trackback.aspx?mid=9047422</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://rsdn.org/Forum/Forum.css);"&gt;Коллеги, всем привет. Случайно возник вот такой вот архитектурно-философский вопрос.&lt;br /&gt;
Сценарий: консольная программа А использует в работе консольную программу Б.&lt;br /&gt;
При этом есть два под-сценария:&lt;br /&gt;
1. К моменту старта А программа Б уже запущена. Тогда она торчит на каком-то порту 127.0.0.1, программа А подключается туда и делает всё необходимое.&lt;br /&gt;
1. К моменту старта А программы Б нет. Тогда А должна сначала запустить Б, и уже потом подключиться.&lt;br /&gt;
Нюанс &amp;mdash; в том, что после окончания работы А программа Б должна продолжить свою работу ещё какое-то время.&lt;br /&gt;
И при этом нам бы хотелось помочь пользователю диагностировать неполадки запуска программы Б. &lt;br /&gt;
Сама Б пишет всё, что с ней происходит, в консоль и в лог-файл.&lt;br /&gt;
Так что если бы пользователь сам запускал Б, то он бы увидел вывод Б в консоль, и если ей что-то мешает запуститься &amp;mdash; там была бы диагностика.&lt;br /&gt;
&lt;br /&gt;
Ок, А в случае если запускает Б, то перехватывает её stout/stderr, и транслирует их пользователю.&lt;br /&gt;
И вот мне ИИ на эту тему говорит: постой, но когда А выйдет, а Б останется работать, то попытки Б писать в консоль могут приводить к E_PIPE.&lt;br /&gt;
На вопрос "и чо делать", ИИ предлагает перестать читать консоль Б, а вместо этого tail-ить лог-файл Б.&lt;br /&gt;
Но юмор в том, что одна из возможных причин неудачи старта Б &amp;mdash; отсутствие прав на запись в дефолтный каталог лога &lt;img border='0' width='15' height='15' src='//rsdn.org/Forum/images/smile.gif' /&gt;&lt;br /&gt;
&lt;br /&gt;
В связи с чем, собственно, вопрос &amp;mdash; &lt;b&gt;есть ли кросс-платформенный способ аккуратно отключиться от stdout дочернего процесса&lt;/b&gt;?&lt;/div&gt;
				
		</description>
		
		<category>design</category>
		<pubDate>Sun, 18 Jan 2026 12:03:56 GMT</pubDate>
		
			<author>Sinclair &lt;forum@rsdn.org&gt;</author>
		
		
			<slash:comments>13</slash:comments>
		
	</item>

	<item>
		<title>[Clean Architecture] Как доставать настройки эндпоинта из БД</title>
		<link>http://rsdn.org/Forum/design/9028902.1</link>
		<guid isPermaLink="true">http://rsdn.org/Forum/design/9028902</guid>
		<comments>http://rsdn.org/Forum/design/9028902</comments>
		<wfw:comment>http://rsdn.org/Forum/PostRssComment.aspx?mid=9028902</wfw:comment>
		<wfw:commentRss>http://rsdn.org/Forum/RSS/9028902</wfw:commentRss>
		<trackback:ping>http://rsdn.org/Forum/Trackback.aspx?mid=9028902</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://rsdn.org/Forum/Forum.css);"&gt;Как известно, в чистой архитектуре, есть три вида компонент:&lt;br /&gt;
&amp;mdash; input adapter (например, эндпоинт http api)&lt;br /&gt;
&amp;mdash; use case c логикой приложения&lt;br /&gt;
&amp;mdash; output adapter (например, repository БД)&lt;br /&gt;
&lt;br /&gt;
Обычно последовательность вызовов такая: input adapter -&amp;gt; use case -&amp;gt; repository&lt;br /&gt;
&lt;br /&gt;
Но что делать, если некоторые настройки для input adapter находятся в БД, т.е. для работы input adapter нужно получить данные из repository&lt;br /&gt;
&lt;br /&gt;
Примеры:&lt;br /&gt;
&amp;mdash; проверка идемпотентности (ключи хранятся в БД)&lt;br /&gt;
&amp;mdash; фиче-флаг, отключающий эндпоинт (флаг хранится в БД)&lt;br /&gt;
&amp;mdash; проверка прав доступа (права доступа хранятся в БД)&lt;br /&gt;
&amp;mdash; rate limiter хитрый (настройки хранятся в БД)&lt;br /&gt;
&lt;br /&gt;
Варианты, как я вижу:&lt;br /&gt;
&amp;mdash; перенести логику проверки из input adapter в use case. Минус &amp;mdash; логика приложения может загрязняться деталями инфры&lt;br /&gt;
&amp;mdash; ходить за настройкам из input adapter напрямую в репозиторий. Минус &amp;mdash; на каждый вызов будет две транзакция &amp;mdash; для получения настроек и для выполнения use case (хотя одна может быть к RO, вторая к RW)&lt;br /&gt;
&amp;mdash; делать псевдо-юскейсы для получения настроек. Минус &amp;mdash; те же, что и в предыдущем пункте.&lt;br /&gt;
&lt;br /&gt;
Как делать лучше/проще/понятнее?&lt;/div&gt;
				
		</description>
		
		<category>design</category>
		<pubDate>Wed, 10 Dec 2025 18:26:56 GMT</pubDate>
		
			<author>Буравчик &lt;forum@rsdn.org&gt;</author>
		
		
			<slash:comments>5</slash:comments>
		
	</item>

	<item>
		<title>API vs ABI</title>
		<link>http://rsdn.org/Forum/design/9027580.1</link>
		<guid isPermaLink="true">http://rsdn.org/Forum/design/9027580</guid>
		<comments>http://rsdn.org/Forum/design/9027580</comments>
		<wfw:comment>http://rsdn.org/Forum/PostRssComment.aspx?mid=9027580</wfw:comment>
		<wfw:commentRss>http://rsdn.org/Forum/RSS/9027580</wfw:commentRss>
		<trackback:ping>http://rsdn.org/Forum/Trackback.aspx?mid=9027580</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://rsdn.org/Forum/Forum.css);"&gt;А в чем отличие? Это типа если пишешь библиотеку в стиле С &amp;mdash; то есть без всяких классов &amp;mdash; это АБИ? То есть будет цепляться к любому языку и платформе? А если классы чисто для конкретного языка, то АПИ?&lt;/div&gt;
				
		</description>
		
		<category>design</category>
		<pubDate>Sun, 07 Dec 2025 07:59:13 GMT</pubDate>
		
			<author>Hоmunculus &lt;forum@rsdn.org&gt;</author>
		
		
			<slash:comments>25</slash:comments>
		
	</item>

	<item>
		<title>Что если не разделять строго dto, entity, bo...</title>
		<link>http://rsdn.org/Forum/design/9024436.1</link>
		<guid isPermaLink="true">http://rsdn.org/Forum/design/9024436</guid>
		<comments>http://rsdn.org/Forum/design/9024436</comments>
		<wfw:comment>http://rsdn.org/Forum/PostRssComment.aspx?mid=9024436</wfw:comment>
		<wfw:commentRss>http://rsdn.org/Forum/RSS/9024436</wfw:commentRss>
		<trackback:ping>http://rsdn.org/Forum/Trackback.aspx?mid=9024436</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://rsdn.org/Forum/Forum.css);"&gt;Вопрос такой.&lt;br /&gt;
&lt;br /&gt;
Вот, обычно делают слои и на уровне каждого слоя свои объект &amp;mdash; для строгого разделения. А потом мапперы между слоями.&lt;br /&gt;
&lt;br /&gt;
И у меня сейчас проект, который нужно дорабатывать. Там этой парадигмы разделения не придерживались строго, так что в ui проникают как dto, так и entity. Проект пока не большой, около 25 тыс. строк кода, т.е. за пару-тройку дней можно разделить и добавить мапперы.&lt;br /&gt;
&lt;br /&gt;
Но задумался &amp;mdash; а какие реальные бонусы? Вот что пишет зазнайка:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class='q'&gt;&lt;p&gt;&lt;b&gt;Если использовать DTO в Домене&lt;/b&gt;: Ваша бизнес-логика становится зависимой от API-контрактов. Если фронтенд попросит переименовать поле в JSON для удобства отображения, вам придется менять это поле в бизнес-логике, что может повлечь ошибки в расчетах. Внешний мир начинает диктовать правила внутреннему.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Если использовать Entity в Домене&lt;/b&gt;: Ваша бизнес-логика зависит от схемы базы данных. Если вы решите денормализовать таблицу для производительности или сменить PostgreSQL на MongoDB, вам придется переписывать бизнес-правила.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Правило архитектуры&lt;/b&gt;: Зависимости должны быть направлены внутрь. Слой Домена (бизнес-логика) должен быть самым стабильным и не зависеть ни от Базы Данных, ни от UI/API.&lt;/p&gt;&lt;/blockquote&gt;
&lt;br /&gt;
Но на практике вот что. Если что-то нужно добавить в UI &amp;mdash; можно использовать расширения/mixin. И что? Никакой сложности не добавляет.&lt;br /&gt;
&lt;br /&gt;
Если что-то изменилось в API &amp;mdash; то один хрен нужно менять все слои. Но если добавилось новое поле и мы его не используем &amp;mdash; то и в текущей схеме ничего не сломается.&lt;br /&gt;
&lt;br /&gt;
Если изменилась схема хранения данных, к примеру переименовали поле &amp;mdash; то сейчас нужно в двух местах переименовать &amp;mdash; в entity и в ui, где этот entity напрямую используется. Если добавим мапперы &amp;mdash; легче не станет.&lt;br /&gt;
&lt;br /&gt;
Далее. Если добавим тесты и фейковые реализации сервисов &amp;mdash; то что мешает в этих фейковых реализациях использовать уже существующие классы для объектов, ведь у них есть конструктор...&lt;br /&gt;
&lt;br /&gt;
По этому как бы, получается, есть вера что нужно разделять &amp;mdash; но нет реального смысла.&lt;/div&gt;
				
		</description>
		
		<category>design</category>
		<pubDate>Fri, 28 Nov 2025 17:47:22 GMT</pubDate>
		
			<author>Shmj &lt;forum@rsdn.org&gt;</author>
		
		
			<slash:comments>210</slash:comments>
		
	</item>

	<item>
		<title>Репозиторий. Как сделать поиск с исключением</title>
		<link>http://rsdn.org/Forum/design/9014899.1</link>
		<guid isPermaLink="true">http://rsdn.org/Forum/design/9014899</guid>
		<comments>http://rsdn.org/Forum/design/9014899</comments>
		<wfw:comment>http://rsdn.org/Forum/PostRssComment.aspx?mid=9014899</wfw:comment>
		<wfw:commentRss>http://rsdn.org/Forum/RSS/9014899</wfw:commentRss>
		<trackback:ping>http://rsdn.org/Forum/Trackback.aspx?mid=9014899</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://rsdn.org/Forum/Forum.css);"&gt;Здравствуйте!&lt;br /&gt;
&lt;br /&gt;
Есть небольшая программа. Сделана в целом по принципам "внедрения зависимостей" и "чистой архитектуры".&lt;br /&gt;
&lt;br /&gt;
Что надо сделать.&lt;br /&gt;
&lt;br /&gt;
Бизнес-операция (usecase) должна выполнить необычный поиск по Репозиторию неких Сущностей (в нашем случае, сущности &amp;mdash; это юридические лица). &lt;br /&gt;
Поиск выполняется по нескольким "критериям" поиска. Каждый "критерий" &amp;mdash; это произвольный набор полей Сущности и их значения ("Поле" &amp;mdash; "Значение").&lt;br /&gt;
Например:&lt;br /&gt;
&amp;mdash; Критерий-1: "краткое название" = "Ромашка", "ИНН" = "11223344556600"&lt;br /&gt;
&amp;mdash; Критерий-2: "юридическое наименование" = "ООО Ромашка", "регион регистрации" = "Москва"&lt;br /&gt;
&amp;mdash; Критерий-3: "ИНН" = "55667788443322", "КПП" = "6010200001"&lt;br /&gt;
&lt;br /&gt;
Одно и тоже юрлицо может быть найдено по разным критериям. Например, и по первому критерию и по второму критерию.&lt;br /&gt;
Особенность поиска в том, что после поиска по какому-то Критерию из дальнейшего поиска исключаются сущности, найденные по этому критерию.&lt;br /&gt;
То есть алгоритм должен быть примерно таким:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class='c'&gt;&lt;code&gt;&lt;span class='kw'&gt;var&lt;/span&gt; repository = &lt;span class='kw'&gt;new&lt;/span&gt; Repository();
&lt;span class='kw'&gt;var&lt;/span&gt; criteria_array = &lt;span class='kw'&gt;new&lt;/span&gt; Criteria[];
&lt;span class='com'&gt;// заполнение массива Критериев&lt;/span&gt;

&lt;span class='kw'&gt;foreach&lt;/span&gt; (&lt;span class='kw'&gt;var&lt;/span&gt; criteria &lt;span class='kw'&gt;in&lt;/span&gt; criteria_array)
{
    &lt;span class='kw'&gt;var&lt;/span&gt; found_entities = repository.FindByCriteria(criteria);

    ...
    &lt;span class='com'&gt;// исключаем найденные сущности из дальнейшего поиска на следующем витке цикла - как???&lt;/span&gt;
    ...

    &lt;span class='com'&gt;// добавляем найденные сущности в отдельную кеш-таблицу, в которой есть дополнительная колонка "Критерий"
    // для каждой сущности запоминаем критерий, по которому была найдена эта сущность&lt;/span&gt;
    cashe_table.Add(found_entities, criteria);
}

process_list = cashe_table.GetAll();
&lt;span class='kw'&gt;foreach&lt;/span&gt; (&lt;span class='kw'&gt;var&lt;/span&gt; entity &lt;span class='kw'&gt;in&lt;/span&gt; process_list)
{
    &lt;span class='kw'&gt;if&lt;/span&gt; (entity.search_criteria.dostovernost = 1)
        algorithm1(entity);
    elseif (entity.search_criteria.dostovernost = 2)
        algorithm2(entity);
    ....
}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
Пример. Предположим, в БД есть юридическое лицо со следующими полями:&lt;br /&gt;
&amp;mdash; "юридическое наименование" = "ООО Ромашка"&lt;br /&gt;
&amp;mdash; "краткое название" = "Ромашка"&lt;br /&gt;
&amp;mdash; "регион регистрации" = "Москва"&lt;br /&gt;
&amp;mdash; "ИНН" = "11223344556600".&lt;br /&gt;
Это юридическое лицо может быть найдено по Критерию-1 и по Критерию-2.&lt;br /&gt;
Однако, нам нужно, чтобы после нахождения по Критерию-1, это юрлицо не попало в выборку по Критерию-2.&lt;br /&gt;
То есть, найденные юрлица исключаются из следующих поисков. То есть это постоянно "сужающийся" поиск.&lt;br /&gt;
&lt;br /&gt;
Объясню зачем нужен такой "сложный" поиск.&lt;br /&gt;
&lt;br /&gt;
Грубо &amp;mdash; в зависимости от того критерия, по которому отобраны сущности, выполняются разные обработки над выборками.&lt;br /&gt;
У каждого критерия есть признак "вес достоверности". &lt;br /&gt;
Например, самый "достоверный" &amp;mdash; это Критреий-1. Юрлица, найденные по этому критерию являются "достоверными" и они обрабатываются по одному алгоритму.&lt;br /&gt;
Юрлица, найденные по следующему критерию, менее достоверные, их надо обрабатывать по алгоритму-2. И т.д.&lt;br /&gt;
&lt;br /&gt;
Проблема в том, что результаты поиска по каждому критерию пересекающиеся.&lt;br /&gt;
То есть одно и тоже юрлицо может попасть в выборку и по Критерию-1 и по Критерию-2 и по другим Критериям. &lt;br /&gt;
Но обработано юрлицо должно быть по наиболее "достоверному" Критерию и соответствующему алгоритму.&lt;br /&gt;
То есть, если юрлицо попало в выборку по более "достоверному" Критерию-1, то оно должно быть обработано по Алгоритму-1. Нет смысла рассматривать это юрлицо по другим Критериям. Поэтому из поиска по другим Критериям это юрлицо надо как-то исключить.&lt;br /&gt;
&lt;br /&gt;
Вопрос: как при поиске по следующему в массиве Критерию-(n) "отсечь" из результата поиска те сущности, которые были найдены при поиске по предыдущим Критериям?&lt;br /&gt;
&lt;br /&gt;
Была мысль сделать это "топорно": сначала читаем все сущности во временную таблицу, в которой есть поле-"флажок".&lt;br /&gt;
Поиск по Критериям выполняем по этой временной таблице. И после поиска по каждому Критерию для найденных сущностей "включаем" этот "флажок".&lt;br /&gt;
При поиске по каждому критерию добавляем в условия поиска кроме самого критерия дополнительное условие "флажок" = "выключен".&lt;br /&gt;
&lt;br /&gt;
Но нам этот подход кажется сомнительным.&lt;br /&gt;
&lt;br /&gt;
Посоветуйте плиз как сделать грамотно в русле разделения слоев и "чистой архитектуры".&lt;/div&gt;
				
		</description>
		
		<category>design</category>
		<pubDate>Thu, 06 Nov 2025 07:00:31 GMT</pubDate>
		
			<author>zelenprog &lt;forum@rsdn.org&gt;</author>
		
		
			<slash:comments>10</slash:comments>
		
	</item>

	<item>
		<title>Что почитать про архитектуру тяжёлых настолок?</title>
		<link>http://rsdn.org/Forum/design/9002954.1</link>
		<guid isPermaLink="true">http://rsdn.org/Forum/design/9002954</guid>
		<comments>http://rsdn.org/Forum/design/9002954</comments>
		<wfw:comment>http://rsdn.org/Forum/PostRssComment.aspx?mid=9002954</wfw:comment>
		<wfw:commentRss>http://rsdn.org/Forum/RSS/9002954</wfw:commentRss>
		<trackback:ping>http://rsdn.org/Forum/Trackback.aspx?mid=9002954</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://rsdn.org/Forum/Forum.css);"&gt;CAD, IDE, всякие текстовые редакторы. Можно долго не думать и сделать клиент-сервер, слабую связность везде, но два вопроса:&lt;br /&gt;
&lt;br /&gt;
1. Накладные расходы -&amp;gt; теряется скорость отклика.&lt;br /&gt;
2. Как задавать зависимости между компонентами? Например, есть компоненты А и B. Если А работает, то B должен подождать. Но для этого B должен знать про существование А, а это уже не слабая связность. Можнно вввести блокировки ресурсов, конечно, но это банальные варианты из головы, потому что я не проектировал такие штуки никогда. &lt;br /&gt;
&lt;br /&gt;
Что можно почитать на тему проектирования таких штук?&lt;/div&gt;
				
		</description>
		
		<category>design</category>
		<pubDate>Thu, 09 Oct 2025 07:28:00 GMT</pubDate>
		
			<author>cppguard &lt;forum@rsdn.org&gt;</author>
		
		
			<slash:comments>28</slash:comments>
		
	</item>

	<item>
		<title>Вопрос о передачи данных между приложениями</title>
		<link>http://rsdn.org/Forum/design/8988655.1</link>
		<guid isPermaLink="true">http://rsdn.org/Forum/design/8988655</guid>
		<comments>http://rsdn.org/Forum/design/8988655</comments>
		<wfw:comment>http://rsdn.org/Forum/PostRssComment.aspx?mid=8988655</wfw:comment>
		<wfw:commentRss>http://rsdn.org/Forum/RSS/8988655</wfw:commentRss>
		<trackback:ping>http://rsdn.org/Forum/Trackback.aspx?mid=8988655</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://rsdn.org/Forum/Forum.css);"&gt;Добрый день коллеги!&lt;br /&gt;
&lt;br /&gt;
Возник вопрос в части реализации одной задачки.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Начнем с того, что у нас есть. &lt;/b&gt;&lt;br /&gt;
В свое время наша фирма разработала по ТЗ заказчика вспомогательную программу, одна из функций которой была работа с аппаратными средствами). &lt;br /&gt;
Программа написана на С++.  Программу внедрили и сдали клиенту в 1998г. По мере поступления запросов от клиента, функционал проги дописывался. &lt;br /&gt;
Теперь о главном. Во время внедрения программы у клиента, часто возникала проблема с данными передаваемыми аппаратным средствам.  &lt;br /&gt;
Для контроля за передаваемыми данными с нашей стороны была написана DD.DLL, которая записывала лог передаваемых данных(в dd.dll только одна функция csr_DbgWriteData(char*).&lt;br /&gt;
В функцию передается строка с данными). При запуске программы, программа ищет DD.DLL, динамически ее загружает и записывает данные в файл.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Теперь о проблеме&lt;/b&gt;&lt;br /&gt;
Часть ошибок нашли и исправили. Но осталась группа ошибок которые периодически "вылазят" еще, и которые можно выявить только анализируя  принимаемые и передаваемые данные  аппаратуре. &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Что хочется сделать&lt;/b&gt;&lt;br /&gt;
Хочется написать отдельную программу, которая в реальном времени получает внутренние данные из нашей DD.DLL(т.е. из нашей основной программы). Проводит анализ полученных данных и визуализирует полученную информацию.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Что у нас есть, что можем, как хочется сделать&lt;/b&gt; &lt;br /&gt;
Мы можем передать указатель на класс, который содержит внутренние данные программы в нашу функцию (перепишем функцию csr_DbgWriteData(char*, CCSR*) )&lt;br /&gt;
Закидываем нашу DD.DLL в каталог программы.&lt;br /&gt;
Запускаем приложение клиента. В момент передачи и приема данных находим DD.DLL  динамически ее загружаем. По необходимости вызываем DbgWriteData. После завершения процесса обмена данными выгружаем нашу DLL.&lt;br /&gt;
Класс CCSR содержит данные, многие из которых являются указателями на классы или структуры данных(собственная реализация LIST).&lt;br /&gt;
&lt;br /&gt;
Вопрос&lt;br /&gt;
Как наилучшим образом организовать передачу данных между процессами(между основной программой(а точнее сказать DD.DLL) и новым приложением) с учетом что это указатели на данные? &lt;br /&gt;
Причем разработка дополнительной новой программы будет вестись на Visual Studio 6.&lt;/div&gt;
				
		</description>
		
		<category>design</category>
		<pubDate>Tue, 09 Sep 2025 13:16:50 GMT</pubDate>
		
			<author>wbear &lt;forum@rsdn.org&gt;</author>
		
		
			<slash:comments>6</slash:comments>
		
	</item>

	<item>
		<title>Как лучше задизайнить?</title>
		<link>http://rsdn.org/Forum/design/8987378.1</link>
		<guid isPermaLink="true">http://rsdn.org/Forum/design/8987378</guid>
		<comments>http://rsdn.org/Forum/design/8987378</comments>
		<wfw:comment>http://rsdn.org/Forum/PostRssComment.aspx?mid=8987378</wfw:comment>
		<wfw:commentRss>http://rsdn.org/Forum/RSS/8987378</wfw:commentRss>
		<trackback:ping>http://rsdn.org/Forum/Trackback.aspx?mid=8987378</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://rsdn.org/Forum/Forum.css);"&gt;Есть несколько огромных структур данных. И граф, каждый нод которого или генерит одну из таких структур или как-то принимает эти структуры от других нод, что-то меняет в них, может сливает несколько в одну, или разделяет и отдает на следующие изменения. &lt;br /&gt;
&lt;br /&gt;
Еще важный момент &amp;mdash; в каждой ноде данные лежат не кусками по памяти, а сплошным куском. Они в видюху перебрасываются. &lt;br /&gt;
&lt;br /&gt;
Штука в том, чтобы малейшее изменение в одной из нод мгновенно бы отображалось в зависящих от нее нодах. &lt;br /&gt;
&lt;br /&gt;
Копирование всего и вся и распространение сигналов на изменения &amp;mdash; крайне неэффективно. &lt;br /&gt;
Если делать через ссылки на данные &amp;mdash; нарушается условие связности данных. &lt;br /&gt;
&lt;br /&gt;
Как быть?&lt;/div&gt;
				
		</description>
		
		<category>design</category>
		<pubDate>Sat, 06 Sep 2025 04:29:14 GMT</pubDate>
		
			<author>Hоmunculus &lt;forum@rsdn.org&gt;</author>
		
		
			<slash:comments>15</slash:comments>
		
	</item>

	<item>
		<title>Глобальное состояние приложения - хорошая ли идея?</title>
		<link>http://rsdn.org/Forum/design/8987369.1</link>
		<guid isPermaLink="true">http://rsdn.org/Forum/design/8987369</guid>
		<comments>http://rsdn.org/Forum/design/8987369</comments>
		<wfw:comment>http://rsdn.org/Forum/PostRssComment.aspx?mid=8987369</wfw:comment>
		<wfw:commentRss>http://rsdn.org/Forum/RSS/8987369</wfw:commentRss>
		<trackback:ping>http://rsdn.org/Forum/Trackback.aspx?mid=8987369</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://rsdn.org/Forum/Forum.css);"&gt;Вот, обычно работаю с бекэндом, но последние несколько месяцев завязался с приложением Flutter &amp;mdash; т.е. фактически это фронт.&lt;br /&gt;
&lt;br /&gt;
И как-то такая хорошая мысля пришла опосля &amp;mdash; а было бы здорово иметь единственный глобальный объект, который представляет весь срез данных (текущий) для UI. Т.е. все те данные, которые могут быть видимы пользователем через формы. При этом часть данных может быть не загружена и т.д.&lt;br /&gt;
&lt;br /&gt;
Начал делать стандартным способом через flutter_bloc &amp;mdash; много отдельных объектов состояний &amp;mdash; для каждой формы свое состояние (а то и несколько для разных частей формы). И глобально они никак не объединены. Якобы считается что это лучше, т.к. божественный объект (God object) это плохо.&lt;br /&gt;
&lt;br /&gt;
Но на самом деле понял как было бы здорово иметь единый объект структурированный, который отображает все UI &amp;mdash; все возможные открытые формы (если не открывали или закрыли навсегда &amp;mdash; то конкретное поле пустое).&lt;br /&gt;
&lt;br /&gt;
Сначала показалось плохой идеей, вроде там много всего будет. А на самом деле не так много. Вот даже на примере этого сайта &amp;mdash; много ли тут форм? Всегда будет одна и только одна форма для отображения списка сообщений (если открываем новую вкладку/окно &amp;mdash; то это отдельный объект состояний а новое сообщение пишем в той же вкладке). Всегда будет одна и только одна форма для отображения текущего сообщения.&lt;br /&gt;
&lt;br /&gt;
Т.е. фактически ну пусть даже 25 полей будет в этом классе (дерево список форумов, текущий форум, текущий список сообщений, текущее сообщение и т.д.). 25 это не много. Да даже 50 полей не много, и 100 норм. Но это очень очень редко какая прога будет иметь так много форм разных типов, скорее будет всего 10-15 полей в среднем (естественно &amp;mdash; внутри них свои сложные объекты или списки таких объектов).&lt;br /&gt;
&lt;br /&gt;
Плюс этого всего: сразу видна структура данных приложения. И когда одни данные связаны с другими &amp;mdash; ты сразу в одном месте это видишь и можешь обновить связанные данные.&lt;br /&gt;
&lt;br /&gt;
Естественно в состоянии нет ничего связанного с UI &amp;mdash; ни виджетов ни вспомогательных UI-текстов.&lt;br /&gt;
&lt;br /&gt;
Минус кажущийся &amp;mdash; что много данных будет в этом объекте. А на самом деле нет &amp;mdash; даже 1 Мб. редко будет (а что такое 1 Мб для современного телефона даже с минимумом 4 Гб. ОЗУ). Данных много не будет, т.к. храните только текущий срез как бы, текущую одну страницу, которую видит пользователь. То что уже не актуально &amp;mdash; подчищаете.&lt;br /&gt;
&lt;br /&gt;
Плюс &amp;mdash; у вас как бы справочник всех данных, которые могут быть и связаны и изменение одного требовать обновления другого. Все как на ладони как бы.&lt;br /&gt;
&lt;br /&gt;
Применяете ли? Думали ли об этом?&lt;/div&gt;
				
		</description>
		
		<category>design</category>
		<pubDate>Sat, 06 Sep 2025 02:54:24 GMT</pubDate>
		
			<author>Shmj &lt;forum@rsdn.org&gt;</author>
		
		
			<slash:comments>10</slash:comments>
		
	</item>

	<item>
		<title>Про паттерны управления UI</title>
		<link>http://rsdn.org/Forum/design/8973864.1</link>
		<guid isPermaLink="true">http://rsdn.org/Forum/design/8973864</guid>
		<comments>http://rsdn.org/Forum/design/8973864</comments>
		<wfw:comment>http://rsdn.org/Forum/PostRssComment.aspx?mid=8973864</wfw:comment>
		<wfw:commentRss>http://rsdn.org/Forum/RSS/8973864</wfw:commentRss>
		<trackback:ping>http://rsdn.org/Forum/Trackback.aspx?mid=8973864</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://rsdn.org/Forum/Forum.css);"&gt;Вот, саму верстку форм вроде обсудили. Лучшее к чему пришло человечество можно назвать: &lt;b&gt;декларативный UI с функциональной интеграцией&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
Это все самые передовые фрейморки &amp;mdash; такие как Flutter, Jetpack Compose, SwiftUI, React. Т.е. все самое передовое и современное &amp;mdash; авангард вертски можно сказать. Чистый декларативный дедовский подход не удобен и существует только как легаси.&lt;br /&gt;
&lt;br /&gt;
Что же касается управления этим UI &amp;mdash; то что все-таки лучше на ваш взгляд?&lt;br /&gt;
&lt;br /&gt;
&lt;table class='formatter' border='0' cellspacing='2' cellpadding='5'&gt;  &lt;tr class='formatter'&gt;    &lt;th class='formatter'&gt;Подход&lt;/th&gt;    &lt;th class='formatter'&gt;Часто используется в&lt;/th&gt;  &lt;/tr&gt;  &lt;tr class='formatter'&gt;    &lt;td class='formatter'&gt;MVC&lt;/td&gt;    &lt;td class='formatter'&gt;ASP.NET, Django, Ruby on Rails&lt;/td&gt;  &lt;/tr&gt;  &lt;tr class='formatter'&gt;    &lt;td class='formatter'&gt;MVP&lt;/td&gt;    &lt;td class='formatter'&gt;Android (раньше), WinForms&lt;/td&gt;  &lt;/tr&gt;  &lt;tr class='formatter'&gt;    &lt;td class='formatter'&gt;MVVM&lt;/td&gt;    &lt;td class='formatter'&gt;WPF, Xamarin, Flutter&lt;/td&gt;  &lt;/tr&gt;  &lt;tr class='formatter'&gt;    &lt;td class='formatter'&gt;Redux / UDF&lt;/td&gt;    &lt;td class='formatter'&gt;React, Angular, Flutter&lt;/td&gt;  &lt;/tr&gt;  &lt;tr class='formatter'&gt;    &lt;td class='formatter'&gt;BLoC&lt;/td&gt;    &lt;td class='formatter'&gt;Flutter&lt;/td&gt;  &lt;/tr&gt;  &lt;tr class='formatter'&gt;    &lt;td class='formatter'&gt;Elm / TEA&lt;/td&gt;    &lt;td class='formatter'&gt;Elm, Flutter&lt;/td&gt;  &lt;/tr&gt;  &lt;tr class='formatter'&gt;    &lt;td class='formatter'&gt;Clean Architecture&lt;/td&gt;    &lt;td class='formatter'&gt;Любые масштабируемые проекты&lt;/td&gt;  &lt;/tr&gt;&lt;/table&gt;Вот, поработал с BLoC. Вроде норм, но даже банальный диалог для подтверждения действия &amp;mdash; как бы уже добавляет лишней работы. Т.е. прямо в логике (в bloc диалог вызвать нельзя), значит нужно добавить доп. состояние &amp;mdash; требуется отобразить диалог, потом событие от диалога, потом обработку события и т.д. Как бы нет той простоты &amp;mdash; когда 1 строчкой отобразил диалог и дальше продолжил выполнять код &lt;img border='0' width='15' height='15' src='//rsdn.org/Forum/images/frown.gif' /&gt;&lt;br /&gt;
&lt;br /&gt;
Что вы используете и что лучшее на ваш взгляд?&lt;/div&gt;
				
		</description>
		
		<category>design</category>
		<pubDate>Tue, 05 Aug 2025 11:51:04 GMT</pubDate>
		
			<author>Shmj &lt;forum@rsdn.org&gt;</author>
		
		
			<slash:comments>38</slash:comments>
		
	</item>

	<item>
		<title>Валидация на фронте</title>
		<link>http://rsdn.org/Forum/design/8952200.1</link>
		<guid isPermaLink="true">http://rsdn.org/Forum/design/8952200</guid>
		<comments>http://rsdn.org/Forum/design/8952200</comments>
		<wfw:comment>http://rsdn.org/Forum/PostRssComment.aspx?mid=8952200</wfw:comment>
		<wfw:commentRss>http://rsdn.org/Forum/RSS/8952200</wfw:commentRss>
		<trackback:ping>http://rsdn.org/Forum/Trackback.aspx?mid=8952200</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://rsdn.org/Forum/Forum.css);"&gt;Есть b2b приложение react, в нем есть несколько достаточно сложных форм. Раньше считалось что бизнес логику на фронте лучше не светить,&lt;br /&gt;
но вот тут напращивается некоторая валидация на фронте.&lt;br /&gt;
Вопроса 2. На фронте что допустимо валидировать, а что нет?&lt;br /&gt;
Какие то есть гайды как валидировать на фронте: паттерны, готовые либы или достаточно вызвать на фронте сделать метод Validate куда передать модель которая пойдет на бэк?&lt;/div&gt;
				
		</description>
		
		<category>design</category>
		<pubDate>Thu, 19 Jun 2025 09:03:40 GMT</pubDate>
		
			<author>peer &lt;forum@rsdn.org&gt;</author>
		
		
			<slash:comments>1</slash:comments>
		
	</item>

	<item>
		<title>Побочка микросервисов или неверный дизайн?</title>
		<link>http://rsdn.org/Forum/design/8935759.1</link>
		<guid isPermaLink="true">http://rsdn.org/Forum/design/8935759</guid>
		<comments>http://rsdn.org/Forum/design/8935759</comments>
		<wfw:comment>http://rsdn.org/Forum/PostRssComment.aspx?mid=8935759</wfw:comment>
		<wfw:commentRss>http://rsdn.org/Forum/RSS/8935759</wfw:commentRss>
		<trackback:ping>http://rsdn.org/Forum/Trackback.aspx?mid=8935759</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://rsdn.org/Forum/Forum.css);"&gt;Тут буквально за пару недель в 3 популярных сервисах столкнулся с неактуальностью данных, а после знакомства с микросервисами понял, что такая вещь там нормально.&lt;br /&gt;
у тинькова в приложении при переводе на скрине перевода текущая сумма &amp;mdash; сумма перевода != остатку (не учитывалась сумма последней операции)&lt;br /&gt;
у озона в заказе неверно показывалась дата доставки на странице заказов, но если перейти в страницу заказа самого то всё корректно показывалось&lt;br /&gt;
на sports.ru вчера вот вчера матч Ростов &amp;mdash; Зенит показывал 0 &amp;mdash; 1 но показывались голы как Зенита так и Ростова, но гол Ростова был отменен, но он висел больше 10 минут на странице даже после ф5.&lt;br /&gt;
&lt;br /&gt;
собственно, получается пользователи думают баги, а по факту просто надо к этому привыкать?&lt;/div&gt;
				
		</description>
		
		<category>design</category>
		<pubDate>Mon, 19 May 2025 06:29:25 GMT</pubDate>
		
			<author>busk &lt;forum@rsdn.org&gt;</author>
		
		
			<slash:comments>13</slash:comments>
		
	</item>

	<item>
		<title>Про обработку ошибок - типовые решения</title>
		<link>http://rsdn.org/Forum/design/8924062.1</link>
		<guid isPermaLink="true">http://rsdn.org/Forum/design/8924062</guid>
		<comments>http://rsdn.org/Forum/design/8924062</comments>
		<wfw:comment>http://rsdn.org/Forum/PostRssComment.aspx?mid=8924062</wfw:comment>
		<wfw:commentRss>http://rsdn.org/Forum/RSS/8924062</wfw:commentRss>
		<trackback:ping>http://rsdn.org/Forum/Trackback.aspx?mid=8924062</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://rsdn.org/Forum/Forum.css);"&gt;Задумался об идеологически правильной обработке ошибок (исключительных ситуаций) в приложениях для обычных пользователей.&lt;br /&gt;
&lt;br /&gt;
Конечный итог ошибки может быть таким:&lt;br /&gt;
&lt;br /&gt;
1. &lt;b&gt;Подсветить поле&lt;/b&gt; с неверно введенными данными. Самый мягкий случай, когда ошибка ввода данных. Нужно сделать без перехода и диалогов.&lt;br /&gt;
2. Отобразить пользователю &lt;b&gt;диалог&lt;/b&gt; модальный, когда ошибка важная и требует чтобы пользователь увидел.&lt;br /&gt;
4. Отобразить &lt;b&gt;всплывающее окошко&lt;/b&gt;. Когда ошибка не важна, скрывать будет не верно (хотя бы для целей отладки и светлого будущего программы), но и она особо погоды не строит.&lt;br /&gt;
5. Перевести пользователя в &lt;b&gt;оффлайн-режим&lt;/b&gt;. К примеру, если нет подключения, но программа может работать в оффлайн.&lt;br /&gt;
6. Заставить пользователя пройти повторную авторизацию (&lt;b&gt;переадресовать на форму входа&lt;/b&gt;). Если данные аутентификации отозваны, устарели и пр. Сюда же относим прочие переадресации на формы для обязательного ввода данных (а может быть и не обязательные).&lt;br /&gt;
7. Просто &lt;b&gt;записать данные в лог&lt;/b&gt;/удаленный лог.&lt;br /&gt;
8. Ничего не делать &amp;mdash; &lt;b&gt;проигнорить&lt;/b&gt;, но оборвать текущую операцию.&lt;br /&gt;
9. Возможно &amp;mdash; &lt;b&gt;удалить текущую базу&lt;/b&gt; данных ввиду ее повреждения (если база не критична) или &lt;b&gt;отобразить форму невозможности&lt;/b&gt; продолжения работы ввиду повреждения базы.&lt;br /&gt;
10. Попытаться &lt;b&gt;устранить проблему&lt;/b&gt; автоматически &amp;mdash; как-то устаревший формат файла &amp;mdash; провести приведение к новому формату.&lt;br /&gt;
&lt;br /&gt;
Итого &amp;mdash; дофига разных вариантов какие типы реакций могут быть.&lt;br /&gt;
&lt;br /&gt;
Фактически нужно помнить что каждая &lt;b&gt;КАЖДАЯ&lt;/b&gt; операция может либо завершиться успешно &amp;mdash; либо с ошибкой. Причем нужно правильно отреагировать &amp;mdash; выбрать какой из 10 вариантов применить.&lt;br /&gt;
&lt;br /&gt;
Есть типовые проблемы, которые могут возникнуть в любом приложении &amp;mdash; но очень редко и маловероятно. К примеру, что если я выйду из RSDN, но форму с сообщением не закрою. Потом войду под другим аккаунтом и отправлю сообщение. Под каким пользователем оно опубликуется &amp;mdash; под новым или под старым? А ведь я отвечал на сообщение старого пользователя, там от его имени все. Отож. Вывод:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Каждая операция должна проверять под каким пользователем она была начала и если пользователь в процессе операции изменился &amp;mdash; то оборвать работу (или даже откатить изменения).&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Благо что все эти проблемы возникают не так часто, можно об этом не думать, иначе архитектура усложняется на порядок.&lt;/div&gt;
				
		</description>
		
		<category>design</category>
		<pubDate>Sun, 20 Apr 2025 11:28:02 GMT</pubDate>
		
			<author>Shmj &lt;forum@rsdn.org&gt;</author>
		
		
			<slash:comments>46</slash:comments>
		
	</item>

	<item>
		<title>Выход из однопользовательской программы не так прост...</title>
		<link>http://rsdn.org/Forum/design/8923285.1</link>
		<guid isPermaLink="true">http://rsdn.org/Forum/design/8923285</guid>
		<comments>http://rsdn.org/Forum/design/8923285</comments>
		<wfw:comment>http://rsdn.org/Forum/PostRssComment.aspx?mid=8923285</wfw:comment>
		<wfw:commentRss>http://rsdn.org/Forum/RSS/8923285</wfw:commentRss>
		<trackback:ping>http://rsdn.org/Forum/Trackback.aspx?mid=8923285</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://rsdn.org/Forum/Forum.css);"&gt;Допустим есть программа, в которой может быть залогинен только один пользователь, т.е. нет переключения между аккаунтами &amp;mdash; только Вася или Петя, но не оба одновременно.&lt;br /&gt;
&lt;br /&gt;
Вроде все просто &amp;mdash; вошли, загрузили данные, отображаем.&lt;br /&gt;
&lt;br /&gt;
При выходе &amp;mdash; просто удаляем данные и все тут.&lt;br /&gt;
&lt;br /&gt;
Но дьявол как всегда в деталях...&lt;br /&gt;
&lt;br /&gt;
Во-первых, если пользователь не нажимал явно "выйти" но по каким-либо причинам доступ данным не возможен (пользователь изменил пароль или удалил приложение из доверенных) &amp;mdash; данные удалять не стоит, но при этом нужно перейти на страницу повторного входа. Данные же нужно сохранить, т.к. скорее всего пользователь просто перезайдет.&lt;br /&gt;
&lt;br /&gt;
И тут сразу нюансы... Если мы данные не удаляем &amp;mdash;  то пользователь ведь может зайти под другим аккаунтом. Уже сразу нужно сравнить его данные или новый пользователь.&lt;br /&gt;
&lt;br /&gt;
Далее...&lt;br /&gt;
&lt;br /&gt;
При выходе нужно отписаться от оповещений как минимум. Иначе оповещение придет а пользователь не вошел. Глупо.&lt;br /&gt;
&lt;br /&gt;
Еще далее. Фоновые задачи. Пользователь мог выйти, но при этом фоновую задачу вы не остановили. Данные удалили &amp;mdash; а фоновая задача об этом не знает, т.к. исполняется в отдельном изоляте &amp;mdash; она подумает что ничего не изменилось и сохранит некие новые данные для текущего пользователя. Значит обязательно остановить все фоновые задачи, дождаться остановки &amp;mdash; и уже тогда удалять.&lt;br /&gt;
&lt;br /&gt;
Но и еще. Остановили фоновые задачи &amp;mdash; а если это не фоновая а запрос пользователя, который выполнялся дольше обычного? При этом он удалил базу, потом пришел ответ на запрос. Ну ок, можно блокировать запись в базу. Но! А что если вы создали новую базу (сняли блокировку) &amp;mdash; и тут приходит старый ответ на запрос? Опаньки...&lt;br /&gt;
&lt;br /&gt;
Или же умнее не смотря на то что пользователь может быть только один &amp;mdash; делать вид как будто приложение поддерживает много-пользовательский режим &amp;mdash; для каждого пользователя создавать свою базу данных а в общей конфигурации только указывать какой пользователь активен?&lt;br /&gt;
&lt;br /&gt;
Казалось бы мелочь &amp;mdash; но на практике как всегда множество нюансов...&lt;/div&gt;
				
		</description>
		
		<category>design</category>
		<pubDate>Fri, 18 Apr 2025 06:33:56 GMT</pubDate>
		
			<author>Shmj &lt;forum@rsdn.org&gt;</author>
		
		
			<slash:comments>17</slash:comments>
		
	</item>

	<item>
		<title>Помогите правильно спроектировать микросервисное приложение</title>
		<link>http://rsdn.org/Forum/design/8913207.1</link>
		<guid isPermaLink="true">http://rsdn.org/Forum/design/8913207</guid>
		<comments>http://rsdn.org/Forum/design/8913207</comments>
		<wfw:comment>http://rsdn.org/Forum/PostRssComment.aspx?mid=8913207</wfw:comment>
		<wfw:commentRss>http://rsdn.org/Forum/RSS/8913207</wfw:commentRss>
		<trackback:ping>http://rsdn.org/Forum/Trackback.aspx?mid=8913207</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://rsdn.org/Forum/Forum.css);"&gt;Привет всем.&lt;br /&gt;
Как-то только в теории читал про микросервисы, но вот новый проект планируется небольшой и хотел как раз попробовать микросервисы тут.&lt;br /&gt;
&lt;br /&gt;
Первое что хотел сказать, что везде пишут микросервисы это где много команд часто или много функционала. В этом проекте ни того ни другого не будет,&lt;br /&gt;
но зато скоп определен четко и подумал прекрасная возможность потренироваться, чтобы потом уверенее пробовать в большом проекте. &lt;br /&gt;
Тут я понимаю, что проще было бы сделать монолит, но для обучения вполне годный вариант?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Второе и собственно основное я так понял из книг, что самое сложное это определить границы сервисов. Вот прошу тут помощи как нарезать на сервисы и базы?&lt;br /&gt;
&lt;br /&gt;
Приложение: &amp;mdash; Система контроля доставок грузов в разных странах (стран 10).  &lt;br /&gt;
	    &amp;mdash; Юзеры заходят по user/pswd и система определяет страну и подгружает данные этой страны. Новый юзер сам может зарегаться по логину выданному ему и восстановить пароль. 	&lt;br /&gt;
	    &amp;mdash; В системе будет 4 роли: sysadmin, admin, manager, driver. В каждой стране свои пользователи. Один пользователь = 1 страна.&lt;br /&gt;
	    &amp;mdash; Сами заказы поступают в эту систему из другой. В этой надо только мониторить и делать разные действия если доставка задержалась или не приехала.&lt;br /&gt;
            &amp;mdash; В каждой стране много складов и поэтому когда заказы поступают в систему то они сразу попадают на нужный склад и спец алгоритм распределяет на водителей.&lt;br /&gt;
&lt;br /&gt;
            &amp;mdash; sysadmin управляет только техническими настройками разными (кому когда отчеты отсылать, как в системе заводить оптуска, сколько часов в сутки можно работать, заводит праздники), остальное всё только в режиме просмотра видит.&lt;br /&gt;
            &amp;mdash; admin видит всё, не может только технические настройки менять. Следит за водителями, чтобы они всрок доставляли всё &amp;mdash; по юаю специальному, вносит отпуска, больничные их, ставит им рабочее время. Если водитель увольняется &amp;mdash; удаляет изи системы.&lt;br /&gt;
            &amp;mdash; manager  следит за водителями своего склада только, может посмотреть по всем своим водителям информацию и по всем доставкам, но менять не может&lt;br /&gt;
            &amp;mdash; driver видит только по себе все сделанные доставки и предстоящие. Каждый раз когда он начинает и заканчивает доставку то в системе нажимает Start delivery\End delivery. Если доставка не укладывается в &lt;br /&gt;
предполагаемые сроки то пишет к доставке комментарий почему не успел&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итого что по функционалу:&lt;br /&gt;
            Sysadmin &amp;mdash; логин в систему, управление настройками, праздниками и просмотр всего.&lt;br /&gt;
            Admin &amp;mdash; логин в систему, cледит за водителями, чтобы они всрок доставляли всё, вносит отпуска, больничные их, ставит им рабочее время. Если водитель увольняется &amp;mdash; удаляет изи системы. &lt;br /&gt;
            Manager  логин в систему, следит за водителями своего склада только, может посмотреть по всем своим водителям информацию и по всем доставкам&lt;br /&gt;
	    Driver логин в систему, видит только по себе все сделанные доставки и предстоящие. Каждый раз когда он начинает и заканчивает доставку то в системе нажимает Start delivery\End delivery. Если доставка не укладывается в &lt;br /&gt;
		предполагаемые сроки то пишет к доставке комментарий почему не успел&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Третий вопрос. Если без докеров то как настроить этот набор микросервисов? тут их немного будет и читал что можно настроить без докер контейнеров если что.&lt;/div&gt;
				
		</description>
		
		<category>design</category>
		<pubDate>Thu, 20 Mar 2025 14:46:47 GMT</pubDate>
		
			<author>busk &lt;forum@rsdn.org&gt;</author>
		
		
			<slash:comments>217</slash:comments>
		
	</item>

	<item>
		<title>Современные тренды</title>
		<link>http://rsdn.org/Forum/design/8901139.1</link>
		<guid isPermaLink="true">http://rsdn.org/Forum/design/8901139</guid>
		<comments>http://rsdn.org/Forum/design/8901139</comments>
		<wfw:comment>http://rsdn.org/Forum/PostRssComment.aspx?mid=8901139</wfw:comment>
		<wfw:commentRss>http://rsdn.org/Forum/RSS/8901139</wfw:commentRss>
		<trackback:ping>http://rsdn.org/Forum/Trackback.aspx?mid=8901139</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://rsdn.org/Forum/Forum.css);"&gt;Всем привет!&lt;br /&gt;
&lt;br /&gt;
Планируется внутреннее приложение (.net core/react + mssql), доступ будет по АД. OS: не точно, но планируется винда&lt;br /&gt;
Какие нынче тренды?&lt;br /&gt;
&lt;br /&gt;
что интересует: &lt;br /&gt;
&lt;br /&gt;
1. максимально простое разворачивание. Сейчас в другом проекте из гитхаба из нужной ветки вручную создается через дженкинс билд и деплоится на нужный стенд и накатываются миграции.&lt;br /&gt;
   Хочется чтобы билды сами создавались и миграции накатывались. Как такое организовать? Или может есть варианты лучше сейчас?&lt;br /&gt;
2. первичный деплой максимально простой. а то часто бывает локально всё работает, а на прод деплоишь первый раз и пляшешь там с бубном. Я так понимаю докер решает эти проблемы? локально настроить и потом можно просто его скопировать на нужный сервер, просто поменяв нужный конфиг?&lt;br /&gt;
   сразу вопрос по докеру. там просто зайти на &lt;a class="m" href="https://hub.docker.com/" target="_blank"&gt;hub.docker&lt;/a&gt; зайти можно или есть варианты лучше?&lt;br /&gt;
3. как настроить базы, чтобы если один разработчик поменял разработческую базу (удалил столбец к примеру) и не запушал еще изменения другие могли работать, а не ждать пока изменения попадут в гит?&lt;br /&gt;
   думал, в идеале, иметь локальные базы каждому разработчику, но тогда вопрос как настроить репликацию мастер данных (в системе много мастер данных, а их заливают в прод)&lt;br /&gt;
&lt;br /&gt;
4. дженкинс лучше иметь один на компанию или под разные проекты свой?&lt;br /&gt;
5. очень много слышал про trunk development. как он? сейчас просто каждый в своей ветке делает (часто фронт с бэком в одной) и потом сливают и потом ручками делают деплой и ручками меняют версию&lt;/div&gt;
				
		</description>
		
		<category>design</category>
		<pubDate>Thu, 20 Feb 2025 07:34:36 GMT</pubDate>
		
			<author>merge &lt;forum@rsdn.org&gt;</author>
		
		
			<slash:comments>10</slash:comments>
		
	</item>

	<item>
		<title>MongoDb vs Postgres Jsonb</title>
		<link>http://rsdn.org/Forum/design/8899930.1</link>
		<guid isPermaLink="true">http://rsdn.org/Forum/design/8899930</guid>
		<comments>http://rsdn.org/Forum/design/8899930</comments>
		<wfw:comment>http://rsdn.org/Forum/PostRssComment.aspx?mid=8899930</wfw:comment>
		<wfw:commentRss>http://rsdn.org/Forum/RSS/8899930</wfw:commentRss>
		<trackback:ping>http://rsdn.org/Forum/Trackback.aspx?mid=8899930</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://rsdn.org/Forum/Forum.css);"&gt;На новом проекте проекте предлагают использовать 2 СУБД PostgreSQL для всего и монгу для неструктурированных данных.&lt;br /&gt;
Мне не нравится идея хранить данные в двух бд и их поддерживать.&lt;br /&gt;
Я бы попробовал использовать в последнем PostgreSQL 17 отдельные таблицы с полем JSONB и при этом для индексирования можно часть полей документа положить рядом в таблице.&lt;br /&gt;
&lt;br /&gt;
Монга имеет хорошее горизонтальное масштабирование, но до этого проекту нужно еще дожить. На постгресе тоже можно сделать кластер. Если будет свсем тяжко, то таблицы с jsonb можно вынести в отдельную бд и на отдельные сервера. Или же партиционирование прикрутить.&lt;br /&gt;
&lt;br /&gt;
Кто-то так делал? Это окупит усложнение проекта за счет использования двух субд?&lt;br /&gt;
Можно конечно сделать микросервисы, где один будет отвечать за монгу, а второй за документы в постргресе, но это все отчеты и статистику придется делать на клиенте или в еще одном сервисе интеграции документов из двух бд.&lt;/div&gt;
				
		</description>
		
		<category>design</category>
		<pubDate>Mon, 17 Feb 2025 21:22:51 GMT</pubDate>
		
			<author>BlackEric &lt;forum@rsdn.org&gt;</author>
		
		
			<slash:comments>11</slash:comments>
		
	</item>

	<item>
		<title>Best practices для retry</title>
		<link>http://rsdn.org/Forum/design/8896789.1</link>
		<guid isPermaLink="true">http://rsdn.org/Forum/design/8896789</guid>
		<comments>http://rsdn.org/Forum/design/8896789</comments>
		<wfw:comment>http://rsdn.org/Forum/PostRssComment.aspx?mid=8896789</wfw:comment>
		<wfw:commentRss>http://rsdn.org/Forum/RSS/8896789</wfw:commentRss>
		<trackback:ping>http://rsdn.org/Forum/Trackback.aspx?mid=8896789</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://rsdn.org/Forum/Forum.css);"&gt;В системе имеется вызов стороннего API, по https, может быть как эндпоинт стороннего поставщика, так свой собственный сервис.&lt;br /&gt;
Как известно, https вызов может завершится неудачно, и часто рекомендуется повторять попытки несколько раз, даже термин такой придумали как resilient http calls. &lt;br /&gt;
А какие best practices вообще по этому поводу существуют, сколько раз повторять попытки, для каких кодов возврата и прочее&lt;/div&gt;
				
		</description>
		
		<category>design</category>
		<pubDate>Tue, 11 Feb 2025 11:04:55 GMT</pubDate>
		
			<author>Nnova &lt;forum@rsdn.org&gt;</author>
		
		
			<slash:comments>2</slash:comments>
		
	</item>

	<item>
		<title>Паттерн программирования для обновления UI при Stale-while-r</title>
		<link>http://rsdn.org/Forum/design/8884969.1</link>
		<guid isPermaLink="true">http://rsdn.org/Forum/design/8884969</guid>
		<comments>http://rsdn.org/Forum/design/8884969</comments>
		<wfw:comment>http://rsdn.org/Forum/PostRssComment.aspx?mid=8884969</wfw:comment>
		<wfw:commentRss>http://rsdn.org/Forum/RSS/8884969</wfw:commentRss>
		<trackback:ping>http://rsdn.org/Forum/Trackback.aspx?mid=8884969</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://rsdn.org/Forum/Forum.css);"&gt;Я подозреваю, что изобретаю велосипед, что проблема не нова как минимум, в мире онлайн-игр.&lt;br /&gt;
&lt;br /&gt;
Перед клиентом поставлен кеширующий прокси, который передаёт запрос на бек, но, если такой запрос уже был, то он отдаёт &lt;b&gt;сразу из кеша&lt;/b&gt;. Это позволяет аппликухе выглядеть быстрее, чем если она бы дожидалась пачки запросов со всеми причитающимися нетворк лагами.&lt;br /&gt;
&lt;br /&gt;
Ничто в мире не бесплатно. Плата здесь &amp;mdash; аппликуха получает слегка подгнившие, иногда совсем некорректные данные.&lt;br /&gt;
&lt;br /&gt;
Что я думаю, как это адресовать. &lt;br /&gt;
1) Хук в аппликухе по URL заглядывает в кеш у прокси, считывает дату данных и само тело- если оно существует и если дата не превысила срок годности, потому что если привысила- тогда прокси заставит аппликуху дожидаться ответа с бека в любом случае. &lt;br /&gt;
2) Если данные существуют в кеше и ещё не совсем протухли, тогда записывает в свой собственный аппликуховый LRU кеш объект и его дату стухания из прокси-кеша и запускает таймер скажем, на 10 секунд.&lt;br /&gt;
3) Через 10 секунд по таймеру, по одному, достаёт key-value в аппликуховом LRU, и сверяет дату стухания сохранённую с датой стухания в кеше. Если в кеше больше старой даты нет &amp;mdash; выбрасывает key-value и переходит к следующему. Если в кеше старая дата стухания есть и она равна сохранённой в аппликуховом кеше &amp;mdash; тогда переходит к следующему key-value.&lt;br /&gt;
Если в прокси-кеше дата стухания больше, чем сохранённая в аппликуховом, тогда выбрасывает из аппликухового кеша дату и объект, и сравнивает (deep equals) объект аппликухового кеша с объектом прокси кеша. Если объекты отличаются &amp;mdash; тогда извещает подписчиков, что какие-то данные подгнили и нужно данные перезапросить с бека и обновить состояние аппликухи.&lt;br /&gt;
4) Если аппликуховый LRU непустой &amp;mdash; снова запускается таймер на 10 секунд в пункт 3).&lt;br /&gt;
&lt;br /&gt;
Вопрос- это слишком закручено и есть более прямые пути? есть какой-то паттерн проектирования, который описывает подобную оптимизацию отзывчивости приложения путём скармливания потенциально несвежих данных, не дожидаясь ответа с бекенда?&lt;/div&gt;
				
		</description>
		
		<category>design</category>
		<pubDate>Sun, 19 Jan 2025 12:57:29 GMT</pubDate>
		
			<author>Артём &lt;forum@rsdn.org&gt;</author>
		
		
			<slash:comments>8</slash:comments>
		
	</item>

	<item>
		<title>Сложная выборка</title>
		<link>http://rsdn.org/Forum/design/8867314.1</link>
		<guid isPermaLink="true">http://rsdn.org/Forum/design/8867314</guid>
		<comments>http://rsdn.org/Forum/design/8867314</comments>
		<wfw:comment>http://rsdn.org/Forum/PostRssComment.aspx?mid=8867314</wfw:comment>
		<wfw:commentRss>http://rsdn.org/Forum/RSS/8867314</wfw:commentRss>
		<trackback:ping>http://rsdn.org/Forum/Trackback.aspx?mid=8867314</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://rsdn.org/Forum/Forum.css);"&gt;Привет&lt;br /&gt;
&lt;br /&gt;
Есть приложение .net + mssql и есть таблица с 50 полями и нужно сделать выборку из этой таблицы на основании фильтра который состоит из 15 параметров (поля этой таблицы)&lt;br /&gt;
Можно конечно сделать перебор всех параметров фильтра типа &lt;br /&gt;
&lt;br /&gt;
&lt;pre class='c'&gt;&lt;code&gt;&lt;span class='kw'&gt;if&lt;/span&gt; (filter.Param1 != &lt;span class='kw'&gt;null&lt;/span&gt;)
   context.Entities.Where(a =&amp;gt; a.Param1 = filter.Param1)
&lt;span class='kw'&gt;if&lt;/span&gt; (filter.Param2 != &lt;span class='kw'&gt;null&lt;/span&gt;)
   context.Entities.Where(a =&amp;gt; a.Param2 = filter.Param2)&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
но может есть что-то элегантнее?&lt;br /&gt;
&lt;br /&gt;
Почему так много полей в таблице не спрашивать)&lt;/div&gt;
				
		</description>
		
		<category>design</category>
		<pubDate>Fri, 13 Dec 2024 13:07:55 GMT</pubDate>
		
			<author>peer &lt;forum@rsdn.org&gt;</author>
		
		
			<slash:comments>6</slash:comments>
		
	</item>
</channel>
</rss>
