Код пишется 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 - одна из обязательных книг для программиста.
Используется 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.
startAsync - это такая штука которая лямбду всегда зпускает в другом потоке. Вначале создаем цепочку stage, потом запускаем в каком-нибудь execution service.
Если данные не особо важны, то можно не делать fsync или делать его еще реже. см. index translog. Т.е. в период 1 нужно перестраивать индекс, а в период 2 делать fsync, при этом принимать данные в только память.
>Подключившись к любой общественной точке доступа WI-FI, ты потенциально можешь отслеживать все ссылки на файлы, которые передаются с помощью мессенджера. Для всех нас это стало странной неожиданностью.
Первый круг машины едут не пойми куда — оно и понятно, но почему на втором-то круге они опять делают какие-то петли и заезжают в те же тупики — правильный путь известен же!
Если в четных кадрах показывать красный цвет, а в нечетных — голубой, то в случае честных 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
Пытался решить без спойлера. Возмем второй пример {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 будет такой же как у автора, то подлог доказан.
Есть еще третий случай с Васей и Джоном. Вася говорит своему подчиненному Остапу, что он облажался и просит усерднее работать на общий результат. Остап сообщает Джону (начальнику Васи), что Вася пилит его по каждому поводу и без повода. Вопрос: из какой страны Остап?
Сегодня день тестировщика, а самый первый тест — всегда банальный. Берем первую картинку со стрекозой из яндекса и ищем ее. Правильно — ничего не находит.
Да, вариант 5 самый читабельный.
Код пишется 1 раз, а читается много, поэтому важно, чтобы написано было так, чтобы его легко было читать, отлаживать, тестировать, расширять и переиспользовать. Для этого придумали Naming Convention, Code Style, комментарии, логирование, а так же подходы solid, dry, kiss, yagni, ...
По поводу Option.get, если делать правильно, то get вызывать не нужно никогда, но код превращается в функциональный, и кто-то считает это хуже Option.get, хотя я так не считаю. Если с Option делать и не писать все в 1 строку, то получится вполне читабельный код на функциональном языке.
От субьективности 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.
startAsync - это такая штука которая лямбду всегда зпускает в другом потоке. Вначале создаем цепочку stage, потом запускаем в каком-нибудь execution service.
Да ну? это ж MITM.
Дано:
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
Итого, 40 минут. В реальности — это, конечно, издевательство над кандидатом. Ничего не показывает.
Можно еще по логам форума посмотреть, кто открывал эту тему в первую минуту после создания. Если ip будет такой же как у автора, то подлог доказан.
Запомнил сразу!