Существует два основных подхода к добавлению структуры в код: сверху вниз и снизу вверх. Нисходящая структура происходит от проектных работ, которые могут включать формальный или неформальный процесс и чисто артефакты проектирования, такие как диаграммы UML или функциональные спецификации. Конечная цель в нисходящем процессе - создать классы и интерфейсы в вашем коде, которые обеспечат соответствующую структуру, чтобы сделать ваш код поддерживаемым. Это может произойти до того, как вы напишите код, или как часть итерации, но идея в том, что вы сначала создаете структуру, а затем создаете код.
Структура снизу вверх происходит из-за рефакторинга. Например, начните со всей своей логики одним нажатием кнопки. Когда вы добавляете пункт меню, который делает то же самое, что и нажатие кнопки, перемещайте код для функции нажатия кнопки в функцию закрытого члена формы. Если вам нужны одинаковые функции в другой части приложения, инкапсулируйте код и переменные состояния, используемые вашей закрытой функцией-членом, в класс.
Я бы рекомендовал использовать оба подхода. Правильное сочетание для вашей ситуации зависит от команды разработчиков (размер, местоположение, способность общаться) и размера вашего приложения. Вообще говоря, для больших приложений требуется больше сверху вниз, а для очень маленьких приложений достаточно минимального количества сверху вниз. Но всегда должно быть какое-то планирование высокого уровня, даже для небольшого приложения.