MaratD
Создал 25 классов. Судя по среде в которой пишу, написал около 4000 строк.
Это слишком много, нужно учиться разбивать.
Правило создания класса: класс должен состоять из данных и однородных методов для работы с этими данными.
Правило создания модуля: модуль должен состоять из данных и однородных классов и функций для работы с этими данными.
При всём при этом данные могут быть пустыми, то есть их может не быть вообще.
И ещё:
Функции не должны знать друг о друге.
Классы не должны знать друг о друге.
Модули не должны знать друг о друге.
Например, ты хочешь скачать несколько страниц из Интернета и положить их в дек.
Ты импортируешь модуль urllib.request, который содержит классы для работы с запросами и функцию urlopen() для скачивания страницы.
Ты импортируешь collections, который содержит классы для работы со структурами данных и класс deque(), реализующий дек.
Вот эти модули друг о друге не знают. То, что они будут как-то взаимодействовать, зависит только о тебя.
В общем, что функция, что класс, что модуль питона являются модулями по теории программирования. А модуль по теории программирования должен быть функционально-прочным и информационно-прочным и иметь минимальное сцепление. Прочность относится к внутреннему устройству модуля, а сцепление относится к взаимодействию модуля с его окружением (другими модулями).
Функциональная прочность - это значит, что он должен делать только одно дело (иметь одно предназначение), а не несколько.
Информационная прочность - данные модуля должны быть доступны только ему и внешнее влияние на них должно быть запрещено.
Минимальное сцепление - общение модуля с другими модулями должно происходить через максимально простые конструкции.
Например, в лине все программы являются такими модулями. Каждая программа предназначена для решения только одной задачи. Настройки программы (если есть) относятся только к ней и работает она только со своими данными. Каждая программа общается (принимает на вход и выдаёт на выход) очень простые данные - обычные строки текста.
Вот пример
[guest@localhost ~]$ echo -e "abc\nabcdef\nghi" | cat -n
1 abc
2 abcdef
3 ghi
[guest@localhost ~]$ echo -e "abc\nabcdef\nghi" | cat -n | grep a
1 abc
2 abcdef
[guest@localhost ~]$ echo -e "abc\nabcdef\nghi" | grep e | cat -n | grep a
1 abcdef
[guest@localhost ~]$ echo -e "abc\nabcdef\nghi" | cat -n | grep a | grep e
2 abcdef
[guest@localhost ~]$
Перестановка программы grep с параметром “e” в конвейере происходит очень легко как раз из-за того, что программы между собой общаются очень просто - простым потоком строк простого текста. И одна программа про другую не знает, она просто передаёт простой текст на выход, а другая программа просто принимает простой текст на вход. Вот это и есть минимальное сцепление.