Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 8, 2016 12:07:35

MaratD
Зарегистрирован: 2016-01-25
Сообщения: 138
Репутация: +  0  -
Профиль   Отправить e-mail  

вся программа в одном модуле

Здравствуйте.
Заранее извиняюсь (может глупый вопрос). Пишу программу. Все в одном модуле. Создал 25 классов. Судя по среде в которой пишу, написал около 4000 строк. В питоне нет по этому поводу никаких ограничений или рекомендаций? Или желательно разбить на несколько компактных модулей? Поделитесь опытом пожалуйста.
Спасибо.

Офлайн

#2 Дек. 8, 2016 12:29:48

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2627
Репутация: +  61  -
Профиль   Отправить e-mail  

вся программа в одном модуле

Питон как таковой в данном вопросе роли не играет!
Модульность это всегда хорошо! Потому что много проще потом вносить правки или дополнять приожение нежели каждый раз парсить все его тело в одном файле.
Тут двух мнений быть не может!
Зачастую по модулям разносят логические блоки. Например логика работы с вебом в одном с базой в другом - связка в третьем… и тд



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Офлайн

#3 Дек. 9, 2016 02:38:05

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9993
Репутация: +  857  -
Профиль   Отправить e-mail  

вся программа в одном модуле

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” в конвейере происходит очень легко как раз из-за того, что программы между собой общаются очень просто - простым потоком строк простого текста. И одна программа про другую не знает, она просто передаёт простой текст на выход, а другая программа просто принимает простой текст на вход. Вот это и есть минимальное сцепление.



Отредактировано py.user.next (Дек. 9, 2016 02:57:46)

Офлайн

#4 Дек. 9, 2016 09:14:28

MaratD
Зарегистрирован: 2016-01-25
Сообщения: 138
Репутация: +  0  -
Профиль   Отправить e-mail  

вся программа в одном модуле

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

Офлайн

#5 Дек. 9, 2016 09:25:05

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

вся программа в одном модуле

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

Поверьте, вам не стоит об этом печалиться, если вы не получаете куски кода по сети, как это происходит в случае с JavaScript. Вы получите исчезающе маленький оверхед, просто ничтожный.



Офлайн

#6 Дек. 9, 2016 10:40:28

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9993
Репутация: +  857  -
Профиль   Отправить e-mail  

вся программа в одном модуле

MaratD
На скорость работы программы разбиение на модули влияет?
Нет, там так всё устроено, что загружаются они один раз при первом использовании, а потом кешируются и используются уже из кеша.

В sys.modules находятся модули, которые уже импортировались. Поэтому если ты сделаешь свой файл .py, он станет модулем, но при импортировании в первый раз он закешируется, и если ты его изменишь и симпортируешь снова, изменений в нём не будет, потому что будет использоваться закешированная версия. А чтобы перезагрузить модуль, надо его удалить из кеша (напрямую или функцией) и только потом импортировать. А кеш работает быстро, потому что файловую систему читать не надо.



Отредактировано py.user.next (Дек. 9, 2016 10:41:29)

Офлайн

#7 Дек. 10, 2016 16:36:11

MaratD
Зарегистрирован: 2016-01-25
Сообщения: 138
Репутация: +  0  -
Профиль   Отправить e-mail  

вся программа в одном модуле

Всем спасибо еще раз. Хорошо, что есть такие форумы и знающие специалисты. Сегодня глянул модуль одной из библиотек, которую использую (для работы с DBF). Насчитал там около 40 классов и около 8000 строк кода. Напрашивается вопрос. Как так пишут? Или в этом случае по другому не получится?
И еще.
py.user.next написал:
Функции не должны знать друг о друге.
Классы не должны знать друг о друге.
Модули не должны знать друг о друге.

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

Офлайн

#8 Дек. 10, 2016 17:29:17

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

вся программа в одном модуле

MaratD
Как в этом случае классы могут не знать друг о друге?
Слово “знать” здесь, конечно, условное. Имеется в виду, что одна сущность инкапсулирует данные и логику, в которые другая сущность не должна вмешиваться, а еще лучше не иметь доступа вообще. Если у нас есть класс Something, то он для всего окружающего мира он - черный ящик, есть его внешний интерфейс (API) и только через него другие классы/функции с ним общаются. Никаких общих глобальных переменных, никаких глобальных побочных эффектов при вызове методов, никакого изменения состояния объекта А изнутри объекта Б напрямую, только через API. Кроме того, программа хорошо написана, когда различные компоненты между собой слабо связаны. То есть мы можем взять из модуля А класс Б и использовать его независимо от всего остального содержимого модуля, класс (и функция) - самостоятельная независимая единица кода, которая не должна быть прибита гвоздями к другому коду. А если все-таки класс А имеет в зависимостях объект класса Б, то мы должны иметь возможность вносить изменения в реализацию класса Б не меняя ничего в классе А, и наоборот.



Офлайн

#9 Дек. 10, 2016 18:53:35

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

вся программа в одном модуле

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



Офлайн

#10 Дек. 11, 2016 04:18:30

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9993
Репутация: +  857  -
Профиль   Отправить e-mail  

вся программа в одном модуле

MaratD
У меня с одного класса вызывается другой. Как в этом случае классы могут не знать друг о друге?
В таких случаях делаются интерфейсы и классы общаются через эти интерфейсы. А интерфейс - это как отдельный класс, но только для общения. То есть ты делаешь класс и делаешь интерфейс и из класса обращаешься к этому интерфейсу (посылаешь ему что-нибудь или принимаешь от него). А потом другой класс должен реализовать этот интерфейс.

Общая инфа об интерфейсе
wiki. интерфейс

Пример адаптера на питоне
wiki. адаптер

В Go интерфейсы встроены, там можно потренироваться их делать
golang.org. interfaces



Отредактировано py.user.next (Дек. 11, 2016 04:20:40)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version