Pull to refresh

Comments 70

Python, в котором форматирование кода влияет на выполнение программы.

Слишком громкая фраза.

1. Не любое форматирование, а только отступы.
2. Не любые отступы, а только отступы блоков кода (сюда не входят всякие многострочные перечисления и тексты).
3. Отступы там гибкие, поэтому ничто не мешает использовать 1 пробел, и ваша программа точно так же не будет визуально читаться.

Короче питон — не исключение, там тоже можно напачкать.

С одной стороны вы правы, но сталкивались вы когда-либо с НАСТОЯЩИМИ юниорами?
Когда мы наняли одного такого в команду, то через неделю его уже не было, ибо мы делаем отступы чисто табами(так удобнее) и ситуация.
Мы передали код в котором отступы указаны табами, повсюду…
Возвращают нам код и… там пробелы.

(так удобнее)

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


P.S. Какой язык-то? Вот например, в уже упомянутом Python-е, в PEP 8 так и написано:


Spaces are the preferred indentation method.
Tabs should be used solely to remain consistent with code that is already indented with tabs.

(Другие языки — Rust, Ruby, например — тоже не приветсвуют использование табов в коде. Хотя есть и противоположные примеры (Go)).


Так что если он полностью исправил все табы в коде на пробелы, и никакого формального стиля кода не было — то это, извольте, не его вина.

Речь идет о смешении табов и пробелов.
У нас в команде договоренность о своеобразном "поклонении табам").
При приеме в команду мы об этом предупреждаем.

Речь идет о смешении табов и пробелов.
У нас в команде договоренность о своеобразном «поклонении табам»).
При приеме в команду мы об этом предупреждаем.

Как много слов, которые сокращаются в два слова, если бы вы владели программерской терминологией.
Эти два слова — «Code conventions».
И не нужно никого предупреждать. Новому члену команды просто даётся ссылка на статью «Code convention» в Confluence. Или даже не даётся — он сам её ищет и читает.
1. Смешение табов и пробелов куда хуже чем отдельно табы или пробелы.

2. Табы «в целом» скорее уходящая CodeStyle конвенция. Но например в Linux Kernel Code Style они родимые (не заменяются пробелами, да ещё и по 8 символов) — а оттуда зачастую попадают в CodeStyle контор занимающихся системным ПО.

ПС
Абсолютно с вами согласен, что увольнять! джуниара! вместо того чтобы объяснить! — это совсем какой-то моветон.
Джун на то и джун, чтобы учиться на работе, а не с ходу выдавать желаемый код.
т.е. вы уволили человека, потому что не смогли дать ему принятый в команде форматтер?
Или забили на вводный инструктаж… И не предоставили .editorconfig для (оговоренной перед началом работ?) IDE

.editorconfig — это формат, специально разработанный для того, чтобы не зависеть от IDE.


Ну и что это за «оговоренная перед началом работ IDE», простите? А браузер, которым сотрудники почту читают, вы тоже «оговариваете перед началом работ»?

> для того, чтобы не зависеть от IDE

Именно, так что вопрос «табы или пробелы» не возник бы:
indent_style = space
indent_size = 4

Общаться надо, не думать что «все всё и так знают». Не знают. Особенно человек со стороны внутреннюю кухню проекта.

Я в курсе. Вот эта ваша фраза «.editorconfig для (оговоренной перед началом работ?) IDE» подразумевает, что IDE надо оговаривать. Не надо. Надо просто держать .editorconfig в корне проекта, и не заставлять людей пользоваться какой-то там специальной IDE.


.editorconfig в 2020 понимают все (кроме совсем экзотики).

Про «оговоренной» было в скобках и под вопросом, если что.

Ну вот старые IDE про .editorconfig могут просто не знать.


А ещё, для развивающихся языков, от IDE может зависеть максимальная поддерживаемая версия языка. Например, писать на C# 7.0 в Visual Studio 2015… можно, но в Блокноте это делать проще.


А ещё у IDE может быть какая-то особая интеграция со сборочными системами. К примеру, Visual Studio 2019 — это первая студия, которая идёт без своих плагинов к MSBuild для сборки веб-проектов.


Пальма первенства по кривоте тут, кстати, у Talend MDM Studio, где в зависимости от установленных плагинов будет отличаться поведение скомпилированного кода. Это единственная IDE из известных мне, где пришлось включать в гит пользовательские настройки.

Ну, ОК, для такой экзотики может существовать черный список редакторов, но никак не оговоренная IDE.

Если проект начат на такой вот "экзотике" — то именно она и становится той самой оговоренной IDE. Просто потому что любая другая окажется не вполне совместимой с проектом.

Когда мы наняли одного такого в команду, то через неделю его уже не было, ибо мы делаем отступы чисто табами(так удобнее) и ситуация.
Мы передали код в котором отступы указаны табами, повсюду…
Возвращают нам код и… там пробелы.


У каждого могут быть свои личные предпочтения.
Современные IDE прекрасно умеют отображать код в части табов/пробелов именно так, как надо именно тебе.

Единственный затык мог быть в git/etc, где в коммит попадало бы гораздо больше строк, чем надо. Но это прекрасно решается хуками git, после чего табы/пробелы преобразуются автоматически.

1. В функции выполняется слишком много действий

обратная сторона — функции с одним действием, как советует какой-то очередной апологет. В итоге вместо чтения кода сверху вниз приходится прыгать по всему коду и куче файлов. Стало ли это удобнее? Нет. Стало ли кода меньше? Нет, стало больше.

Когда стоит делить:
Когда кусок кода используется в нескольких местах
Когда большую портянку возможно разбить на логические блоки
Пожалуй это все причины.

2. В проекте имеется закомментированный код

Чтобы искать в истории надо знать время и место. Закомментированный код показывает место, по нему же можно узнать время.
Или можно делать как в офисном холодильнике — если за n месяцев старый код не понадобился — удаляем его.
Любой код можно и нужно разбивать на блоки. Да, из-за «Принципа единственной ответственности» иногда приходится долго прыгать по коду продвигаясь вглубь на низкие уровни, если проблема порылась там. Но зато при этом гораздо более понятно, за что отвечает та или иная функция и тот кусок кода, который в ней находится. Ну, если код нормально написан. А если у вас длинная портянка, делающая кучу вещей разом, то чтобы её поменять и не испортить при этом что-то ещё вам придётся разбираться во всей этой портянке и тщательно продумывать все свои действия с ней. Конечно, можно и по SOLID-у умудриться говнокод написать со всякими «наведёнными эффектами», но это надо будет специально постараться.
Всегда стоит разбивать функции по принципу единственной отвественности. Потому что одна функция должна выполнять роль только порученой ей фунции. Это по крайне мере логично. С другой стороны, если нужно изменить функцию то меняется не что-то глобальное, а что-то конкретное и изолированное.
Тесты упадут не все, а только отосящиеся к выделенной функции.

Можно написать отдельные функции на действия. А саму логику реализовывать в какой-то одной основной функции. Там будет проще на алгоритм смотреть, особенно когда названия функций/процедур корректные. А сами функции а-ля одно действие можно использовать и в других реализация. Но я думаю нового здесь ничего не написано, это у всех в практике используется, для этого и создаются библиотеки, классы, пакеты и т. д. В книге Макконнелла об этом тоже много написано.
А константы тоже можно отель выделить, создав функцию, где они все заданы и там будет проще всего настройку менять, чем по коду скакать.
Единственное непонятно как это на производительности будет сказываться, если всё на элементарные действия разбить.

Позвольте вас поправить:
userPasswordIsValid($user, $salt.$password)

«Соль» нужна для увеличения стойкости пароля к перебору по словарю / брутфорсом. Если склеивать «соль» в начало пароля, то вся суть «соли» теряется, т.к. можно предварительно вычислить значение хэш-функции для данной «соли».
Основная суть соли не теряется. Да, если злоумышленник узнает соль и она будет в начале, то на скорость брутфорса она не повлияет. Но если она не известна, то от перебора по словарю она по-прежнему спасает.

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

По-моему, нет вообще никакой разницы, с какой стороны соль пристыковывается к паролю. Хоть в конец, хоть в начало, хоть в середину.
update А, я понял что имелось в виду.
Ничего не теряется, неважно куда «соль» подставлять, в начало или в конец, она по-прежнему будет препятствовать перебору по словарю, по всяким хеш-таблицам, и т.п.
К взлому по радужным таблицам способ может и останется столь же стойким, но вот для перебора по словарю / брутфорсу становится менее стойким. Поскольку при компрометации соли и хэша пароля в случае склейки соли спереди, можно «предвычислить» значение хэша, и стойкость пароля становится такой же как и без соли.
UFO just landed and posted this here
UFO just landed and posted this here
7. Неактуальные комментарии
Это самое зло, потому что может просто взорвать мозг.
UFO just landed and posted this here
HTTP_404_NOT_FOUND = 404,
HTTP_400_BAD_REQUEST = 400
и т.д. не только не понижает читабельность но еще и дает описание кода состояния
UFO just landed and posted this here
UFO just landed and posted this here
Какая разница какие там еще есть методы в этом классе? Эти константы публичные и не требуют создания объекта. Если у вас в проекте не используется symfony/http-foundation, можно взять к примеру yiisoft/http, там нет ничего лишнего. Есть куча других похожих проектов, для разных ЯП. Константы в классах удобны тем что не засоряют глобальный неймспейс и загружаются автоматически. Т.е. не нужно инкудить файл самостоятельно.

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

Да странно вообще, что в статье только кусочек принципов SOLID рассматривается. Брать принципы, так уж все :)
UFO just landed and posted this here
UFO just landed and posted this here
Я Читала, что код портит переизбыток циклов.А один программист советовал использовать только for each.Не знаю, насколько это правильно.


В такой формулировке — «всегда портит, использовать только» — это ложь.
Имеет значение контекст, где именно.

Где-то желательно следователь данным установкам, а где-то — прямо-таки наоборот.

Можно даже обобщить.


Формулировка «так всегда плохо, надо только эдак» — всегда неверна, и свидетельствует об узком кругозоре оратора :)

Foreach не даст вылезти за край списка и чётче выражает суть кода.


For гибче и особенно полезен при работе с абстрактными числами а не списками. Но его сложнее понять.

`for..of`(JS), `for..in` (Rust) тоже не даст вылезти за пределы.
Foreach не даст вылезти за край списка [...]

Массива, а не списка. В языках, в которых присутствует конструкция foreach обычно из коробки списков нет, только массивы.

В языках. в которых присутствует конструкция foreach, она обычно умеет работать с любыми коллекциями и последовательностями.

Если нет четких и ясных аргументов не слушайте их и делайте как вам нравится. Когда надо, программа сама даст понять когда и как делать лучше. Например тот же forEach (если мы о JS) не сможете использовать для: остановки перебора, использования ключевого слова `await`
UFO just landed and posted this here
Это какие, совсем без циклов? А как остановить перебор без цикла?
UFO just landed and posted this here

Это некорректно, потому что вы сравниваете потроха хаскеля с интерфейсом другого языка.


Всякие high order until, iterate и пр. — сокрывают рекурсию, предоставляя сходный циклу интерфейс, а как там в PHP (или где) под капотом foreach сделан — может и рекурсивно — интимное дело создателей языка.

UFO just landed and posted this here

Еще раз: foreach под капотом может быть реализован рекурсивно. Наверняка, для linked lists он так и сделан.


Под капотом — рекурсия, снаружи: выглядит, как цикл и квакает как цикл. Комбинаторы ведут себя точно так же.

UFO just landed and posted this here
UFO just landed and posted this here

И то, не факт, что разрешат в I/O сразу; сначала, я слышал, джуны по полгода pure хелловорды пишут.

2, 4 и 6 — не проблемы для программы, узкозаточенной на решение одной вполне конкретной задачи.

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

UFO just landed and posted this here
Которые встречаются скажем в 10 местах и вдруг нам надо поменять значение, что будете делать.


А если не встречаются в 10 местах?
А если никогда не придется «вдруг» поменять значение?

Переусложнение программы ради ситуаций, которые никогда не возникнут — это тоже нередкий недочёт в программах.
UFO just landed and posted this here
$cardDeckSize = 52;

Всё-таки лучше магические числа/строки засовывать в константы через define или const (если внутри класса), а не в переменные. А если они таки могут меняться хотя бы теоретически, то выносить в конфигурацию.

Пункт 2 это болезнь кода, который поддерживался при помощи контроля версий именуемой: Folder Copy-Paste


Пункт 5 — это не только у неопытных. Сейчас встречаю код, который писали опытные программеры, но на форматирование забили большой болт. Кошмар, а не чтение :(. Лечится введением нотаций форматирования и шпынянием этих самых "опытных" волшебными пенделями.

Да, например, сейчас читаю код, наполненный константами 0.2, 0.5, 0.8, а также 20, 50, 80 и соответствующими переменными t20, t50, t80 и т.д. Интересно, кто-нибудь тут сможет догадаться, что они значат?

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

UFO just landed and posted this here
А точно не 0.25, 0.5 и 0.7?
Sign up to leave a comment.