C refactorings and code smells catalog - minsuk-jang/teamproject GitHub Wiki
Neovimμ ν° refactoring λ Έλ ₯μ λλ€. μ΄ μ£Όμ μ κ΄ν λ¬Ένμμ μμ΄λμ΄λ₯Ό μ»λ κ²μ΄ λμμ΄ λ κ²μ λλ€. κΈ°μ¬μλ μ μμ μΈ μ½λ λμλ₯Ό κ°μ§νκ³ μ€λλ / λ¬Έμνλμ§ μμ / ν μ€νΈλμ§ μμ μ½λλ₯Ό λ€λ£° λ νμν μ£Όμμ¬νμ μ μ©νμ¬ νμν refactoringμ μ μ©νλ κ²μ΄ μ’μ΅λλ€.
μ¬κΈ°μ μλ λͺ©λ‘μ μμ ν κ²μ΄ μλλ―λ‘ μ½λμμ λ°κ²¬ λ μμλ λ¬Έμ μ λν μλ²½ν μ²λ°©μΌλ‘ κ°μ£Ό λμ΄μλ μλ©λλ€. μ΅ν΅μ±μκ² νμμμ€.
C Refactorings λͺ©λ‘
neovimμ μ½λλ² μ΄μ€λ₯Ό ν₯μμν€λ λμ μ°λ¦¬λ₯Ό μλ΄ ν μ μλ C Refactorings λͺ©λ‘.
Garrido 2000 [** ** 2.1 C refactorings λͺ©λ‘ μ μ ** ** (page 17)
νλ‘κ·Έλ¨ entity μΆκ°νκΈ°
- λ³μ μΆκ°
- ν¨μμ λ§€κ° λ³μ μΆκ°
- κΈ°μ‘΄ μ νμ μΊ‘μννλ typedef μ μ μΆκ°
- ꡬ쑰체μ νλ μΆκ°
- **λ³μμ ν¬μΈν°λ₯Ό μΆκ°νμμμ€ : **μ νλ λ³μμ μ νκ³Ό λμΌν μ νμ ν¬μΈν° λ³μμ μ μΈμ μΆκ°νκ³ ν¬μΈν°μ μ νν λ³μμ μ£Όμλ₯Ό ν λΉνμμμ€.
νλ‘κ·Έλ¨ entity μμ
- μ¬μ©νμ§ μλ λ³μ μμ
- μ¬μ©νμ§ μμ λ§€κ° λ³μ μμ
- ν¨μ μμ
νλ‘κ·Έλ¨ entity λ³κ²½
- λ³μ μ΄λ¦ λ³κ²½
- μμ μ΄λ¦ λ³κ²½
- μ¬μ©μ μ μ μ ν μ΄λ¦ λ³κ²½
- ꡬ쑰 νλ μ΄λ¦ λ³κ²½
- ν¨μ λ³κ²½
- νλ‘κ·Έλ¨ entityμ μ ν λ³κ²½
- κ³μ½ λ³μ λ²μ
- κ°λ³ λ²μ νμ₯
- κ°μ μμλ‘ λ³κ²½
- ννμμ λ³μλ‘ λ³κ²½
- λ³μλ₯Ό ν¬μΈν°λ‘ λ³ν
- ν¬μΈν°λ₯Ό μ§μ λ³μ μ κ·ΌμΌλ‘ λ³ν
- μ μ λ³μλ₯Ό λ§€κ° λ³μλ‘ λ³ν : μ§μ λ μ μ λ³μμ μ κ·Όνλ λͺ¨λ ν¨μλ₯Ό μ°Ύμ΅λλ€. κ° ν¨μμ λν΄ νμ μ μ λ§€κ° λ³μλ₯Ό ν¨μ μ μμ μΆκ°νκ³ , μ μ λ³μλ₯Ό ν¨μ νΈμΆμμ μ€μ λ§€κ° λ³μλ‘ μΆκ° ν λ€μ λ§€κ° λ³μμ λν ν¨μ λ΄μ μ μ λ³μμ λν μ κ·Όμ λ°κΎΈμμμ€. μ¬μ©μλ λ§€κ° λ³μκ° ν¬μΈν° μ νμΈμ§ μ νν μ μμ΅λλ€.
- **ν¨μ μΈμ μ¬μ λ ¬ : ** ν¨μ μ μ λ° ν΄λΉ ν¨μμ λν λͺ¨λ νΈμΆμμ μΈμμ μμλ₯Ό λ³κ²½ν©λλ€.
볡μ‘ν refactorings
-
μλ‘μ΄ κ΅¬μ‘°μμ μΌλ ¨μ λ³μ κ·Έλ£Ήν : (e.g., #775) legacy μμ€ν μ μ’ μ’ νλ‘κ·Έλ¨μ μ¬μ¬μ© ν μ μκ² λ§λλ μ μ λ³μλ₯Ό κ³Όλνκ² μ¬μ©ν©λλ€. μ¬μν κ²½μ°μ κ°μ λλΆλΆμ λ³κ²½ μ¬ν κ°λ₯ν κ²½μ° κΈλ‘λ² μ λ°μ΄νΈκ° νμν©λλ€. κ·Έλ¬λ νλ‘κ·Έλλ¨Έλ μ μ λ³μλ₯Ό λ§€κ° λ³μλ‘ μ λ¬ν΄μΌ ν λ μ μ λ³μλ₯Ό μ¬μ©ν©λλ€. λ무 λ§μ λ§€κ° λ³μλ₯Ό ν¨μμ μ λ¬νλ©΄ νΈμΆ μκ°μ΄ κΈΈμ΄μ§ μ μμ΅λλ€.
μ΄ λ¬Έμ μ λν ν΄κ²°μ± μ 격리 λ λ³μλ₯Ό κ·Έλ£Ήννλ λ°μ΄ν° ꡬ쑰λ₯Ό μ μνκ³ κ΅¬μ‘°μ λν λ¨μΌ μ°Έμ‘°λ₯Ό λ§€κ° λ³μλ‘ μ λ¬νλ κ²μ λλ€. μ΄ refactoringμ κΈ°μ‘΄ λ³μλ₯Ό κ·Έλ£Ήννμ¬ κ΅¬μ‘°λ₯Ό μ μν©λλ€. μ°Έμ‘°μ μν λ§€κ° λ³μμ λν μ μ μ κ·Ό λ³νμ λ λ²μ§Έ λΆλΆμ 리ν©ν λ§ "μ μ λ³μλ₯Ό λ§€κ° λ³μλ‘ λ³ν"μμ μ²λ¦¬λ©λλ€.
-
μΆμΆ κΈ°λ₯:
볡μ‘ν ννμ΄λ λ¬Έμ₯ λͺ©λ‘μ ν¨μ νΈμΆλ‘ λ°κΏλλ€. [Fowler 99]μμ μ§μ νλ―μ΄ μ΄κ²μ λ§€μ° μΌλ°μ μΈ λ³νμ λλ€. ν¨μκ° λ무 κΈΈκ±°λ 볡μ‘ν΄μ§λ©΄ μμ μ‘°κ°μΌλ‘ λλκ³ κ° μ‘°κ°μ ν¨μλ‘ λ°κΎΈκ³ λ μ§§μ ν¨μλ₯Ό ν¨μ νΈμΆλ‘ λ체νλ κ²μ΄ μ’μ΅λλ€. μΆμΆ λ μ½λκ° μ€μΊλκ³ μλ³Έ ν¨μμ μ§μ λ³μμ λν κ° μ°Έμ‘°μ λν΄ λ§€κ° λ³μκ° μΆμΆ λ ν¨μμ μΆκ°λ©λλ€.I (@philix)λ λ μ΄μ μ’μ refactoring ν¨ν΄μΌλ‘ ν¨μ μΆμΆμ κΆμ₯νμ§ μμ΅λλ€. λλ (1) μλ‘μ΄ ν¨μκ° μμ(https://en.wikipedia.org/wiki/Pure_function) μ΄κ±°λ (2) μ΄λ―Έ μ¬μ¬μ©μ ꡬ체μ μΈ κ²½μ°κ°μμ λλ§ ν¨μλ₯Ό μΆμΆν΄μΌνλ€κ³ μκ°ν©λλ€. John Carmackμ΄ John Carmack in Inlined Codeμμ μ΄ μ£Όμ μ λν΄ μ€λͺ ν©λλ€. -
μΈλΌμΈ ν¨μ
-
쑰건μ ν΅ν©: μ€μμΉμμ μΈμ μ¬λ‘λ₯Ό κ²°ν©νμμμ€.
-
For into while
-
While into for
-
While into do while: while λ¬Έμ λν 쑰건μ μμ μν€λ λ¬Έμ₯μ λ³νν©λλ€.
Code Smells
μ½λ λͺ©λ‘μλ ν΄κ²°ν μ μλ λ¬Έμ λ₯Ό λνλ΄κ³ λ€λΉ νλ©μμ λ§μμ μ¬λ‘ μ‘μ μ μλ Jeff Atwoodμ λμκ° λ©λλ€. μ΄ λͺ©λ‘μ κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μ μν΄ λ§λ€μ΄μ‘μ§λ§ λλΆλΆ Cμμ μ΄λ»κ² μ μ©λλμ§λ₯Ό λ³΄κΈ°κ° μ΄λ ΅μ§ μμ΅λλ€.
Within Classes Code Smells (.c files)
- Comments
- Long Method (long functions)
- Long Parameter List
- Duplicated Code
- Conditional Complexity
- Combinatorial Explosion
- Large Class (large .c files)
- Type Embedded in Name
- Uncommunicative Name
- Inconsistent Names
- Dead Code
- Speculative Generality
- Oddball Solution
- Temporary Field (temporary global variable)
Code Smells Between Classes (between .c files)
Alternative Classes with Different Interfaces- Primitive Obsession #775
Data Class- Data Clumps
Refused Bequest- Inappropriate Intimacy
Indecent Exposure- Feature Envy
- Lazy Class
- Message Chains
Middle Man- Divergent Change
- Shotgun Surgery
Parallel Inheritance Hierarchies- Incomplete Library Class
- Solution Sprawl
C Refactoring λꡬ
Coccinelle
ν μ μλ μΌμ λν μλ # 690μ μ°Έμ‘°νμμμ€.