LINUX.ORG.RU

такой код — знак плохого алгоритма\программиста или это норма?

 


0

2

Привет.

Я не работаю программистом, но периодически пишу на Python. У меня не знакомых коллег или друзей, которые пишут на Python, поэтому спрошу тут. Вот кусочек кода: http://i.imgur.com/3i3Lg3t.png

Можно заметить подряд идущие elif, if, for, try, if, except.

Ну так вот, это норма или нет? Такое вообще допустимо или стоит что-то переделать?

P.S. оно работает.

Спасибо!

★★★
Ответ на: комментарий от iljuase

Да, но это не очень читаемо. Обычно делают так:

def func():
    if ....:
        return

    if ...:
        return

    return ...
paganmind
()

такой код — знак плохого алгоритма\программиста или это норма?

«или» заменить на «и» и убрать знак вопроса.

Вообще, на продакшне и не такое увидишь.

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

SuoiCat
()

Если у тебя нет контроля над кодом, что кидает эксепшены - норма.

Norgat ★★★★★
()

В целом ничего страшного и криминального в этом нет, но обычно если потратить лишние несколько минут на обдумывание, получается написать более элегантно.

gnunixon ★★★
()
Ответ на: комментарий от iljuase

Мне скорее смущают переменные с именами idx и counter_2. Это скользкий путь, попячся! Код скриншотами меня тоже смущает

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

MrClon ★★★★★
()

сложно сказать, мы же не знаем что этот код должен делать

Int64 ★★★
()

Не, вот так вот не круто. :( Зоопарк if'ов, странные имена переменных, да ещё print по середине... После полгода сам не разберёшь, что там понаписал. Советую выражаться в коде по ясней, например, с использованием дополнительных функции, объектов, даже модулей. Типа, разделяй и властвуй. Ах да, ещё вот это очень хорошая вещь для проверки стиля, весь код стараюсь писать под оценку в 10.00 - https://www.pylint.org/

anonymous
()

Пока по горизонтали на экран влезает все норм, сам так пишу.

KillTheCat ★★★★★
()

Недостаточно плохой чтобы ставить диагноз, но определённо есть что улучшить.

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

anonymous
()

Возьми кусок бумажки и ручку/карандаш. Начинай поток рисовать в формате диаграмм. Автор кода идет строго по бумажке. Поэтому в целом такой подход вполне адекватный.

bookman900 ★★★★★
()

Любой плохой императивный код можно размазать по куче объектов разных паттернов ООП и разным файлам, и это уже будет выглядеть умно, а если кто придерётся - всегда можно будет обозвать его ретроградом.

Bahamut
()

давай уже кусок кода не жпегом

ggrn ★★★★★
()

такой код - признак низкой программисткой культуры, для рандомного одноразового скрипта пойдёт

anonymous
()
Ответ на: комментарий от evilface

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

anonymous
()

Сначала надо бы убрать дублирующийся код, а потом рассуждать о красоте.

E ★★★
()

Меня больше смущает забивание на эксепшны, но не видя всего кода трудно судить)

mersinvald ★★★★★
()

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

Ну и try внутри цикла - это что-то странное, скоее всего многое можно было по функциям растолкать

Dred ★★★★★
()
Последнее исправление: Dred (всего исправлений: 1)
Ответ на: комментарий от I-Love-Microsoft

А ты повнимательней приглядись - огромный elif (интересно, что там в if'е?), в котором - if, в котором - полный цикл, в котором - попытка присвоить новое значение переменной, ловля исключении с игнором самого исключения и, возможно, оставление старого значения переменной. Дальше - if по этой новой переменной, с пополнением какого-то списка если значение не пустое или else и выводом чего-то на экран. Дальше выходим из вложенного if'а на прежний elif, и там опять - полный цикл по тому же списку как в первый раз, та же ловля исключения с игнором результата отлова, работа с, возможно, старым значением переменной, пополнение того же списка, как и раньше, или else с print чего-то. Вот, как тебе словами такой алгоритм звучит? :)

Как минимум тут отдельную функцию на этот повторяющейся цикл и дальнейшие действия с переменной надо написать и починить логику.

anonymous
()
Ответ на: комментарий от Bahamut

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

conformist ★★★
()
Ответ на: комментарий от anonymous

звучит не очень, а кода всего не видно, и если там полагаются на участки кода, которые при экзепшене просто pass, то может это не оч надежно :) программиста на мыло :)

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от Jopich1

вот кстати сам код

Похоже, проблема в неопытности начинающего программиста. На слишком мало граблей пока наступил, по этому любит повторятся и склонен предпочитать всё решающую лепёшку вместо красивой гранулированной структуры. Со временем пройдёт. :)

anonymous
()
Ответ на: комментарий от Shadow

что плохого а except, в котором pass?

Что я делаю: 1) У меня есть список со всеми установленными программами в системе (через rpm -qa) 2) Я поэлементно просматриваю вышеупомянутый список и пробую сделать срез, тем самым убираю версию программы (было nano-2.3.1-10.el7.x86_64 — стало nano). Потом сравниваю и делаю ещё пару операций. 3) Если текущий элемент в списке слишком короткий, то я получаю exceprion IndexError, в этом случае мне надо просто продолжить перебирать элементы в списке.

На что можно заменить pass и except?

upd: код немного переделал и оптимизировал.

Всем большое спасибо за отклики.

iljuase ★★★
() автор топика

Приводит скриншот кода в редакторе

Ну ты совсем что ли, ну?

theNamelessOne ★★★★★
()

Такое вообще допустимо или стоит что-то переделать?

Это эталонный говнокод. Если хотя бы вынести for current_rpm... в отдельную функцию, количество строк уменьшится вдвое.

no-such-file ★★★★★
()
Ответ на: комментарий от iljuase

почитай про классы сначала. А потом подумай как это все можно реализовать более красиво. Не надо пихать всю логику в одну функцию. Раздели это все на более мелкие части. Что касается питона - то там есть куча функциональных операторов для работы со списками.

Jopich1
()

Использовать имгур - вот это действительно низкая культура.

ult
()
Ответ на: комментарий от iljuase

Это значит, что у тебя что-то идёт не так, и ты не знаешь, почему, вот и всё.
Так-то это удобно по началау, при реализации.

Shadow ★★★★★
()
Ответ на: комментарий от Jopich1

вот например

 if type == 'patch':
 elif type ==  'jopa':
 elif type == 'ppasd':
В случае использования класса можно заменить
getattr(self, type)
глобальные переменные вообще в self уберутся и т п ...

Jopich1
()

Конечно далеко не лучший код (над ним не думали, его сразу писали, потом, возможно, ещё условия сходу вносили), но бывает и гораздо хуже.

peregrine ★★★★★
()

оно работает

А в чём проблема?

Deleted
()

Любой код - признак плохого программиста, потому что хороших программистов не существует.

thesis ★★★★★
()
Ответ на: комментарий от Jopich1

строчек на 20 лапша - это норм, но тут уже кошмарненько

MyTrooName ★★★★★
()
Ответ на: комментарий от Jopich1

Ох жесть: нет ни одного комментария, ни пустой строчки в каждой функции

Одноразовый код

derlafff ★★★★★
()
Ответ на: комментарий от iljuase

1) У меня есть список со всеми установленными программами в системе (через rpm -qa) 2) Я поэлементно просматриваю вышеупомянутый список и пробую сделать срез, тем самым убираю версию программы (было nano-2.3.1-10.el7.x86_64 — стало nano).

а зачем, когда можно rpm -qa --queryformat=«%{NAME}\n»?

pod ★★
()

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

l0stparadise ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.