function foo() {
var x = 1;
const arr = [1, 2, 3, 4, 5];
for (let i = 0; i < 5; i++) {
var x = arr[i];
}
console.log(x);
}
function bar() {
let x = 1;
const arr = [1, 2, 3, 4, 5];
for (let i = 0; i < 5; i++) {
let x = arr[i];
}
console.log(x);
}
foo();
bar();
Ну зачем мы меня заставляете объяснять базовые вещи?
Использование var потенциально может привести к багам, если кто-то будет дорабатывать эту функции и заюзает переменную mid выше цикла и не обратит внимание на то что она используется где-то там в ниже в цикле и будет соответсвенно ожидать то значение которое было туда записано до цикла.
В редакторе код выглядел нормально и там были отступы. Даже при последующем редактировании. Кроме того вы спросили где бы я добавил пустые строки, я вам показал. Так что ваши придирки к отсутствию индентации не имеют никакого отношения к обсуждаемому предмету.
Потому что нефиг рассчитывать на оптимизатор, я хз будет ли он выделять память для переменной каждый раз или сможет оптимизировать и вынести выделение памяти за пределы цикла. Это база, мой друг.
Я не пишу на js и с утра не было времени чекнуть есть ли там готовый метод findLast в js и если нет писать его реализацию. А он есть и соответственно весь этот код превращается в велосипед.
так. еще раз по пунктам. в приведенном решении есть несколько проблем: 1) код плохо читается 2) нет проверки на то что входное значение может быть не только null но и чем угодно, например объектом или строкой 3) использован тяжелый метод Math.floor 4) одна из переменных объявлена внутри цикла, что лишние 5) код не универсален, следовало бы оформить его чтобы мможно было переиспользовать с любым компаратором.
Поэтому конечно я бы не стал брать автора. То что я бы его не взял исключительно из-за нечитаемости кода, это ваши выдумки
p.s. и да, вы придрались к парсеру хабра, а не ко мне.
вообще в последних версиях js есть метод findLast, так что еще один минус автору за изобретение велосипеда. И даже если метода нет, то возможно не стоило выпендриваться, а стоило писать что-то (я не тестировал но кажется должно работать):
const findLastIndex = (array, comparator) => {
// или любой алгоритм по вкусу
for (let i = array.length - 1; i >= 0; i--) {
if (comparator(array[i])) {
return i;
}
}
return -1;
}
function find(a, x) {
if (!Array.isArray(a) || a.length === 0) {
return -1;
}
const result = a[findLastIndex(a, i => i <= x)];
return result == undefined ? -1 : result;
}
я имел в виду отбитие блоков внутри функции. хорошая практика что любой блок который занимает более одной строки отбивается пустыми строками. Хорошая практика никогда не писать if (foo) return 1, читается проще.
Как-то так:
function f(x, a) { if (!Array.isArray(a) || a.length === 0) { return -1; }
let result = -1; let low = 0; let high = a.length — 1; let mid;
while (low <= high) { mid = (low + high) >> 1;
if (a[mid] == x) { return x; }
if (a[mid] < x) { result = a[mid]; low = mid + 1; } else { high = mid - 1; } }
return result; }
Обратите внимание, что я также вынес объявление mid за пределы цикла.
P.S. Ну да, авторы руководств по рефакторингу дураки, а вы нет.
я нигде не предлагал заменить предложенный алгоритм на мой. Просто написал простой алгоритм который первый пришел в голову, а потом рассмотрел предложенное решение. Не надо выдумывать.
код должен легко читаться, отбивки помогают этому, и это прописано в довольно большем количестве коудстайлов. Если человек не думает о читатебельности этого кода, я бы не стал его брать
дополнительный нестинг усложняет читабельность, это всем известный факт который указан в книках по рефакторингу.
def find(a, x):
if not isinstance(a, list) or not len(a):
return -1
pos = len(a) // 2
step = 1
res = -1
if a[pos] > x:
step = -1
else:
res = a[pos]
while True:
pos += step
if pos == -1 or pos == len(a):
break
if a[pos] <= res:
return res
if a[pos] <= x and a[pos] > res:
res = a[pos]
return res
или на js:
function find(a, x) {
if (!Array.isArray(a) || a.length === 0) {
return -1;
}
let pos = a.length >> 1;
let step = 1;
let res = -1;
if (a[pos] > x) {
step = -1;
} else {
res = a[pos];
}
while (true) {
pos += step;
if (pos === -1 || pos === a.length) {
break;
}
if (a[pos] <= res) {
return res;
}
if (a[pos] <= x && a[pos] > res) {
res = a[pos];
}
}
return res;
}
А ваше решение имеет проблемы:
// про плюсы отбития блоков пустыми строками вы похоже не слышали
function f(f, a) {
// а что если здесь не массив а объект?
// кроме того условие и код в одну строчку это плохой стиль
if (a == null || a.length == 0) return -1;
// Общепринятая семантика это result, а не answer
// и почему var, а не let?
var answer = -1;
var low = 0;
var high = a.length — 1;
while(low <= high) {
// Нафига Math.floor? Битовый сдвиг проще: (low + high) >> 1
// и как то сложно, я таки не понимаю зачем это делать в цикле.
var mid = Math.floor((low + high) / 2);
if (a[mid] == x) {
return x;
}
// нафига тут else если перед ним return?
else if (a[mid] < x) {
answer = a[mid];
low = mid + 1;
} else {
high = mid — 1;
}
}
return answer;
}
вот вы бы лучше рассказали как вы почтовые адреса слили спамерам. история такая что у меня свой почтовый сервер и настроена переадресация с любого email адреса в моем домена на мой адрес. При регистрации я указываю адрес имясайта@мойдомен, в вашем случае g-mate@мойдомен. Все было хорошо, а вот месяц назад начал валиться спам на вот этот самый g-mate@мойдомен. А адрес я понятное дело нигде не светил кроме как вам. Такие дела.
Главное — продать это кстати типично для америки, неоднократно слышал от людей живущих там, что качество продукта особой роли не играет, главное как ты его продаешь
ну да, вот вы сейчас такие воодушевленные построете бизнес, а потом правительство еще что-нибудь учудит и хана вашему бизнесу. Знаете, мне кажется в Непале щас риски ниже, чем в России, не смотря на землятресения
Cбербанку нужен счет в Axis. У него его нет, поэтому используется банк посредник, в данном случае Deutsche Bank, он указывается как часть реквизитов получателя отправителем платажа. И поскольку у Axis тоже есть счет в Deutsche Bank, никаких проблем не возникает.
Сейчас кажется отключен SWIFT для сбербанка, так что он врядли сможет отправить деньги в любой зарубежный банк, потенциальные исключения - Мэнистан (узбекистан, казахстан, etc..), Армения, Грузия, Китай.
Если Axis откроек коррсчет в китае и сбер откроет коррсчет в том же китайском банке, то возможно переводы заработают с ограничениями и эти ограничения будут наложены со стороны России.
В UI вчера не нашел. Думал о том, что можно послать документы ручками, без формы, как раньше, но из-за 20% не стал париться конечно. Кстати, со счета ИП валюту в альфе купить тоже нельзя.
на всякий случай оставлю это здесь: [Forwarded from Индия Сегодня] Подписчик рассказывает, что при попытке перевести деньги из России в Индию Deutsche Bank, через который шел платеж между Сбербанком и Axis Bank, просто конфисковал деньги "до особых распоряжений".
Еще конечно есть вариант назначить бесконечность процесса смыслом процесса, это довольно итересная точка зрения, но к случаю со стрекозой не относится, жизнь её не важна вообще поскольку ведь еще грибы, и их существование имеет точно такую же значимость как существование стрекоз
ну вот вам пример
Ну зачем мы меня заставляете объяснять базовые вещи?
Использование var потенциально может привести к багам, если кто-то будет дорабатывать эту функции и заюзает переменную mid выше цикла и не обратит внимание на то что она используется где-то там в ниже в цикле и будет соответсвенно ожидать то значение которое было туда записано до цикла.
references:
https://hackernoon.com/why-you-shouldnt-use-var-anymore-f109a58b9b70
https://dev.to/mindninjax/stop-using-var-for-declaring-variables-2p3a
В редакторе код выглядел нормально и там были отступы. Даже при последующем редактировании. Кроме того вы спросили где бы я добавил пустые строки, я вам показал. Так что ваши придирки к отсутствию индентации не имеют никакого отношения к обсуждаемому предмету.
Потому что нефиг рассчитывать на оптимизатор, я хз будет ли он выделять память для переменной каждый раз или сможет оптимизировать и вынести выделение памяти за пределы цикла. Это база, мой друг.
Я не пишу на js и с утра не было времени чекнуть есть ли там готовый метод findLast в js и если нет писать его реализацию. А он есть и соответственно весь этот код превращается в велосипед.
так. еще раз по пунктам.
в приведенном решении есть несколько проблем:
1) код плохо читается
2) нет проверки на то что входное значение может быть не только null но и чем угодно, например объектом или строкой
3) использован тяжелый метод Math.floor
4) одна из переменных объявлена внутри цикла, что лишние
5) код не универсален, следовало бы оформить его чтобы мможно было переиспользовать с любым компаратором.
Поэтому конечно я бы не стал брать автора. То что я бы его не взял исключительно из-за нечитаемости кода, это ваши выдумки
p.s. и да, вы придрались к парсеру хабра, а не ко мне.
вообще в последних версиях js есть метод findLast, так что еще один минус автору за изобретение велосипеда. И даже если метода нет, то возможно не стоило выпендриваться, а стоило писать что-то (я не тестировал но кажется должно работать):
я имел в виду отбитие блоков внутри функции.
хорошая практика что любой блок который занимает более одной строки отбивается пустыми строками. Хорошая практика никогда не писать if (foo) return 1, читается проще.
Как-то так:
function f(x, a) {
if (!Array.isArray(a) || a.length === 0) {
return -1;
}
let result = -1;
let low = 0;
let high = a.length — 1;
let mid;
while (low <= high) {
mid = (low + high) >> 1;
if (a[mid] == x) {
return x;
}
if (a[mid] < x) {
result = a[mid];
low = mid + 1;
} else {
high = mid - 1;
}
}
return result;
}
Обратите внимание, что я также вынес объявление mid за пределы цикла.
P.S. Ну да, авторы руководств по рефакторингу дураки, а вы нет.
я нигде не предлагал заменить предложенный алгоритм на мой. Просто написал простой алгоритм который первый пришел в голову, а потом рассмотрел предложенное решение. Не надо выдумывать.
код должен легко читаться, отбивки помогают этому, и это прописано в довольно большем количестве коудстайлов. Если человек не думает о читатебельности этого кода, я бы не стал его брать
дополнительный нестинг усложняет читабельность, это всем известный факт который указан в книках по рефакторингу.
я бы начал искать с середины массива:
или на js:
А ваше решение имеет проблемы:
В итоге я бы вас не взял с таким решением
не раскрыта тема пагинации аггрегаций
кмк учат потому что люди в осномном склонны следовать традициям, потому что если не следовать неизвестно что может получится, а неизвестное опасно.
вот вы бы лучше рассказали как вы почтовые адреса слили спамерам.
история такая что у меня свой почтовый сервер и настроена переадресация с любого email адреса в моем домена на мой адрес. При регистрации я указываю адрес имясайта@мойдомен, в вашем случае g-mate@мойдомен. Все было хорошо, а вот месяц назад начал валиться спам на вот этот самый g-mate@мойдомен. А адрес я понятное дело нигде не светил кроме как вам. Такие дела.
Главное — продать
это кстати типично для америки, неоднократно слышал от людей живущих там, что качество продукта особой роли не играет, главное как ты его продаешь
"Делай хорошо — плохо само получится"
ну да, вот вы сейчас такие воодушевленные построете бизнес, а потом правительство еще что-нибудь учудит и хана вашему бизнесу. Знаете, мне кажется в Непале щас риски ниже, чем в России, не смотря на землятресения
тут была расшифровка коммента который выше.
забавно, что то кте дизлайкнул не способны понять регулярку
Cбербанку нужен счет в Axis. У него его нет, поэтому используется банк посредник, в данном случае Deutsche Bank, он указывается как часть реквизитов получателя отправителем платажа. И поскольку у Axis тоже есть счет в Deutsche Bank, никаких проблем не возникает.
Сейчас кажется отключен SWIFT для сбербанка, так что он врядли сможет отправить деньги в любой зарубежный банк, потенциальные исключения - Мэнистан (узбекистан, казахстан, etc..), Армения, Грузия, Китай.
Если Axis откроек коррсчет в китае и сбер откроет коррсчет в том же китайском банке, то возможно переводы заработают с ограничениями и эти ограничения будут наложены со стороны России.
В UI вчера не нашел. Думал о том, что можно послать документы ручками, без формы, как раньше, но из-за 20% не стал париться конечно.
Кстати, со счета ИП валюту в альфе купить тоже нельзя.
на всякий случай оставлю это здесь:
[Forwarded from Индия Сегодня]
Подписчик рассказывает, что при попытке перевести деньги из России в Индию Deutsche Bank, через который шел платеж между Сбербанком и Axis Bank, просто конфисковал деньги "до особых распоряжений".
А вы не сможете.
Альфа:
Есть два варианта, либо перевести все с транзитного счета на валютный, либо продать все.
Если переводить на валютный, то они отклонят СВО.
Тинёк:
Деньги пришли, но показываются в ожидаемых платежах. Судя по всему IT отдел спешно пилит эту форму для продажи 80%
Еще конечно есть вариант назначить бесконечность процесса смыслом процесса, это довольно итересная точка зрения, но к случаю со стрекозой не относится, жизнь её не важна вообще поскольку ведь еще грибы, и их существование имеет точно такую же значимость как существование стрекоз