Знаете что такое рефакторинг? Вы можете посмотреть в википедии, а я опишу рефакторинг как изменение архитектуры проекта. Конечно, основной целью рефакторинга является упрощение понимания кода, но как понимание связано с тем, кто код читает, так и рефакторинг может совсем и не упрощать код, т.к. оценивается субъективно.
Я не хочу научить вас чему-то особенному, но хочу показать вам в каком направлении стоит думать, чтобы стать лучше, поэтому этот пост имеет стиль повествования.
Когда вам приходит мысль "я должен зарефакторить это *****"? Однозначно, тогда, когда ваш текущий опыт программирования выше, чем тот, который был когда вы писали то, что считаете "*****". Если у вас этого не происходит - поздравляю, вы не растёте. Абсолютно любой программист с ростом опыта хочет "переписать" весь свой старый код. Если у вас возникло такое желание, во-первых, запишите причины, по которым вы производите эти изменения. Постарайтесь их формализировать. Если вы не сможете объяснить другим программистам почему вы это сделали и не в стиле "так лучше" или "мне не нравится как это было написано", то для вас приготовлено мной особое место в аду программистов (за это можете поставить минут в мой рейтинг :) ). Абсолютно все изменения в коде, что вы делаете должны иметь обоснование в виде логичных, непротиворечивых правил. Способность формировать такие правила как раз присуща программистам с опытом, "профессионалам".
Дальше перейду к большей конкретики. Эти самые правила рефакторинга, вы можете не придумывать сами после 10 лет программирования, но взять из чужого опыта (дурак учится на своих ошибках, помните, да?). Где взять этот опыт? Книги, форумы, совместная работа. (я пишу этот текст в режиме on-line без исправлений и изменений, поэтому мне пришла в голову идея рассказать вам о совместной работе перед тем, как я напишу ссылки на книги, который передают вам этот опыт).
Итак, если вам нравится программирование - БРОСАЙТЕ ВСЁ И УСТРАИВАЙТЕСЬ РАБОТАТЬ ПРОГРАММИСТОМ! Даже если вы сейчаc полный 0 в этой профессии, то первая же ваша должность с коллегами "бустанёт" вас раз в 10 и дальше будет гораздо легче и уверенней. Для тех, кто уже прошёл этот этап - старайтесь взаимодействовать с опытными коллегами. Думаете они заносчивы и хер на вас клали? Ни хрена. Программисты по своей сути люди добрые и простые, создать свою тусу (секту программистов :) ), передать часть своих знаний коллегам они всегда рады. Камень преткновения тут как раз в том, что вы либо слишком навязчивы (не пытаетесь получить базовую информацию из открытых источников), либо слишком закрытые (не пытаетесь перенять опыт вашего коллеги в тех вещах, которые "в интернетах" не описаны). Где тут грань? Да, блин, загуглите и прочитайте всё, что вы найдёте по волнующей вас теме за 20 минут. После этого вашему коллеге будет гораздо приятнее помочь вам и получите гораздо больше, чем могли расчитывать.
Далее, если вы не будите читать книги передающие вам опыт других людей - вы будете всегда аутсайдером. Лично мне очень помогли книги:
*) Совершенный код. Мастер-класс. Стив Макконнелл
*) Защищенный код. Майкл Ховард, Дэвид Лебланк
*) Рефакторинг. Улучшение проекта существующего кода. Мартин Фаулер, Кент Бек, Джон Брант, Дон Робертс
*) Идеальный код
*) Алгоритмы и структуры данных
*) Чистый код: создание, анализ и рефакторинг. Роберт Мартин
*) Скользкие места С++
*) Приемы объектно-ориентированного проектирования. Паттерны проектирования. Эрих Гамма, Ричард Хелм, Ральф Джонсон, Джон Влиссидес
*) 24 смертных греха компьютерной безопасности. Майкл Ховард, Дэвид Лебланк, Джон Виега
*) Эффективное использование С++. 55 верных способов улучшить структуру и код ваших программ». Скотт Майерс
*) Регулярные выражения. Джеффри Фридл
Список не полный и не сортирован, но №1 и №2 - самое лучшее что со мной происходило в мире программирования. Must have, must read.
Готов прочитать любую книгу, которую вы назовёте (English, Russian, если ещё не читал) и дать вам обратную связь по ней.
P.S.: Я готов помогать начинающим программистам в режиме он-лайн, я всегда мечтал стать неким "сенсеем" в программировании. Основание условие - исполнение всех моих "приказов" по программированию. Я буду делать то же самое что и вы и потом мы будем сравнивать результаты. Участие - бесплатное, после собеседования. Пишите сюда.
P.P.S.: Вообще, я начале я хотел лишь затронуть тему вызова виртуальных функций в конструкторах (неожиданно, правда?), но текущее содержание поста не ориентировано на уровень объяснения что такое виртуальные функции и почему их нельзя вызывать в конструкторах.