• Что такое Доменный объект и Предметная область, простым языком?

    @deliro
    Предметная область — множество всех сущностей и их отношений в рамках контекста.

    Например:
    В рамках магазина это покупатели, продавцы, товары, цены, скидки, поставщики, процесс продажи, прихода на склад, возврата и т.п.
    В рамках дискорда это пользователи, серверы, комнаты, группы, права на доступ, процессы присоединения к серверу, входа в комнату, оплаты nitro, написания текстового сообщения и т.п.

    В целом, это всё, что понимает твой менеджер и ничего, что он не понимает. В предметную область не входит, например, то, где именно ты хранишь данные — в mysql, в файлах, получаешь и сохраняешь их по API или хранишь их в redis'е. Но входит абстрактная сущность "хранилище". Она же — интерфейс репозитория. Репозиторий — это паттерн, который скрывает реализацию конкретного хранилища и который оперирует объектами доменной модели — элементами предметной области, как будто они хранятся у тебя в оперативной памяти. Например, у репозитория могут быть методы
    users.getByID(1234), users.save(user), users.getByEmail("hello@world")
    и т.п. Реализация репозитория определяет, куда именно сохранится этот user или откуда он скачается. В одну таблицу или в несколько. Нормализованные ли будут данные лежать в РСУБД или денормализованные. Именно здесь можно реализовать запись в master, а чтение с реплик. Или энкодинг в msgpack и передачу его по API куда-то. Или по gRPC. Потому что предметная область не должна перегружаться деталями реализации хранилищ.

    Про доменную модель:
    Словарь (он же хэш, он же ассоциативный массив) — это не доменная модель (хотя в некоторых функциональных языках может быть). Объект ORM — это тоже не доменная модель, хотя много где пытается ей быть. Доменная модель не зависит от конкретных фреймворков, баз данных, оптимизаций этих баз и прочих навязанных технической составляющей сущностей. Чаще всего это обычный класс на языке, на котором пишется код (или struct в случае Golang).

    Недавний пример:
    У сущности есть теги по категориям:
    {"category1": ["foo", "bar"], "cat2": ["foo", "hello", "world"]}
    . Их так удобно представлять на уровне предметной области, об этой структуре я могу общаться с заказчиком. Но в монге они сохраняются в виде
    ['category1%%foo', 'category1%%bar', 'cat2%%foo', 'cat2%%hello', 'cat2world']
    , потому что так их легче индексировать и быстрее по ним искать. Но это скрыто в реализации репозитория, доменная область про это ничего не знает. Это даёт сразу много преимуществ:
    1. Это очень просто тестировать, без всяких моков. Вместо репозитория с монгой я делаю репозиторий, который хранит сущности в оперативе. Всё, тесты бизнес-логики не зависят от инфраструктуры. А репозиторий монги я тестирую отдельно, мокая запросы в саму монгу или даже не мокая
    2. Это облегчает понимание всего продукта. Мозг не пытается составить полную картину, когда запросы в БД перемешаны с логикой, тут же сплиты-джойны строк, какие-то ещё низкоуровневые действия. Мозгу легко ориентироваться в пределах уровня. На уровне репозитория я думаю о том, как сущности хранить и доставать из хранилища, на уровне служб я думаю о том, как сущности взаимодействую и какие их них нужно извлечь/сохранить, но не как
    3. Рефакторинг очень простой. Даже теоретическая смена БД. Завтра с монги нужно будет перенести одну сущность на постгрес — без проблем. Я напишу один новый репозиторий, не затронув ни строчки кода за его пределами, кроме места, где он создаётся. При этом, остальные сущности могут лежать всё также в монге

    Доменные модели бывают богатыми и анемичными (но не бескровными). Оба подхода применяются и, имхо, не является антипаттерном ни один из них. Лично я использую анемичные модели, а всю бизнес-логику храню в службах.
    Ответ написан
    2 комментария
  • Почему функция не видна за пределами функции?

    IonDen
    @IonDen
    JavaScript developer. IonDen.com
    В ES5 нельзя было задать блочную область видимости.
    if (true) {
      var foo = 'bar';
    }
    
    console.log(foo); // bar


    В ES6 такая возможность появилась, но не для всех, а только для новых переменных
    if (true) {
      var foo = 'bar';
      let baz = 'biz';
      const alpha = 'beta';
    }
    
    console.log(foo); // bar
    console.log(baz); // ReferenceError: baz is not defined
    console.log(alpha); // ReferenceError: alpha is not defined


    По этому если вы присвоите функцию одной из переменных const/let то вы добьетесь того же эффекта:
    if (true) {
      const foo = () => {};
    }
    
    console.log(foo); // ReferenceError: foo is not defined


    Функциональная область видимости существовала всегда
    function foo () {
      function bar() {}
    }
    
    console.log(bar); // ReferenceError: bar is not defined
    Ответ написан
    Комментировать
  • Можно ли считать любой фрагмент программного кода алгоритмом?

    1. можно ли написать код, который не будет являться алгоритмом?

    Да. Например так работают декларативные языки, типа HTML, SQL, CSS.
    2. Является ли алгоритмом инструкция с единственным действием?

    Да.
    3. Является ли алгоритмом верстка и можно ли её вообще считать кодом?

    Кодом - да. Алгоритмом - нет, тк вёрстка не описывает шаги по достижению результата.
    Ответ написан
    Комментировать
  • Как установить переменную $? в си программе?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    $? - это статус завершения последней программы.
    В C соответствует значению, возвращаемому функцией main. Нормальное завершение программы должно возвращать 0, каждая ошибка обычно соответствует своему коду.
    Ответ написан
    Комментировать
  • Как выполнить функцию, если в течении 3 сек. не было действий?

    twobomb
    @twobomb
    var timer_li;
    document.getElementById('ajax_send_li').addEventListener('click', ()=> {
    
        clearTimeout(timer_li);
        
         timer_li = setTimeout(()=> {
            alert('Последний клик был 3 сек назад');
        }, 3000);
    
    });
    Ответ написан
    Комментировать
  • Почему при сортировке 1 меньше, чем true?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    При приведении типов (во время операции вычитания) true приводится к 1. Эти два значения равны, и в результирующем массиве они следуют в том же порядке. что и в исходном. Можете проверить, поменяв true и 1 местами.
    Ответ написан
    Комментировать
  • Объясните как работает данный код?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    стоит разобраться с методом массива reduce()

    Upd. reduce() выполнится для каждой буквы: a, b, c и d.
    В функцию аргументом i попадает очередная буква.
    Аргументом part первый раз туда попадает пустой объект obj. И ссылка на него сохраняется - её и вернём как результат.
    Внутри reduce функцию можно так переписать, делает то же самое:
    function (part, i) {
      const empty = {}; // новая матрёшка
      part[i] = empty; // вложили её в предыдущую
      return empty; // новая матрёшка станет part'ом при следующем вызове
    }
    Ответ написан
    6 комментариев
  • Правильность конвертирования в новый массив?

    fomenkogregory
    @fomenkogregory
    Юниор софтварный инженер
    const categoriesPossible = GetAllCategories.map((tower:any) => ({value: tower.id, label: tower.name}))


    Ну и лучше не юзать any
    Ответ написан
  • Дебагер js'a в браузере, как отследить ход выполнения программы?

    Когда прилетаешь в брекпоинт, то дальше можно по шагам идти. там для этого есть кнопки со стрлочками
    Ответ написан
    1 комментарий
  • Как собрать мой проэкт Webpack?

    yarkov
    @yarkov
    Помог ответ? Отметь решением.
    А зачем читать статьи, если надо читать документацию?
    Ответ написан
    2 комментария
  • ООП в JS отличается сильно от ООП компилируемых языков?

    DevMan
    @DevMan
    ваще сильно: примерно как Валуев отличается от слона.

    если без сарказма: классического ООП в жс нет. есть прототипное и разные попытки адаптировать его к классическому.
    а всё остальное зависит только реализации ООП в конкретном языке и от собственного понимания ООП.
    Ответ написан
    5 комментариев
  • Что такое крейт?

    vabka
    @vabka Куратор тега Rust
    Читайте Cargo book
    Крейт == пакет.
    Да, написаны они всегда на rust, но могут являться обёртками над сишными библиотеками, например.
    Деления на официальные и неофициальные нет - все они ставятся с crates.io или с другого репозитория.
    Чтобы установить, надо просто указать его в зависимостях.
    Всё это описано в rustbook
    Ответ написан
    7 комментариев
  • JavaScript - как проверить, есть ли в объекте циклические ссылки?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Поиск в глубину.

    Надо поддерживать список/множество уже посещенных вершин и пока посещаемых (те, что в стеке). При заходе в вершину в рекурсивной функции помещайте ее в множество пока посещаемых. При возвращении из функции перемещайте вершину в множество уже посещенных. В функции пройдитесь по всем ребрам, если они ведут в пока посещаемую вершину - вы нашли цикл. Если ребро ведет в уже посещенную - игнорируйте его. Если ребро ведет в не посещенную вершину - рекурсивно запускайтесь от нее.
    Ответ написан
    Комментировать
  • Как отобразить в теге img изображение возвращаемое Ajax запросом?

    @Dmitriyq
    Добавить в конфиг аякса и через URL.createObjectURL отобразить картинку
    xhrFields:{ responseType: 'blob' }

    $.ajax({
      url: MY_URL_,
      method: "GET",
      xhrFields: {
        responseType: 'blob'
      },
      headers: {
        "Authorization": "Basic YAZRt45aWDa25wDDdFND232YFmVmb23213ffWEa5OA=="
      }
    }).then(response => {
        console.log(response);
        $('#canvas').attr('src', URL.createObjectURL(response));
    }).catch(error => {
       console.log(error);
    })
    Ответ написан
    2 комментария
  • Как очистить localStorage после закрытия всех вкладок с сайтом?

    Так это нужен session а не local, это у него такое поведение
    Ответ написан
    4 комментария
  • Как лучше хранить такие данные?

    @rPman
    Прежде чем задавать вопрос - 'как хранить', нужно ответить на - 'как будешь использовать'.

    В данном случае возможны следующие подзадачи
    - поиск номера по букве
    - поиск буквы по номеру
    - получение списка букв или списка номеров
    - получение следующей или предыдущей по номеру буквы, получение первой или последней буквы

    В зависимости от способа реализации каждой поздазачи могут появляться новые подзадачи. Например если вам нужно не просто циклом пробегать то предыдущий следующий не нужны, но если нужно параллельно работать с двумя списками, то нужен доступ по номеру и проверка начала конца.

    С высокой вероятностью вам хватит двух массивов:
    * ['а','б','в',...] - обычная строчка может выступать таким массивом ('абвг...')[3]
    * обратный индекс {'а':0,'б':1,'в':2,..} обычный объект или new map()
    Ответ написан
    1 комментарий
  • Что значат синие/желтіе линии в vs cod?

    yarkov
    @yarkov
    Помог ответ? Отметь решением.
    Товарищ Alice абсолютно прав. Синий - изменённая строка, зелёный - добавленная строка, красный - удалённая строка.
    Ответ написан
    Комментировать
  • Клон telegram аккаунта, зачем?

    @object_Object
    Если вы достаточно важная(относительно) личность:
    Человек прикидываясь вашим фейком может продавать ваши услуги(или товары) под вашим видом, получать ту-или иную конфиденциальную информацию.

    Если вы не важная(опять таки относительно) личность:
    Сбор данных о вас

    Ну или просто человек недостаточно креативен чтобы придумать свой nickname и поставить туда аватарку.
    Ответ написан
    5 комментариев
  • Клон telegram аккаунта, зачем?

    DevMan
    @DevMan
    или просто совпадение, или рассчет на то что люди будут ошибаться и писать ему.

    поддержка молчит ибо сказать ей нечего, кроме как вежливо послать.
    Ответ написан
    2 комментария