• Корректно ли использовать таким образом CompletableFuture и JdbcTemplate?

    CellycoMobiles
    @CellycoMobiles
    indi developer @CellycoMobiles
    1. Избавляемся от конкретизации интерфейса CompletionStage. Тру реакционщики пишут свои интерпретации.
    2. Абстрагируемся от возвращаемого значения посредством интерфейса или абстрактного классаю Например DBResponse. Завтра вам надоест мускул, уйдете в носкул. Достаточно будет интерфейс переписать.
    3. Унифицируем получение данных, вынося в сигнатуру метода однотипные переменные. queryAsync Завтра смените DSL на jooq - достаточно будет только один метод переписать.
    4. Постарайтесь избавиться от JOIN. Очень дорогой метод, грубо приводящий реактивное программирование к императивному. Используйте thenAcceptAsync, exceptionallyAsync, handleAsync Метод result()


    public CompletionStage<DBResponse> query1(){
            return queryAsync(jdbc, sql, param1, param2, ... paramN);
        }
    
        public CompletionStage<DBResponse> query2(){
            return queryAsync(jdbc, sql, param2, param3, ... paramN);
        }
    
        public CompletionStage<DBResponse> queryAsync(JDBC jdbc, sql, Objects ... params){
            return CompletableFuture.supplyAsync(() -> {
                return jdbc.query(sql, params);
            }).thenApplyAsync(DBResponse::of);
        }
    
    //    далее в коде
    
        void result(){
            CompletableFuture.allOf(query1(), query2())
                    .thenAcceptAsync( ... );
        }
    
        public static interface DBResponse {
            default DBResponse of(Response resp){
                ...;
            }
        }


    P.S. Ничего не написал про concurency, не знаю, как вы используете. Имхо удобно инстанцировать отдельный пул на каждый тип операций (disk, http, sql, ui, ...).
    Ответ написан
    1 комментарий
  • Как разделить список чисел на группы по заданному расстоянию между числами в группе?

    @dmshar
    Никакой "математики" тут нет. Впрочем, как и кластерного анализа. Все тривиально просто. Если все именно так, как вы описали, то вы собственно уже сами и описали ваш алгоритм. Правда опустив первый его шаг - предварительную сортировку.
    Итак:
    1. Сортируем имеющиеся данные.
    2. Начинаем просмотр (не важно с какого -верхнего или нижнего) крайнего члена последовательности и сравниваем следующий элемент последовательности с границей вашего интервала (кстати - в вопросе, наверное, ошибка, и Х у вас не 5, а 0.05). Соответственно, включаем его в первую группу, или "закрываем" первую группу и переходим к формированию второй. Повторяем это действие циклически перебирая последовательно все элементы нашего отсортированного набора.

    Если попытаться обойтись без предварительной сортировки - что в принципе тоже не очень сложно - то надо аккуратно посмотреть, не увеличится-ли при этом вычислительная сложность (на вскидку я в этом не уверен).
    Ответ написан
    3 комментария
  • Как планировать архитектуру приложения?

    Beshere
    @Beshere
    Разработчик
    Правильная архитектура - это высший пилотаж. К этом идут, и не все доходят.

    Для начала советую взять на вооружение следующий принцип. Хоть какая-то архитектура начинает появляться, когда код разделяется на независимые блоки с неизменными хорошо описанными интерфейсами. Вот сидишь, пишешь программу абы как и тут понимаешь, что этот блок пишешь уже десятый раз - пора его выносить в отдельную функцию. Со временем такие куски с первого раза видишь и начнёшь обрастать своими библиотеками, строительный запас которых сделает твой код лаконичным и гибким.

    Этого было бы достаточно, чтобы быть хорошим программистом в 20 веке. Увы, дальше придётся учиться:
    1. "Чистая архитектура" Мартин
    2. "Совершенный код" Макконнелл
    3. Паттерны ООП https://refactoring.guru/ru
    Ответ написан
    Комментировать
  • Как планировать архитектуру приложения?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    Примерно так:
    20b039b972.png
    В целом логика следующая:
    1. Сделать декомпозицию задачи
    2. Установить взаимосвязи элементов
    3. Нарисовать схему и логику взаимодействия элементов

    И вот на основе данной схемы намного проще понять и разобраться какие классы, структуры, интерфейсы и прочее требуется.
    Ответ написан
    Комментировать