170 похожих чатов

Рецензировал я значит сегодня PR и увидел этот код: contentType :=

"image/jpeg"
if strings.HasSuffix(strings.ToLower(fileName), ".png") {
contentType = "image/png"
}

if !strings.HasSuffix(strings.ToLower(fileName), ".jpg") &&
!strings.HasSuffix(strings.ToLower(fileName), ".png") {
return echo.ErrNotFound
}


предложил исправить и даже не поленился объяснить что к чему, написать тесты и предоставить доказательства моих опасений что этот код можно в худшем случае ускорить в 150 раз и в лучшем как минимум ~6 раз:
https://go.dev/play/p/FS5HczEV5x0

но моё предложение отвергли с объяснением: "это конечно хорошо, но мы оставим нынешний более читабельный код"

Вот сижу я и недоразумеваю. Действительно ли это настолько менее читабельно что неоправдывает эффективность? 🤔

Как вы думаете?

P.S. этот код выполняется в HTTP handler'е, т.е. это не нечто что пару раз выполнится, оно будет крутиться в каждом запросе на этот endpoint

34 ответов

42 просмотра

Определять тип по расширению фу такими быть)) Я написал img.jpeg и сломал ваш код😁

Roman-Sharkov Автор вопроса
Alexander N
Определять тип по расширению фу такими быть)) Я на...

у нас ещё до этого фильтр стоит, .jpeg инвариант в данном случае

Ты можешь еще раз поговорить со своими коллегами. Мол, не понял, давайте заново. Если два раза на хендлер с нагрузкой в сто разпросов в сутки, то они правы

Alexander N
Определять тип по расширению фу такими быть)) Я на...

может это возврат существуещего файла в на гет запрос, тогда логично, что проверка была при загрузке этого файла(это кстати тоже может быть необязательно), а не при чтении, нужно контекст знать, что понимать сломается что то или нет

мне кажется все 3 варианта одинакого плохо читабельны 😄 и я бы использовал http.DetectContentType вместо этих костылей. Но аргументы про аллокацию я бы тут тоже не принял. При загрузке файлов 2 аллокации даже на погрешность тайминга обработчика не повлияют

если уж упарываться, то зачем equal.Fold если вы проверяете на только ASCII строки, можно и switch переделать. Но, главное, понимать зачем. То есть получили вы вместо 250нс на эту операцию условные 25мс. Изменился ли тайминг загрузки и обработки файла?

какая в жопу читабельность? этот код невалидный на 100%

Все варианты фигня, man path.Ext

да все идет к тому что лучше юзать внешние библиотеки и тогда нельзя будет доебаться)

func EvenBetter2(fileName string) (contentType string, err error) { extension := path.Ext(fileName) switch extension { case ".jpg": return "image/jpeg", nil case ".png": return "image/png", nil default: return "", ErrNotFound } }

Rostislav Teryaev
func EvenBetter2(fileName string) (contentType str...

у этого кода не то поведение, что было в оригинальном коде

Rostislav Teryaev
там есть тест. Этот код проходит тест

это что то значит кроме того, что покрытие неполное?

Maxim Biryukov
это что то значит кроме того, что покрытие неполно...

ну это значит, что нам нужно было какое-то поведение, мы тестом его задали. Я не спорю, может реально не 1 в 1 с исходным кодом, просто в тесте не отражено это

Rostislav Teryaev
ну это значит, что нам нужно было какое-то поведен...

ну то есть strings.ToLower() и strings.FoldEqual по вашему просто для прикола использовали?

ну ты докопался, что я ToLower забыл? Ну хорошо, судя по исходному коду нужен он там, да

Rostislav Teryaev
ну ты докопался, что я ToLower забыл? Ну хорошо, с...

"и читабельнее всех вариантов и быстрее" если добавить ToLower то перестанет быть быстрей чем вариант с foldEqual

Roman-Sharkov Автор вопроса
Илья О
если уж упарываться, то зачем equal.Fold если вы п...

это вопрос культуры. Экономически вопрос не имеет значения.

Roman-Sharkov Автор вопроса
Alex
какая в жопу читабельность? этот код невалидный н...

кажется вы не читали ни требования ни сам код)

Roman Sharkov
кажется вы не читали ни требования ни сам код)

какие тут могут быть требования? я читал код, я бы такой код на ревью завернул вне зависимости от требований

Roman-Sharkov Автор вопроса
Nikita
Все варианты фигня, man path.Ext

в принципе да, можно было использовать его. Я просто знал в момент написания что ничего кроме .jpg и .png там априори быть не может

Roman-Sharkov Автор вопроса
Rostislav Teryaev
func EvenBetter2(fileName string) (contentType str...

помоему path.Ext не учитывая case-insensitive

Roman-Sharkov Автор вопроса
Rostislav Teryaev
ну это значит, что нам нужно было какое-то поведен...

да увы, я забыл добавить upper case тест в суматохе

Roman Sharkov
помоему path.Ext не учитывая case-insensitive

func EvenBetter2(fileName string) (contentType string, err error) { extension := path.Ext(fileName) extension = strings.ToLower(extension) switch extension { case ".jpg": return "image/jpeg", nil case ".png": return "image/png", nil default: return "", ErrNotFound } }

Roman-Sharkov Автор вопроса
Alex
какие тут могут быть требования? я читал код, я бы...

я бы с вами даже не работал если бы вы всегда так агрессивно выражались 🙂

Rostislav Teryaev
func EvenBetter2(fileName string) (contentType str...

BenchmarkCurrent-20 8306320 148.8 ns/op 72 B/op 3 allocs/op BenchmarkBetter-20 21330168 56.54 ns/op 24 B/op 1 allocs/op BenchmarkEvenBetter-20 300046702 3.993 ns/op 0 B/op 0 allocs/op BenchmarkEvenBetter2-20 124245432 9.700 ns/op 0 B/op 0 allocs/op

Rostislav Teryaev
BenchmarkCurrent-20 8306320 148.8 ns/op 72 B...

да пофиг на эти 4 нс, стало гораздо читабельнее, как по мне

Roman Sharkov
я бы с вами даже не работал если бы вы всегда так ...

а выражаюсь я так, потому что предъявленное вами решение очевидно очень плохое, а вы вместо того, чтобы понять, почему оно для вас неочевидно, пытаетесь его защитить

Roman-Sharkov Автор вопроса

в условиях поставленных требований оно не плохое. Я просто хотел вам дать feedback того что ваша коммуникация крайне агрессивна и может оттолкнуть

Roman Sharkov
в условиях поставленных требований оно не плохое. ...

работал я с этими "в условиях поставленных требований", это приводит лишь к тому, чтобы вместо того, чтобы сразу сделать нормально, мы наслаиваем костыли над костылями. Вот мой фидбек вам 😁

Roman-Sharkov Автор вопроса
Alex
работал я с этими "в условиях поставленных требова...

ваше опасение по поводу того что входные данные могут измениться и имя файла может несоответствовать содержанию я понял и знаю. Но оно в нашем случае не релевантно.

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта