• Предметно-орієнтоване проєктування (DDD): у чому користь підходу і хто його використовує

    ДДД це не про те щоб наляпати DTO класів в найпростішій задачі.
    ДДД це про те щоб побудувати N layers, де це справді потрбно.
    Тобто обєкт обростає кількома прошарками бізнес логіки.
    Доречі, гарний приклад є в ігровій індустрії. В них ігрові персонажі та предмети — це фактично доменні обєкти, з купою своєї внутрішньої логіки. А ті хто цим всім оперує — це сценарій, скрипти, які пишуть гейм дизайнери ігрових рівнів. Це класичний приклад DDD, а не твій копійчаний круд з котом.

    Підтримали: Sergey Lysak, Dmytro Lapshyn
  • Предметно-орієнтоване проєктування (DDD): у чому користь підходу і хто його використовує

    Ну тобто приклад який саме тебе цікавить, ти все ще не можеш придумати? Ок.

    en.wikipedia.org/...​rocess_Model_and_Notation

    І що, навіть найпростіший проєкт що перевіряє світло по таймеру,
    та розсилає сповіщення вже формально підпадає під твою діаграму

    upload.wikimedia.org/...​ProcessWithNormalFlow.svg

    Timer => Check Status Electricity => If Changed, send telegram message to user group => If failed, retry, try resend messages in case of gateway issues

    Подробиці з повним розбором коду проєкту
    dou.ua/forums/topic/45479

  • Предметно-орієнтоване проєктування (DDD): у чому користь підходу і хто його використовує

    Гарна риса технічного спеціаліста, приводити приклади, що саме маєш на увазі, що саме хочеш запрограмувати. Наприклад Констянтин зробив як гарний спеціаліст, він свій абзац з запитаннями закінчив прикладом, що хоче побачити Ordering в магазині. І я йому прислав приклад коду, що моделює заповнення корзини з товарами, та замовлення.
    github.com/...​SupermarketApplication.cs

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

  • Предметно-орієнтоване проєктування (DDD): у чому користь підходу і хто його використовує

    BPMN

    Багаторівневе Security, що спадкується, відноситься до нього ? fraplat.com/...​nsionsPages/Security.html

    StateMachine для проводу документів по статусам, відноситься до нього?
    fraplat.com/...​nsPages/StateMachine.html

    Синхронизація, відноситься до нього?
    fraplat.com/...​DimensionsPages/Sync.html

    Транзакції, відноситься до нього?
    fraplat.com/...​onsPages/Transaction.html

    Дмитро, я дуже люблю практичні приклади по DDD/CMDD і дуже не люблю демагогію, де купу часу витрачають про наслідування між квадратом та прямокутником, setOwner, activeRecord та інший «rocket science» в якому ти нижче з задоволенням приймаєш участь.
    Мене цікавлять як замість 50 тис рядків boiler plate, писати 500-1000 рядків і отримувати більш гнучкі, більш конфігуровані та швидкі аплікації. Якщо в людини є прогресивний погляд, та вона відкрита до чогось нового, що дає дійсно класні переваги — я завжди велкам.
    Є код, є приклади, є задеплоєні проєкти. Як ні, то ні, не всім бути реформаторами. Деякі відчайдушно чіпляються за старі технології, навіть якщо вони не дають ніяких переваг.

  • Предметно-орієнтоване проєктування (DDD): у чому користь підходу і хто його використовує

    Бо яка така властивість «пагінація» (чи «сортування») може бути у юзера?

    Насправді, в фундаменті є потужна математична модель. Люба колекція з json документами, це фактично колекція ієрархічних обєктів. В ієрархії можуть бути інші вкладені обєкти. А над цими списками може бути застосована така властивість як Pagination. Фактично цей dimension каже, що всі клієнти будуть чититати не всі обєкти скопом, а пейджами.

    Приклад, фотоальбом. Є документи (зараз один але може бути більше)
    github.com/...​hotoAlbum/Photos/Document

    {'Photos':['Photo1','Photo2','Photo3']}
    

    А є pagination dimension, який каже що не всі обєкти з масиву Photos ми читаємо, а читаємо порціями по два елемента
    github.com/...​/Document/0000000000.json

    {
      "Photos": {
        "Page": {
          "Attrs": 2,
          "IsAlign": false
        }
      }
    }
    

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

    Покажи, як за допомогою твої діменшнів змоделювати якийсь простий і більшості зрозумілий процес — щось «тривіальне», на кшталт проходження заказу в інтернет-магазині (можливо вже є приклади?)

    Це дуже просто, наприклад в нас є документ в колекції Backets

    {
      "Client": "Bob"
      "Orders": []
    }
    

    В нас є шаблон замовлення, в колеції NewOrder

    {
      "Name": "Apple M1",
      "Category": "Notebooks",
      "Price": 1000,
      "Quantity": 1
    }
    

    Далі ми пишемо в код

    CreateNewDocForArray("NewOrder", "Backets", "{'Orders':[$]}").OpenForm();
    

    Відкривається веб форма, після її заповнення, замовлення додається в Backet (корзину)

    {
      "Client": "Bob"
      "Orders": [{
      "Name": "Apple M1",
      "Category": "Notebooks",
      "Price": 1000,
      "Quantity": 1
    }]
    }
    

    Dimensions на справді дуже багато, більше 50
    fraplat.com/...​nsionsPages/Document.html

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

  • Предметно-орієнтоване проєктування (DDD): у чому користь підходу і хто його використовує

    Я би сказав, що справжні ідеї DDD розкриває CMDD в Fractal.
    Він данні розглядає як RAW ака любий ієрархічний обьєкт в json, анемічний, який не має ніяких властивостей, типів, тощо: github.com/...​/Document/0000000001.json

    Далі він наділяє анемічну модель властивостями. Security, Pagination, Sync, Sort, Validation тощо.
    Робить це в паралельних Dimensions. github.com/...​bases/SocialNetwork/Users

    На виході в нас анемічна модель User, навколо якої сформовано N layers, для того, щоб будь які операції з основним RAW документом приводили до виконування бізнесс логіки в N layers.

    Чому цей підхід з Dimensions який будеє N layers навколо анемічного обєкта над потужний.
    1. Код дуже добре читається. Різні прошарки бізнесс логіки не змішуються між собою, а існують, як би в паралельних вимірах (dimensions).
    2. Він дуже добре розширюється. Ви починаєте з анемічної моделі, але згодом вона наділяється складною бізнес логікою, де моделі стають rich, без переписування (!) коду.
    3. Пайплайн доменної моделі який побудований з Dimensions дуже швидко працює

    Таким чином Fractal поєднує в собі гнучкість і простоту використання anemic моделей, які гармонічно еволюціонують в прогресивному стилі до rich доменних моделей.

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

  • Методи масштабування реляційних баз даних: переваги, недоліки та кейси використання

    Ти якщо берешся за мою освіту (не знаю навіщо), роби це хоча б системно, а не на від**сь :) Механізми покращення durability в сучасних СУБД мають приблизно ніяке відношення до власне моделі даних (чим посгресовський WAL концептуально відрізняється від журналювання монги чи комітлогу кассандри, наприклад?). Чи ти маєш на увазі не апаратні збої, а баги на стороні апки (отже не «D» а «A» та/або «C»?)

    Там все має значення. RDBMS з її ACID заточена щоб уникати як логічних так і апаратних помилок. Апаратні фіксяться за рахунок журналів, локів, ізоляції транзакцій. Логічні — за рахунок нормалізації в реляційній моделі данних. Тож, якщо ти перейдеш на Монго, Касандра або інший NoSQL, консистентність ти можеш втратити вже на рівні проектування бази данних. Наприклад будеш ссилатися в різних документах референцом на одну ж ту саму сутність, але на рівні ядра СУБД валідність цього референса ніяк не буде перевірятися.

  • Методи масштабування реляційних баз даних: переваги, недоліки та кейси використання

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

    ACID це не тільки про транзакції, а перш за все про те, як гарантувати цілістність СУБД при сбоях. Фінансові проводки в СУБД можуть бути, а можут і не бути, а ось FKs та інші Constraints в RDBMS є завжди.

  • Методи масштабування реляційних баз даних: переваги, недоліки та кейси використання

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

    Все трошки складніше.
    ACID забезпечує надійність вузла обчислень. Але не забезпечує надійність в рамках розподіленої системи (CAP теорема).
    Але якщо ви відмовитесь від ACID на вузлах, ви фактично будете мати не один, а вже два рівні з проблемами. На рівні вузлу та на рівні синхронізації хостів.

  • Чи може початківець написати мобільний додаток використовуючи ChatGPT?

    Це сумно.
    Я доречі код ще підрефакторив, він фактично зараз 5-7 рядочків коду,
    або роботи на 3 хвилини

    github.com/...​x1/Sandbox1Application.cs

    Підтримав: Andrii Andrii
  • Чи може початківець написати мобільний додаток використовуючи ChatGPT?

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

    Сайт краще, оскільки ви його можете відкрити як на любому телефоні (андроід, епл) так і на компьютері.

    Підтримав: K Vadym
  • Чи може початківець написати мобільний додаток використовуючи ChatGPT?

    на відміну від мого друга chat-gpt.

    Ну він просто не ефективний. Генерить забагато коду та допускає безліч помилок. Для прикладу, якщо 100 рядків коду він генерить на якусь криву свистілку, то на нормальних технологіях на 300-400 рядків коду можна вже розраховувати на якусь соц мережу.
    Для GPT то планка просто недосяжна.

    а ваш код я навіть не знаю куди вставити, ide мені помилку видає,

    Тому що цей код на С#, а не на Пайтоні.
    Запустити та задеплоїти його дуже просто

    1. Установити Visual Studio Community. visualstudio.microsoft.com/vs/community
    2. Установити .NET Core 3.1. dotnet.microsoft.com/...​en-us/download/dotnet/3.1
    3. Клонувати репозиторій
    github.com/...​rnFractal/FractalPlatform
    4. Запустити FractalPlatform.Deployment проєкт на виконання. Він миттєво задеплоїть усі необхідні файли з Sandbox-проєкту в інфраструктуру Fractal і відкриє в браузері задеплоєний проєкт з потрібним url.

    Доречі, код вашого додатка я ще більше спростив. Зараз він виглядає зовсім просто
    github.com/...​x1/Sandbox1Application.cs

  • Чи може початківець написати мобільний додаток використовуючи ChatGPT?

    коли вивів найкращий, то з іншими програмами має бути швидше

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

    то треба перед тим ще довго вивчати мову програмування, чи не так?

    Не треба. Зайшли на доу, написали мінімальне ТЗ, вам дали ссилку на задеплоєний сайт.
    Якщо він простий, звісно.

  • Чи може початківець написати мобільний додаток використовуючи ChatGPT?

    У вас в коді вже введений список без можливості редагування

    Там є кнопки Add та Del. Додати та видалити продукт.
    Подвійний клік на рядку, редагувати продукт. Кнопка Calculate порахувати загальний кошторис.

    та і текст саме про те щоб не знаючи взагалі цієї мови програмування зробити програму

    То не программа. То один функціональний вираз, який пишеться і деплоїться як повноцінний сайт за 5 хвилин. На ЧатЖПТ скільки часу пішло?
    Десь пару днів його розважали промптами щоб йому не було скучно?

  • Чи може початківець написати мобільний додаток використовуючи ChatGPT?

    ChatGPT
    Python
    всього 92 рядки коду

    Навіщо все так складно.
    Додаток неймовірно простий, використовуйте правильні технології.
    15-20 рядків коду та 5 хвилин часу.

    fraplat.com/jupiter/Sandbox1

     private class Product 
            {
                public string Name { get; set; }
                public int Quantity { get; set; }
                public decimal Price { get; set; }
            }
    
            public override void OnStart()
            {
                new { Products = new[] 
                        { new Product { Name = "Хліб", Quantity = 1, Price = 1 }, 
                          new Product { Name = "Молоко", Quantity = 2, Price = 5 } } }
                .ToCollection(Constants.FIRST_DOC_ID)
                .SetUIDimension("{'Style':'Save:Calculate;Cancel:false'}")
                .OpenForm(result => {
                    var price = result.Collection.GetFirstDoc().Select<Product>("{'Products':[!$]}")
                                                                                      .Sum(x => x.Quantity * x.Price);
                    MessageBox($"Рахунок: {price} грн.");
                });
            }
    
    Підтримав: Oleksandr Tishyn
  • Порівнюємо код pet-проєктів, що перевіряють наявність світла

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

  • Порівнюємо код pet-проєктів, що перевіряють наявність світла

    Це настільки круто, що я не полінився витратити 10 хвилин свого часу, та створити і задеплоїти ще одну веб апку, щоб ви змогли додати свої результати до загальної таблички результатів пет проєктів:

    fraplat.com/jupiter/Sandbox5

    Код самої веб апки

    Client.SetDefaultCollection("ElectricityScore")
              .GetFirstDoc()
              .OpenForm(result => {
                          Client.SetDefaultCollection("NewElectricityScore")
                                .WantCreateNewDocumentForArray("ElectricityScore", "{'Apps':[$]}")
                                .OpenForm(result => OnStart());
              });
    
  • Порівнюємо код pet-проєктів, що перевіряють наявність світла

    А як щодо Django? Воно на Пітоні, і створювалось як раз для швидкої розробки сайтів з адмінкою та базою django-book-new.readthedocs.io/en/latest/chapter01.html

    Код ToDo list на Django в студію.
    Бажано який було написано з нуля за 2 хвилини.
    І ще за 2 хвилини задеплоєно в світ.

    Підтримав: Denys Poltorak
  • Порівнюємо код pet-проєктів, що перевіряють наявність світла

    Ок, наприклад я студент.
    Хочу написати hello world для веба, тобто ToDo list.
    Відкриваю цю класну документацію, та читаю щось типу:

    word[:2] # character from the beginning to position 2 (excluded)
    ’Py’
    word[4:] # characters from position 4 (included) to the end
    ’on’
    word[-2:] # characters from the second-last (included) to the end
    ’on’

    Це якось мене наблизило до мети? Ну чесно, сумніваюсь.
    При цьому, я йду на Fractal, дивлюся відео довжиною 2 хв та 45 секунд.
    www.youtube.com/watch?v=eVC2M_c8574

    Бачу код бази данних в джисоні

    {
      "Title": "My Todo List",
      "Location": "Home",
      "ToDos": [
        {
          "Completed": false,
          "Task": "Buy food"
        },
        {
          "Completed": false,
          "Task": "Clean room"
        }
      ]
    }
    

    Та код в шарпі, прочитати джисон, показати на його основі форму

    Client.SetDefaultCollection("ToDoList")
             .GetFirstDoc()
             .WantModifyExistingDocuments()
             .OpenForm();
    

    Та отримую свій ToDo лист за 2 хвилини.
    Код просто фантастично простий.

    Це просто дуже різні інструменти.
    Фрактал просто не морочить голову низькорівневим програмуванням як Пайтон, та дає змогу писати в х10-100 разів меньше коду.

    Я розумію, що ви бачите магію, нічого не зрозумієте.
    Але потрібно цю магію вчити, бо вона проста, та дає змогу збирати бекенд для сайтів за 3-5 доби. Не якусь лямду на авс що пінгує хост, а сайти ось такого рівня з купою скрінів та адмінкою:
    fraplat.com/...​843a4982f73510b50179d.jpg

    Фрактал фактично з бекендом робить те, що Figma зробила з дизайном сайтів. Фігма просто лишила без роботи всіх любітелів набирати html в блокноті. І абсолютно всеодно, як добре документація по html була описана до того в інтернеті, бо дизайн систем пришвидчився в х10 разів, а рівень того дизайну, як і дизайн бекенду на Фрактал, просто улетів в космос.

    Всі хто зараз вивчає Пайтон, то потенційні робітники за 5 долл на годину. Саме така продуктивність праці. А Фрактал, та всі хто зміг вивчити що таке Json та Dimensions то потенційні робітники з ставкою в 100-200 долл на годину.
    Just business, nothing personal.

  • Порівнюємо код pet-проєктів, що перевіряють наявність світла

    Базові речі вчаться навіть швидше чим за вечір. От як конвертувати будь-який json в повноцінний CRUD веб сайт.
    fraplat.com/jupiter/JsonToWebApp

    А це код цього нескладного апп.
    github.com/...​sonToWebAppApplication.cs

    Тепер уяви, в тебе є бд з схемою табличок і тобі потрібно просто круд зробити на Пайтоні ...

    А Фрактал робить це просто отримуючи на вхід джисон. Підправив джисон і фактично добавив філди в базу, контроли на юай. Ніде не помилився.

    Приклад дуже простий, але він показує що вхідний квиток хочаб для таких простих крудів, майже нульовий.

← Сtrl 123456...9 Ctrl →