Как правильно распределить методы класса в модули?
И так, есть проект. Грубо говоря, 4 py-файла. 2 файла статичных настроек, и 2 файла с классами внутри. Запускается один файл, в котором создаётся несколько экземпляров класса из второго файла, и первый далее с ними многопроцессорно работает: На основе каких-то присланных данных берёт какую-то функцию из второго класса и выполняет её с нужными аргументами.
Есть идея разделить второй класс (~220 кб) на модули из-за избыточности методов в нём и отсутствии логики внутри класса как таковой.
В классе содержатся методы, которые можно разделить на несколько типов
1.1 Методы класса, которые можно сделать статичными и вынести из класса без проблем.
1.2 Методы класса, использующие методы из пункта 1.1
1.3 Методы класса, использующие методы из пункта 1.1 или 1.2 + использующие аргументы класса.
Как я вижу решение:
Разделить класс на два модуля, commands и tools. В tools пойдут все методы из пункта 1.1 и другие побочные методы, а в commands именно функции, которые выполняет программа.
НО!
Что, в таком случае, делать с функциями использующими аргументы класса?
Как, кроме sys.path, можно связать каталоги commands и tools, ведь модули в tools не видны из commands?(решается помещением tools внутрь commands, либо созданием tools.py с набором функций, но оба варианта кажутся неверными - вдруг понадобится из первого класса вызывать, прописывать from commands.tools.db import db выглядит как-то стрёмно, как и from commands.tools import db)
если ты разбил на три части функции, то почему делаешь два модуля? По логике нужно три модуля статик функции , класс 1.2 и класс 1.3.
Но не зная, что там происходит в классах, трудно разбить нормально на модули. Скорее нужно действовать так:
1. Представить какой интерфейс должен иметь изначальный 2 класс. Т.е. какие действия он должен выполнять во внешнем миру. Это будут так сказать паблик методы. остальные приват.
2. Представить структуру 2 класса на уровень меньше. Т.е. все методы разбиваются по темам (более менее независимые). Это будут классы следующего уровня абстракции. Класс 2 будет ответственен за создание этих классов и установки зависимостей между ними.
3. Далее повторяем пункты 1 и 2 для каждого подкласса. и т.д.
Но повторяю трудно говорить вообщем, не зная что там в изначальном классе.
Почему разбиваю на два модуля -- все методы из класса можно разделить на функции, которые вызываются по имени и, грубо говоря, вспомогательные методы. Например, метод расставляющий пробелы между каждыми тремя цифрами в строке -- вспомогательный, его я хочу определить в tools, а метод, который возвращает погоду -- к функциям, командам.
Max Payne, т.е. два модуля tools.py и commands.py
и команды используют тулзы?
import tools
правильно понимаю?
(но если хочешь использовать дополнительно из tools команды, то это очень неправильно)
Сергей, Я собирался сделать один каталог tools и один commands, в каждом файлы с названиями, собственно, тулз и команд, а внутри - функция. Но один нюанс, с одной стороны это удобнее, чем в одном файле на 220 кб выискивать функцию, а с другой - рационально ли?
Max Payne, модули это файлы. Каталоги могут быть пакетами. Т. Е. Задача разбить на пакеты?
Возможно, лучше начать с разбиения на модули?
Касаемо, рационально ли? Конечно. Все должно быть максимально упорядочено. И легко находиться. В большом файле трудно находить что-то. Это даст большую экономию время.
Сергей, Похоже, так не получится вынести. Часть команд использует аргументы класса, то есть, наверное, придётся оставить все команды внутри класса. Либо их как-то можно вынести?
Например, у меня есть класс Бот, в нём есть методы, которые можно отнести к Кланам. Все из них используют аргументы и другие методы класса. Значит я их никак не могу вынести из класса?
Я вижу одно решение: делать класс Бот и класс с Кланами, но тогда придётся вызывать класс с Кланами, который будет наследовать класс Бот, но это бред, это бессмысленно, а другого решения я не вижу.
200кб+ файл с одним классом -- считаю слишком жирно, поэтому хоть какие-то идеи нужны.
Все вспомогательные тулзы я вынес и более-менее оптимизировал, с ними всё круто, но осталось очень много.