Что нужно помнить о коде GUI, так это то, что он управляется событиями, а код, управляемый событиями, всегда будет выглядеть как масса случайно организованных обработчиков событий. То, что становится действительно беспорядочным, - это когда вы пытаетесь вставить в класс код, не управляемый событиями. Конечно, похоже, что он обеспечивает поддержку для обработчиков событий, и вы можете делать ваши обработчики событий красивыми и маленькими, но весь этот дополнительный код поддержки, который плавает вокруг, делает ваш источник GUI кажущимся раздутым и грязным.
Итак, что вы можете сделать с этим, и как вы можете упростить процесс рефакторинга? Ну, я бы сначала изменил свое определение рефакторинга с того, что я делаю время от времени, на то, что я делаю постоянно, когда кодирую. Почему? Потому что вы хотите, чтобы рефакторинг позволил вам легче модифицировать ваш код, а не наоборот. Я не просто прошу вас изменить семантику здесь, но прошу вас сделать небольшую умственную гимнастику, чтобы увидеть ваш код по-другому.
Три метода рефакторинга, которые я нахожу наиболее часто используемыми, это Rename , Extract Method и Extract Class . Если бы я никогда не узнал ни одного другого рефакторинга, эти три все равно позволили бы мне сохранить мой код чистым и хорошо структурированным, и из содержания вашего вопроса мне кажется, что вы, вероятно, обнаружите, что вы почти всегда используете те же три рефакторинга в чтобы ваш код GUI был тонким и чистым.
У вас может быть наилучшее в мире разделение между GUI и бизнес-логикой, и все же код GUI может выглядеть так, будто мой код был взорван в середине. Я советую, что не помешает иметь дополнительный класс или два, чтобы помочь вам правильно управлять вашим GUI, и это не обязательно должны быть ваши классы View, если вы применяете шаблон MVC - хотя часто вы найдете промежуточные классы настолько похожи на ваш взгляд, что вы часто будете испытывать желание объединить их для удобства. Мое предположение заключается в том, что на самом деле не мешало бы добавить дополнительный специфичный для графического интерфейса слой для управления всей визуальной логикой, однако, возможно, вы захотите взвесить преимущества и затраты, связанные с этим.
Поэтому мой совет:
- Ничего не делать непосредственно за вашим GUI, кроме как вызывать и определять, как GUI будет подключаться к представлению (или промежуточному слою).
- Не пытайтесь объединить каждую вещь, связанную с представлением, в один класс - или даже один класс для каждого окна графического интерфейса - если это не имеет смысла для вас. Ваша альтернатива - создать множество маленьких и простых в управлении классов для управления логикой GUI.
- Когда ваши методы начинают выглядеть немного больше, чем 4-5 строк кода, проверьте, необходимо ли это и возможно ли извлечь один или два метода, чтобы вы могли сохранять свои методы простыми, даже если это означает класс со многими другими методами.
- Если ваши классы начинают выглядеть действительно большими, начните с удаления ВСЕХ дублированных функций, а затем посмотрите, можете ли вы логически сгруппировать свои методы так, чтобы вы могли извлечь другой класс или два.
- Подумайте о рефакторинге каждый раз, когда вы пишете строку кода. Если вы получите строку кода для работы, посмотрите, сможете ли вы ее реорганизовать, чтобы избежать дублирования функциональности или сделать ее немного более компактной без изменения поведения.
- Примите неизбежное, что вы всегда будете чувствовать, что та или иная часть в вашей системе начнет чувствовать себя немного раздутой, особенно если вы пренебрегаете рефакторингом по ходу дела. Даже с хорошо разложенной кодовой базой, вы можете чувствовать себя , как будто есть больше , что вы могли бы сделать. Это реальность написания программного обеспечения, и вы всегда будете чувствовать, что что-то большее можно было бы сделать «лучше», поэтому вам нужно найти баланс между выполнением профессиональной работы и позолотой.
- Согласитесь, что чем чище вы пытаетесь сохранить свой код, тем менее раздутым будет казаться ваш код.