Чи можемо ми спростити додавання потоків даних між віддаленими частинами великої бази даних?


10

Вносячи зміни до великих систем, я часто стикаюся з проблемою, що якийсь функціонал потребує отримання даних з іншого фрагмента, але вони знаходяться в різних частинах глибокого і розгалуженого дерева викликів, можливо, протікають через слухачів подій, відкладених дзвінків, тощо. Таким чином, проста зміна може швидко надіти повітря.

Пов’язана цитата з публікації в блозі Йоссі Крейніна за адресою http://www.yosefk.com/blog/i-want-a-struct-linker.html :

У вас є якась структура даних, яку ви багато обходите. Незабаром найцінніше в структурі - це не дані, які вона зберігає, а те, що вона доступна весь шлях через якийсь волохатий потік управління.

Глобальні змінні - це класичний спосіб дозволити коду "кричати" на віддалений код, але, як відомо, вони є проблематичними. Динамічно оцінені змінні є більш обмеженим способом, але вони також є проблематичними.

Чи є дослідження мови програмування, спрямовані на вирішення цієї проблеми? Чи можемо ми спростити додавання непередбачуваних потоків даних у велику базу коду, при цьому все ще маючи статичну перевірку, легке тестування одиниць та інші смаколики?


Як ви формулюєте своє запитання, я думаю, ви маєте на увазі потік даних в рамках одного процесу, без міжпроцесорного спілкування. Отже, яку проблему ви бачите, яку неможливо вирішити стандартними механізмами відправника / слухача подій?
Док Браун

Надуманий приклад: уявіть, що всередині вашої системи є якийсь код, який надсилає користувачеві текстове повідомлення. І ви отримуєте нову вимогу, що текст повідомлення повинен залежати від поточного часу у часовому поясі користувача. Столик викликів виглядає приблизно так: деякий код, який знає часовий пояс користувача, викликає метод, який викликає метод, який (... повторити 15 разів) викликає метод, що генерує текст повідомлення. Це простий приклад за моїми мірками, оскільки він передбачає спілкування лише вниз, але все-таки потрібно змінити підписи 15 методів, щоб змінити свою дрібницю.
Володимир Слепєв

Я думаю, що може допомогти чітко моделювати потік даних та відокремлювати компоненти від потоку даних. Німецький програмний інженер багато пише на цю тему, більшість статей німецькою мовою. Ось вступна
Doc Brown

Я думаю, що однодольний внутрішній API може допомогти. Він був би доступний у всій програмі і містив би всю логіку отримання даних.
superM

Відповіді:


1

Ви маєте на увазі CDI (введення контекстної залежності) AKA IoC (інверсія управління). Java JSF та Spring Framework - кілька прикладів. ASP.NET MVC має плагіни типу Unity. Javascript починає мати організовані структури з використанням бібліотек типу RequireJS, який має ін'єкційну поведінку, що спостерігається у багатьох сучасних структурах JS. Це для підключення локальних та віддалених додатків.

Для вільного зв'язку між мережами компанії люблять використовувати веб-сервіси з SOAP, REST, AJAX або звичайними дистанційними дзвінками методу з RPC. На Java ви можете використовувати JAX-WS або .NET WCF для створення розподілених служб. Потім ви їх вишикуєте в службовій шині або "потоці даних" з будь-якої мови або платформи як клієнта. Ruby, Python, Scala, Java, C #, ... що завгодно.

Вільне з'єднання дозволяє розділити і перемогти проблеми, а послуги часто є точкою входу до бази даних для витягу даних. Піднімаючись по сходах, у нас є звір під назвою Черга повідомлень. Ця дорога веде до структур підприємств та інфраструктури.

Якщо ваш проект наполягає на відсутності мережі, є такі мови, як Scala, Akka, NodeJS тощо., Які розроблені для великого потоку даних у межах однієї програми. Вони також працюють з деякими або всіма згаданими раніше технологіями для складних проектів. Наприклад, Scala можна використовувати з послугами JAX-RS REST для витягування «глобальних даних» з джерела даних та мати Spring для внутрішнього електропроводки IoC. Також в інструментах JBoss, .NET та GUI, таких як MuleESB, є багато структур для виконання бізнесу або робочого процесу. У процесі розробки Eclipse та Netbeans дозволяють перетягувати послуги на екрані візуальної діаграми потоку.

Нарешті, у Java все ще є квасоля Singleton. Для коригування методів під час виконання використовуйте проксі або рамки відображення. Але чесно кажучи, це так 1999 рік.

Якщо ви здійснюєте так багато дзвінків, щоб надіслати користувачеві повідомлення відповідно до його часового поясу, на мою думку, ймовірно, є двоступеневий спосіб досягти того ж ефекту, який бачить користувач. Але так, рамки CDI носять існуючі мови, як пальто, що надає їм усі згадані вами гнучкі повноваження. Мені подобається називати це підсвідомістю моєї програми, безперечно доглядаючи брудну роботу.


Черги на повідомлення можуть бути надмірними, однак обмін повідомленнями - це ідеальний спосіб отримувати події через всі дошки. Java використовує повідомлення, керовані повідомленнями (MDB), і це повинно дозволяти вашій програмі надсилати або отримувати "розмову" один з одним. Це можна зробити так, щоб отримати асинхронний бонус.
Senor Developer

Дякую за покажчики! Це, безумовно, змушує мене замислитися, як могла виглядати мова, якби вона була розроблена з нуля для підтримки введення залежності та подібних зразків.
Володимир Слепєв

0

Найпростіший спосіб зробити це у великому масштабі - насправді використовувати якийсь API для інкапсуляції даних. Це може бути магазин NoSQL або це інкапсульована RDBMS (або насправді це може бути як в різний час, так і в одній програмі. Немає жодної причини, через яку RDBMS не може працювати довгостроково зберігання та NoSQL db для управління короткочасним контролем стану). Це може бути навіть серія одиночних об'єктів.

Тоді ваші структури даних можуть бути доступними в якомусь нейтральному просторі, дещо керованим чином. Це такий підхід, який ми застосовуємо з LedgerSMB (але з кількома напівглобальними змінними для того, що по суті є прихованими одиночними клавішами, але, знову ж таки, ними керується, ми вибрали безпосередньо приховування об'єкта, оскільки це полегшило управління змінними, але тоді є всі 4).

Звичайно, будь-який підхід має компроміси, і ви не можете обійти ці компроміси. Ключовим є перегляд того, що таке компроміси (управління проти продуктивності проти чистоти коду та потенційних підводних каменів) та прийняти рішення, виходячи з того, що найкраще підходить для вашої програми.


Дякую за відповідь! Мені здається, що дослідження мови програмування могли допомогти у цій проблемі. Наприклад, якщо код зчитує деякі дані з глобальної бази даних або з захованих одиночних клавіш, може бути статична / декларативна гарантія того, які дані йому потрібні.
Володимир Слепєв

-1

Якщо ви вживаєте (або цитуєте) слова

hairy flow of control

то я вважаю, що ваш код справді безлад. Ви повинні негайно її скинути. Якщо ви використовуєте модуляризацію / розділення проблем, не існує такого поняття, як "волохатий потік контролю". У вашому коді просто не вистачає простоти, що також можна визначити тим, що ви посилалися на глобальні змінні :-).


Чому потік? У цитаті бракує вступу, який точно підтримує мою думку: "(це, мабуть, класифікується як" Антипатерн "або" Кодовий запах ", і як таке має назву у відповідних колах, але я б не знав, тому я буду залиште його без імені) "
користувач127749

2
Це насправді не є відповіддю на питання, можливо, це причина пониження
Даніель

Тоді дозвольте перефразувати питання: чи є якийсь магічний трюк, щоб скасувати безлад коду, який порушує один з найосновніших принципів розробки програмного забезпечення: KISS (нехай це буде просто, дурно)? Трюк не є магічним, це або програміст, якого неможливо замінити, оскільки він знає всі не настільки очевидні деталі (що вбиває компанію в перспективі), або реструктурувати кодову базу. На жаль, багато компаній спочатку не піклуються про належну розробку коду або навіть не розуміють наслідків, потім доведеться хоч раз переписати свій код, багатьом навіть переписати його багато разів ...
user127749
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.