=========================== Refactoring in C++ =========================== Definition ========== Refactoring is the process of improving the internal structure of existing code **without changing its external behavior**. The goal is to make C++ programs easier to read, maintain, and extend over time. Why Refactor? ============= - Improve code readability - Reduce technical debt - Make future changes easier - Eliminate duplicated logic - Simplify complex functions or classes - Improve testability - Increase overall maintainability Key Principles ============== - **Behavior must not change.** - Small, incremental steps - Continuous testing - Understand *why* a refactor is needed before doing it - Prefer clarity over cleverness Common C++ Refactoring Techniques ================================= Rename Variables and Functions ------------------------------ Use clear, descriptive names: .. code-block:: cpp // Before int x; // After int maxConnectionCount; Extract Functions ----------------- Break large functions into smaller, reusable ones: .. code-block:: cpp void processUser() { validateUser(); saveUser(); sendNotification(); } Eliminate Duplicate Code ------------------------ Move repeated logic into shared functions or utility classes. Replace Magic Numbers with Constants ------------------------------------ .. code-block:: cpp const int MAX_RETRIES = 3; Prefer RAII and Smart Pointers ------------------------------ Use ``std::unique_ptr`` and ``std::shared_ptr`` instead of manual ``new``/``delete``. Simplify Conditionals --------------------- .. code-block:: cpp // Before if (status == 1 || status == 2 || status == 3) // After bool isActive = (status >= 1 && status <= 3); Encapsulate Data ---------------- Replace raw public fields with getters/setters or class methods to enforce invariants. Break Up Large Classes (Class Decomposition) -------------------------------------------- Split classes that have too many responsibilities (related to the Single Responsibility Principle). Use Standard Library Algorithms ------------------------------- Replace manual loops with STL algorithms: .. code-block:: cpp std::sort(vec.begin(), vec.end()); When to Refactor? ================= - Before adding new features - When fixing bugs - When code becomes hard to understand - During regular cleanup cycles - When reviewing code (PR feedback) When *Not* to Refactor ======================= - When you do not understand the existing code behavior - When tests are missing (add tests first) - When deadlines require new features immediately - When refactoring would introduce unnecessary churn Refactoring Tools for C++ ========================== - `clang-tidy `_ - `cppcheck `_ - IDE support: CLion, Visual Studio, VSCode extensions - Automatic formatting: ``clang-format`` Refactoring Checklist ===================== - [ ] Code still compiles - [ ] All tests pass - [ ] Behavior unchanged - [ ] Names are clear and expressive - [ ] No duplicate logic - [ ] Functions/classes have a single responsibility - [ ] Code is easier to read than before - [ ] Document any structural changes