Pull to refresh
71
0
Send message

Да, вариант 5 самый читабельный.

Код пишется 1 раз, а читается много, поэтому важно, чтобы написано было так, чтобы его легко было читать, отлаживать, тестировать, расширять и переиспользовать. Для этого придумали Naming Convention, Code Style, комментарии, логирование, а так же подходы solid, dry, kiss, yagni, ...

По поводу Option.get, если делать правильно, то get вызывать не нужно никогда, но код превращается в функциональный, и кто-то считает это хуже Option.get, хотя я так не считаю. Если с Option делать и не писать все в 1 строку, то получится вполне читабельный код на функциональном языке.

public CompletionStage<Result> call(Request request) {
    return getAcHost(request).map(acHost -> {
        // acHost is set
        return getAccount(request).map(account -> {
            // account is set
            return getPage(request).map(page -> {
                // page is set
                return permissionService.canViewPage(acHost, account, page).thenCompose(canView -> {
                    if (canView) {
                        // authorized
                        return delegate.call(request);
                    } else {
                        return completedFuture(forbidden());
                    }
                });
                // page is not set
            }).orElse(completedFuture(unauthorized()));
            // account is not set
        }).orElse(completedFuture(unauthorized()));
        // acHost is not set
    }).orElse(completedFuture(unauthorized()));
}

От субьективности WTFs/minute никуда не уйти, даже оценки в школе мало коррелируют со знаниями. Есть книга Clean Code - одна из обязательных книг для программиста.

Вариант 1

  • Используется Optional.get значит уже что-то неправильное происходит, либо вам не нужны Optional. 1 WTF.

  • Вложенные IF когда это можно избежать. 1 WTF

  • thenComposeAsync да еще и в commonPool! Тут вопрос насколько автор действительно хочет следующий stage запускать всегда в другом потоке из commonPool, а не в том же потоке в каком логика canViewPage. permissionService тоже ведь асинхронный и тоже что-то запускает в другом потоке. Так зачем эти прыжки из потока в поток? Тут 3 WTF.

Вариант 2

  • permissionService.canViewPage возвращает Optional<CompletionStage<Boolean>> что-ли? Может и не возвратить stage? Тут ошибка дизайна какая-то ради flatMap. Сразу 10 WTF

Вариант 3

  • Function3 - ошибка дизайна, надо создать класс с нормальным именем, вроде SecurityRequest, в котором будет 3 поля и он будет передаваться в canViewPage. 10 WTF

Вариант 4

  • Tuple - 10 WTF, то же самое. Никаких Tuple, если это не математические вычисления, быть не может.

Вариант 5

  • orElse(null) как раз и говорит, что Optional, по крайней мере тут в API, не нужен. На уровне синтаксиса java не смогли сделать как в Kotlin, дали костыль - Optional.

Еще нет логов.

Там static import на CompletableFuture? Очень сложно ревьюить. Имхо это оправдано только в тестах, где очень много Mockito и все понимают, что это static import.

public CompletionStage<Result> call(Request request) {
    ACHost acHost = getAcHost(request);
    if (acHost == null) {
        log.debug("Request(id={}).acHost is empty: unauthorized", request.getId());
        return CompletableFuture.completedFuture(unauthorized());
    }

    Account account = getAccount(request);
    if (account == null) {
        log.debug("Request(id={}).account is empty: unauthorized", request.getId());
        return CompletableFuture.completedFuture(unauthorized());
    }

    Page page = getPage(request);
    if (page == null) {
        log.debug("Request(id={}).page is empty: unauthorized", request.getId());
        return CompletableFuture.completedFuture(unauthorized());
    }

    return startAsync(start -> start
            .thenCompose(unused -> {
                log.debug("Request(id={}) processing: acHost={}, account={}, page={}",
                        request.getId(),
                        acHost,
                        account,
                        page
                );
                return permissionService.canViewPage(acHost, account, page);
            }).thenCompose(canView -> {
                if (canView) {
                    log.debug("Request(id={}) authorized", request.getId());
                    return delegate.call(request);
                } else {
                    log.debug("Request(id={}) forbidden", request.getId());
                    return CompletableFuture.completedFuture(forbidden());
                }
            })
    );
}

startAsync - это такая штука которая лямбду всегда зпускает в другом потоке. Вначале создаем цепочку stage, потом запускаем в каком-нибудь execution service.

public CompletionStage<Result> startAsync(Function<CompletionStage<Void>, CompletionStage<Result>> closure) {
    CompletableFuture<Void> start = new CompletableFuture<>();
    CompletionStage<Result> cs = closure.apply(start);
    start.completeAsync(() -> null, es);
    return cs;
}
Если данные не особо важны, то можно не делать fsync или делать его еще реже. см. index translog. Т.е. в период 1 нужно перестраивать индекс, а в период 2 делать fsync, при этом принимать данные в только память.
>Подключившись к любой общественной точке доступа WI-FI, ты потенциально можешь отслеживать все ссылки на файлы, которые передаются с помощью мессенджера. Для всех нас это стало странной неожиданностью.

Да ну? это ж MITM.
Первый круг машины едут не пойми куда — оно и понятно, но почему на втором-то круге они опять делают какие-то петли и заезжают в те же тупики — правильный путь известен же!
Что можете плохого сказать про Hadoop в контексте сравнения с ClickHouse?
Автор выразил мысль, что в программе бэкдор и датчики гидроакустики не работают с 5:00 до 5:30.
Если в четных кадрах показывать красный цвет, а в нечетных — голубой, то в случае честных 60 fps, по сумме цветов, мы должны увидеть белый цвет. Такого тестового видео я не нашел, но www.vsynctester.com до сих пор показывает потери кадров в Firefox. Понимаю, там не video, а requestAnimationFrame, но все же.
Его в локальной сети компании можно ставить или вся переписка будет доступна третьим лицам?
Вы не программист
А давайте векторно.

Дано:
T = (xx, yy, zz) — Петя
S = (x0, y0, z0) — Входящий
P = (A, B, C) — Перпендикуляр к плоскости зеркала
X = (x, y, z) — Точка отражения входящего на плоскости

Во первых, сразу скажем, что не увидит, если точки T и S лежат по разные плоскости зеркала, т.е.
скалярые произведения PS и PT разных знаков, можно это записать как
if ((PS)*(PT) < 0) { не увидит }
Кстати, в решении так и написано: (P*S)*(P*T) = (A*x0+B*y0+C*z0)*(A*xx+B*yy+C*zz)

Пусть F = (T — X) + (S — X) = (T + S — 2X)
Пусть G = T + S, тогда F = G — 2X
По определению точки X, F коллинеарен P, запишем это:
P(G — 2X) = +-|P||G — 2X| или (PG-2PX)^2 = PP*(GG-4GX+4XX)

Известно, что PX=0, значит
PG*PG = PP*(GG-4GX+4XX)

А еще F перпендикулярен X, т.е.
2. X(G — 2X) = 0 или GX — 2XX = 0 или GX = 2XX

Подставляем GX:
PG*PG = PP*(GG-8XX+4XX) = PP*(GG-4XX) = PP*GG-4*PP*XX

XX = (PP*GG — PG*PG) / (4*PP)

Петя увидит входящего, если |X| <= R, т.е. XX <= R*R

Окончательно:
PP*GG-PG*PG <= 4*PP*R*R
В WebGL все так плохо со сглаживанием текста? Chrome, FF.
Не работает :(
Пытался решить без спойлера. Возмем второй пример {2,5,1,3,1,2,1,7,7,6}: Идем слева, находим первый обрыв — это высота 5. Дальше идем и ищем первую стену выше или равной 5 — это 7. Пока шли, мы считали сумму высот между ними — это 1+3+1+2+1=8 (назовем это груном в озере) и ширину озера = 5, дальше берем объем озера между 5 и 7 равный 5*5=25 и вычитаем объем грунта 8, получаем 17. начиная с последнего места повторяем, и так до конца.
Итого, 40 минут. В реальности — это, конечно, издевательство над кандидатом. Ничего не показывает.

private static int calc(int[] arr) {
        int h = 0;
        int w = 0;
        int stone = 0;
        int lake = 0;
        for (int i = 1; i < arr.length; i++) {
            if (h == 0) {
                if (arr[i] < arr[i - 1]) {
                    h = arr[i - 1];
                    stone = arr[i];
                    w = 1;
                }
            } else {
                if (arr[i] < h) {
                    stone += arr[i];
                    w++;
                } else {
                    lake = w * h - stone;
                }
            }
        }
        return lake;
    }
«менее минуты назад» это полный фейл
Можно еще по логам форума посмотреть, кто открывал эту тему в первую минуту после создания. Если ip будет такой же как у автора, то подлог доказан.
Все ищут архитекторов, инженеров, творцов, профессионалов, а находят рисовщиков кнопочек. Как правильно искать надо?
Есть еще третий случай с Васей и Джоном. Вася говорит своему подчиненному Остапу, что он облажался и просит усерднее работать на общий результат. Остап сообщает Джону (начальнику Васи), что Вася пилит его по каждому поводу и без повода. Вопрос: из какой страны Остап?
Кандидат проходит пять кругов ада, но потом начинается размеренный и привычный цикл разработки
image
Сегодня день тестировщика, а самый первый тест — всегда банальный. Берем первую картинку со стрекозой из яндекса и ищем ее. Правильно — ничего не находит.

image
Наиболее проработанная таблица символов для облегчения запоминания кодированной информации.
в заключение 4nq7bcgosuemmwcq4gy7ddbcrdeadwcn4napdysttuea6egosmembwfhrdemdwcm4n77bcby4n97bxsozzea9wcn4n67bcby4nhnbwf94n9pbq6oszemxwf74nanh

Запомнил сразу!
1
23 ...

Information

Rating
Does not participate
Location
Санкт-Петербург, Санкт-Петербург и область, Россия
Registered
Activity