Архитектура приложения с GUI?
===============================

 Доброго времени суток.   

Недавно взялся за собственный проект, работаю над интерфейсом программы с PyQt5.  

Написав окно для решения одного типа задач (А всего их 5-7) с настройками решателя и интерфейса, понял что кода вышло примерно 1,5 тыс строк, файл получился довольно нагруженным и под конец уже довольно сложно было находить конкретные методы инициализации объектов и методы которые отслеживают события.  

Предварительно итоговая программа будет иметь около 15 000 строк кода, понимаю что метрика сложности не совсем верная, но вопрос к более опытным программистам следующий:  

Какую архитектуру следует применять при построении довольно больших интерфейсов?  

Пока у меня в голове следующие варианты:  

1) Довольно сложный в редактировании файл в котором собраны все методы инициализации, настройки и управления логикой событий  

2) Создать несколько модулей: первый с классом для инициализации объектов и настроек, второй с классом для описания логики событий и методов, третий будет собственно главным модулем, с описанным классом инициализации окна, который унаследует 2 предыдущих и будет выполнять эти методы  

3) Разделить на множество модулей, которые будут полностью описывать отдельные группы виджетов( Например: Button, Label, LineEdit, BrowserText, CommandBox и т.п.), отдельно модуль с логикой интерфейса и потом также унаследовать все классы и описывать основные методы в главном файле.  

  

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

Какую вы используете архитектуру при решении подобных вопросов? 

 Вообще для таких случаев уже есть стандартизированные архитектуры, такие как например [MVC](https://ru.wikipedia.org/wiki/Model-View-Controller).  

  

Кроме того следует помнить что композиция часто лучще наследования.  

Ну и конечно не надо городить монофайл или god objects.