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 ответов

20 просмотров

Определять тип по расширению фу такими быть)) Я написал 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
работал я с этими "в условиях поставленных требова...

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

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

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

А как старый хаскел с новым стыковать ? потому как тут работает https://play.haskell.org/saved/C3xpMzcd, а вот тут https://stepik.org/lesson/7602/step/9?unit=1473 нет ошибка C...
Fedor
131
что насчет пагинга? на осдеве непонятно(
Vi Chapmann 🪙
26
Вопрос я правильно понимаю что в коде newtype ArrowMap k v = ArrowMap { getArrowMap :: k -> Maybe v } getArrowMap есть функция типа k -> Maybe v, если да, то не понимаю задач...
Fedor
64
Ребят, что лучше для реверса: гидра или ида?
En Vind Av Sorg
26
Делаю велосипед логгер. К сообщению хочу прикрутить некоторую информацию, типа, кем отправлено, какой уровень, и всякое такое. И тут подумалось мне, почему бы не хранить весь...
Serjone
24
Как Вы считаете нормально ли в двадцатых годах 21 века в ВУЗах Российской Федерации обучать студентов работе с TASM? Не слишком ли это "архаично"? (Если оффтоп или флейм для э...
Spiker01
52
Комрады, хотел уточнить. Проперть в OnDestroy юнита-хозяина по-прежнему доступна? И еще уточнение: finalization юнита наступает раньше или позже OnDestroy?
Ed Doc
48
если загрузчик efi? если сама PML4 PDPT PDT PT лежит в неудобном для меня месте?
Vi Chapmann 🪙
8
Продолжая диалог про свифт в проде – сейчас возник вопрос в активном наборе бекендеров. В основном в нашей компании мы фанаты Java Spring и полностью ей довольны. Однако найм ...
Guseyn
27
Читаю сейчас [нет, уже больше не читаю!] курсовую о Булгакове, написанную, похоже, с помощью ChatGPT. Это удивительный психоделический опыт. Текст в основном написан в стиле б...
✨ Uni [🌊 В отпуске]
1
Карта сайта