Форум сайта python.su
0
Eclipse IDE Version: 2018-09 (4.9.0)
Python 3.7.1
Большинство моего кода расположено в классах (поскольку это позволяет писать код “на языке” прикладной области). Но, к сожалению, удобочитаемость этого кода очень низкая из-за необходимости писать self при обращении к членам / методам класса. В прикрепленном файле образец реального кода, который весь пестрит self-ами (читаемость этого кода очень низкая).
Может есть какие- то IDE, позволяющие делать препроцессинг и как следствие использовать более удобные символы в коде для обращения к членам / методам класса? Или может быть есть какие- то другие пути избавления от self- ада?
Прикреплённый файлы:
Screenshot_20181201_084523.png (105,7 KБ)
Офлайн
294
AlekseyPythonИМХО, наоборот, сразу видно что являеться атрибуто класса, а что нет. а код ваш неудобочитаем потому что там много копипасты.
Но, к сожалению, удобочитаемость этого кода очень низкая из-за необходимости писать self при обращении к членам / методам класса.
AlekseyPythonиспользование self носит декларативеный характер, никто не мешает вам вместо self использовать “ более удобные символы ”. Только потом не жалуйтесь когда вас начнут бить ногами.
использовать более удобные символы в коде для обращения к членам / методам класса?
AlekseyPythonне используйте классы, не будет self. в чем проблема?
Или может быть есть какие- то другие пути избавления от self- ада?
[code python][/code]
Офлайн
0
а код ваш неудобочитаем потому что там много копипасты.В коде СОВЕРШЕННО нет копипасты. Попробуйте найти хоть одну повторяющуюся строку.
никто не мешает вам вместо self использовать “ более удобные символы ”.Нет, имена переменных могут состоять только из латинских букв, цифр и знаков подчеркивания. Я не могу например так обращаться к членам:
@my_variable
не используйте классы, не будет self. в чем проблема?Тогда Python скатится до языка С, разработанного при динозаврах. Вы же отлично понимаете, что это не решение, зачем тогда делать вид, что решение найдено?
Офлайн
294
AlekseyPythonиз вашего скриншота просто бросаеться в глаза повторяющиеся:
коде СОВЕРШЕННО нет копипасты. Попробуйте найти хоть одну повторяющуюся строку.
.... if success: if self.quantity_success >= self.quantity_success_down: self.quantity_success = 0 ....
AlekseyPythonЭто неверно:
Нет, имена переменных могут состоять только из латинских букв, цифр и знаков подчеркивания.
class Foo: def __init__(Ψ, value): Ψ.value = value def test(Ψ): print(Ψ.value) foo = Foo('The Ψ example') foo.test() >>> The Ψ example >>>
AlekseyPythonЕстественно, собачка это для декораторов, иначе как интерпретатор сможет понять где обьявляется декорированя функция , а где ваша программа.
Я не могу например так обращаться к членам:
@my_variable
AlekseyPythonВы удивитесь, но пайтон который все скачивают с https://www.python.org/ написан на чистом Си. Не С++, не С#, а именно С. В этом легко убедиться посмотрев исходники: https://github.com/python/cpython
Тогда Python скатится до языка С, разработанного при динозаврах. Вы же отлично понимаете, что это не решение, зачем тогда делать вид, что решение найдено?
[code python][/code]
Отредактировано PEHDOM (Дек. 1, 2018 20:14:04)
Офлайн
0
из вашего скриншота просто бросаеться в глаза повторяющиеся:В каждой ветке дальше идут РАЗНЫЕ выражения. И это упрощает код, потому что каждое состояние можно читать отдельно (изначально это было несколько функций, но я их объединил в одну, чтобы видеть общую картину в последовательности изменений состояний).
Вы удивитесь, но пайтон который все скачивают с https://www.python.org/ написан на чистом Си.Тогда зачем было мучатся и писать Python, если в итоге пришли к тому же Си?
Вот кстати интересная публикация про пайтон и классы, весьма поучительно, как по мне. https://habr.com/post/140581/Основной смысл публикации: пишите максимально ПРОСТОЙ КОД. Чего я тут и пытаюсь добиться: сейчас код на треть засорен отвлекающим от сути мелким мусором.
Офлайн
857
state, a, b, c = self.state, self.a, self.b, self.c if state == States.RETURNED_BIG: if a: ...
Офлайн
0
py.user.nextСпасибо, я уже думал об этом, но посчитал, что упадет производительность. Сейчас пришел к такому решению (чтобы меньше было дребезжащего self.):
Офлайн
857
AlekseyPythonКонстанты класса должны быть в классе. Доступ к ним через имя класса может быть получен как изнутри экземпляра этого класса, так и снаружи класса, даже когда нет ни одного экземпляра у него.
Константные члены делать глобальными переменными модуля
AlekseyPythonЕсли бы ты привёл класс свой полностью, тебе бы сказали, нормально ли он сделан. Возможно, он у тебя неправильно спроектирован и из-за этого и нарушилась читаемость.
Переменные нужные только в одном методе не делать членами объекта
AlekseyPythonТы не понимаешь, что модуль питона тоже нужен, поэтому он должен быть построен классически. То есть модуль должен конкретно отвечать на вопрос “что делает этот модуль?”. Естественно, пространство имён модуля не должно быть замусорено, а все функции у него должны относиться к работе этого модуля, когда его используют снаружи как инструмент.
Приватные методы объекта делать глобальными процедурами модуля.
Отредактировано py.user.next (Дек. 2, 2018 15:08:32)
Офлайн
0
py.user.next, все это красивая теория. На практике вся эта “красота” оборачивается self- замусоренностью кода (или если затолкать что- либо в класс, то везде начинает маячить имя класса). Код не удается просто просматривать, как газетную статью, а приходится весь постоянно перечитывать (от чего сильно устаешь к концу рабочего дня).
Если правильно импортировать модули, а в модуле размещать по одному классу и при чтении исходников рассматривать весь модуль, как реализацию этого класса, то не вижу ничего плохого в предложенном решении.
Отредактировано AlekseyPython (Дек. 2, 2018 16:33:57)
Офлайн
857
AlekseyPythonКласс является пространством имён для своих констант. Ты вообще понимаешь, что в разных классах могут быть константы с одинаковыми именами, но с разными значениями?
если затолкать что- либо в класс, то везде начинает маячить имя класса
AlekseyPythonТо ты теряешь модульный функционал. Сколько у тебя классов в программе? Десятки классов - обычное дело, это даже не очень много. Классы объединяют в модули, модули объединяют в пакеты. Так получаются компоненты, которые можно переносить из одной программы в другую.
Если правильно импортировать модули, а в модуле размещать по одному классу
Отредактировано py.user.next (Дек. 2, 2018 17:27:11)
Офлайн