Лучше ли использовать булеву переменную для замены условия if на удобочитаемость или нет? - PullRequest
0 голосов
/ 27 сентября 2018

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

  • пример логической переменной

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

    is_old_enough = persons_age >= legal_drinking_age
    if is_old_enough:
        do something

Мой учитель сказал мне сегодня, что это будет очень плохо для успеваемости, так как 2 теста выполняются в первую очередь person_age> = legal_drinking_age протестировани, во-вторых, в случае, если происходит другой тест, является ли человек is_old_enough.Мой учитель сказал мне, что я должен просто поставить условие в if, но в видео они сказали, что код должен читаться как естественный язык, чтобы сделать его понятным для других программистов.Теперь мне было интересно, какой из методов кодирования будет лучше.

  • пример условия, если:

    if persons_age >= legal_drinking_age:
        do something
    

В этом примере только 1 тестпроверяется, есть ли Person_age> = Legal_drinking_age.По словам моего учителя, это лучший код.

Заранее спасибо!

С уважением

Йонас

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Производительность

Производительность - один из наименее интересных вопросов для этого вопроса, и я говорю это как человек, работающий в очень критичных для производительности областях, таких как обработка изображений и трассировка лучей, кто верит в эффективноемикрооптимизации (но мои идеи эффективной микрооптимизации были бы такими, как улучшение шаблонов доступа к памяти и макетов памяти для повышения эффективности кэша, а не устранение временных переменных из-за страха, что ваш компилятор или интерпретатор может выделить дополнительные регистры и / или использовать дополнительные инструкции).

Причина, по которой это не так интересно, заключается в том, что, как указано в комментариях, любой приличный оптимизирующий компилятор будет рассматривать эти два написанных вами как эквивалентные к тому времени, как он завершит оптимизацию промежуточного представления и сгенерируетокончательные результаты выбора команды / распределения регистров для получения окончательного результата (машинный код).И если вы не используете приличный оптимизирующий компилятор, то этот вид микроскопической эффективности, вероятно, является последним, о чем вы должны беспокоиться в любом случае.

Переменные области действия

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

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

some_variable = ...
...
some_other_variable = ...
...
yet_another_variable = ...
(300 lines more code to the function)

... в какой-то функции, и вы пытаетесь ее отладить, то эти переменные в сочетании с чудовищным размером функции начинают умножать сложностьпытаясь понять, что пошло не так.Это практическая проблема, с которой я столкнулся при отладке кодовых баз, охватывающих миллионы строк кода, написанных всеми видами людей (включая тех, которых больше нет в команде), где не так интересно смотреть на окно наблюдения местных жителей в отладчике и видеть дваПеременные страниц в какой-то чудовищной функции, которая, кажется, что-то делает неправильно (или в одной из функций, которые она вызывает).

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

Прагматичный взгляд на области переменных

Так что я думаю, что многие концепции программирования можно в некоторой степени понять, просто понимая необходимость суженияпеременные области.Люди говорят, избегайте глобальных переменных, таких как чума.Мы можем разобраться с тем, как это общее состояние может мешать многопоточности и как оно затрудняет изменение и отладку программ, но многие проблемы можно понять только благодаря стремлению сузить область действия переменных.Если у вас есть кодовая база, которая охватывает сто тысяч строк кода, то глобальная переменная будет иметь объем в сто тысяч строк кода как для доступа, так и для модификации, и грубо говоря, сто тысяч способов ошибиться.

В то же время этот прагматичный вид будет бессмысленным создавать единовременную программу, которая занимает всего 100 строк кода и не нуждается в расширении в будущем, избегая глобальных переменных, таких как чума, так как глобальные здесь только развиваются.так сказать, иметь 100 строкМежду тем, даже тот, кто избегает подобных чумы во всех контекстах, все же может написать класс с переменными-членами (включая некоторые излишние для «удобства»), реализация которых охватывает 8000 строк кода, и в этом случае эти переменные имеют гораздо более широкую область применения, чем дажеглобальная переменная в первом примере, и эта реализация может побудить кого-то спроектировать меньшие классы и / или уменьшить количество лишних переменных-членов, которые будут включены как часть управления состоянием для класса (что также может привести к упрощенной многопоточности и всеманалогичные преимущества (исключение глобальных переменных в некоторой нетривиальной кодовой базе).

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

0 голосов
/ 15 ноября 2018

Мне было интересно, какой метод кодирования будет лучше.

Реальный надежный ответ: зависит ...

Я ненавижу использовать этот ответ, новы не будете спрашивать, если у вас нет верных сомнений.(:

ИМХО:

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

Если программаСкорость работы имеет решающее значение, тогда любая кодовая операция, которая использует меньше ресурсов (меньший цикл dataSize / dataType / less, необходимый для достижения того же самого / оптимизированная последовательность задач / максимизирует задачу ЦП за тактовый цикл / сокращенный цикл повторной загрузки данных) (примерключевое слово: код пространства-времени)

Если программа, минимизирующая использование памяти, имеет решающее значение, то любая операция кода, которая использует меньше памяти и ресурсов памяти для завершения своей работы (что может потребовать больше цикла / цикла процессора длята же задача) лучше (пример: небольшие устройства, которые имеют ограниченное хранилище данных / ОЗУ)

Если вы участвуете в гонке, то вы можете закодировать как можно короче (даже если это может занятьнемного более длительное время процессора). Пример: Hackathon

Если вы программируете, чтобы научить команду ученика / друга чему-то ...код dable + много комментариев определенно предпочтительнее.

Если это я ... Я буду придерживаться всего, что возможно, ближе к языку ассемблера (как можно больше контроля над битовыми манипуляциями) для разработки бэкэнда.и все, что ближе к математико-подобному коду (меньше кода, максимальный вывод, на самом деле все равно, сколько ресурсов процессора / памяти требуется) для разработки интерфейса.(:

Итак. Если это вы ... у вас могут быть собственные требования / предпочтения ... с точки зрения пользователя / аутсайдеров / клиентов ... это просто рабочая / неработающая программа. ВАШЕ определениехорошей программы может отличаться от других ... но это не должно помешать нам проявить гибкость в стиле / методе кодирования.

Приятного изучения. Надеюсь, это поможет ... любым возможным способом.

...