Clean code
μ’μ κ°λ°μκ° μμ£Ό μ°λ μ½λ ꡬ문 8κ°μ§
νλ‘κ·Έλλ°μμ βμ’μ μ½λβλ λ¨μν λμνλ κ²λ§μ μλ―Ένμ§ μμ΅λλ€. μ½κΈ° μ½κ³ , μ μ§λ³΄μνκΈ° μ¬μ°λ©°, λ€λ₯Έ μ¬λκ³Ό νμ ν λλ νΌλμ΄ μλ μ½λκ° λ°λ‘ μ’μ μ½λμ£ .
κ·Έλ λ€λ©΄ μ’μ κ°λ°μλ μ€μ λ‘ μ½λ μμμ μ΄λ€ λ¬Έμ₯λ€μ μμ£Ό μΈκΉμ? λ¨μν λ¬Έλ²μ΄μ§λ§, κ·Έ μ°μμμ λ§₯λ½μλ λ§μ κ³ λ―Όκ³Ό λ Ένμ°κ° λ΄κ²¨ μμ΅λλ€.
μ€λμ μ’μ κ°λ°μκ° μμ£Ό μ°λ 8κ°μ§ μ½λ ꡬ문μ μκ°ν΄ λ릴κ²μ.
1. if 쑰건문 β λΆκΈ° μ²λ¦¬μ κΈ°λ³Έ
if (isValid)
{
SaveData();
}
쑰건문μ μ½λμ νλ¦μ λΆκΈ°ν λ κ°μ₯ μμ£Ό μ°μ λλ€. μ’μ κ°λ°μλ 볡μ‘ν 쑰건μ λ¨μνκ² μ 리νκ³ , κ°λ μ±μ΄ λμ λ°©μμΌλ‘ 쑰건문μ ꡬμ±ν©λλ€.
π‘ βμ‘°κ±΄λ¬Έμ΄ λ§μμλ‘ λ‘μ§μ΄ 볡μ‘ν΄μ§λ, μ΅λν λͺ ννκ²!β
2. foreach λ°λ³΅λ¬Έ β 컬λ μ μ²λ¦¬μ κ°λ ₯ν λꡬ
foreach (var item in items)
{
Process(item);
}
λ°λ³΅λ¬Έ μ€μμλ foreachλ κ°λ μ±κ³Ό μμ μ±μ΄ λμ μμ£Ό μ¬μ©λ©λλ€. κ°λ°μλ 리μ€νΈλ λ°°μ΄μ μννλ©΄μ λ°μ΄ν° μ²λ¦¬, λ λλ§, κ²μ¦ λ±μ μμ μ μννμ£ .
π‘ βμΈλ±μ€λ₯Ό κ΅³μ΄ μΈ νμκ° μλ€λ©΄, foreach!β
3. ν¨μ νΈμΆ β μ± μμ λΆλ¦¬νκ³ μ¬μ¬μ©νκΈ°
ValidateInput(userInput);
ν¨μλ μ’μ κ°λ°μμ λνμ μΈ λꡬμ λλ€. μν λ³λ‘ μ½λλ₯Ό λΆλ¦¬νλ©΄, μ½λλ μ§§μμ§κ³ ν μ€νΈλ μ¬μμ§λ©° λ²κ·Έλ μ€μ΄λλλ€.
π‘ βνλμ ν¨μλ νλμ μΌλ§ νκ²!β (SRP)
4. μΈν°νμ΄μ€ (interface) β μ μ°ν μ€κ³μ ν΅μ¬
public interface ILogger
{
void Log(string message);
}
μ’μ κ°λ°μλ ꡬνλ³΄λ€ μν μ μμ‘΄νλ μ½λλ₯Ό μ νΈν©λλ€. interfaceλ μμ‘΄μ± μ£Όμ , ν μ€νΈ, μ μ§λ³΄μμ κ°λ ₯ν μ μ°μ±μ μ€λλ€.
π‘ βꡬ체μ μΈ ν΄λμ€λ³΄λ€ μΆμνμ μμ‘΄νλΌ (DIP μμΉ)β
5. return, continue, break β νλ¦μ λ¨μνκ²
if (!isReady) return;
μ‘°κΈ° λ°ν(early return)μ μ€μ²©μ μ€μ΄κ³ , μ½λλ₯Ό κ°κ²°νκ² μ μ§ν©λλ€. 루ν μμμλ μ‘°κ±΄μ΄ λ§μ§ μμΌλ©΄ λ°λ‘ continueλ breakλ₯Ό μ¬μ©νλ μ΅κ΄μ΄ μ€μν©λλ€.
π‘ β볡μ‘ν if문보λ€λ λΉ λ₯Έ νμΆλ‘ κΉλνκ²!β
6. null 체ν¬μ μ΅μ λ μ²λ¦¬
if (user != null)
{
user.DoSomething();
}
νΉμ C#μ²λΌ μ§μνλ€λ©΄:
user?.DoSomething();
nullλ‘ μΈν μμΈλ μ€λ¬΄μμ λ§€μ° νν μ€λ₯μ λλ€. μ’μ κ°λ°μλ νμ null κ°λ₯μ±μ μΌλμ λκ³ μμ μ μΈ μ½λλ₯Ό μμ±ν©λλ€.
π‘ βnull-safeλ κΈ°λ³Έ μ€μ κΈ°λ³Έ!β
7. μ μΈν νλ‘κ·Έλλ° (LINQ / stream)
var names = users.Where(u => u.IsActive).Select(u => u.Name);
루νλ³΄λ€ λ μ½κΈ° μ¬μ΄ μ μΈμ μ½λλ μ€λ ₯ μλ κ°λ°μμ νΉμ§μ λλ€. νΉν C#μ LINQ, JavaScriptμ map/filter, Javaμ stream λ±μ κΉλν λ‘μ§ κ΅¬νμ λ§€μ° μ μ©νμ£ .
π‘ βμ½λλ μμ΄ λ¬Έμ₯μ²λΌ μ½νμΌ νλ€!β
8. try-catch μμΈ μ²λ¦¬
try
{
SaveToFile();
}
catch (Exception ex)
{
logger.Log(ex.Message);
}
μμΈ μ²λ¦¬λ μ€ν¨ κ°λ₯μ±μ΄ μλ λͺ¨λ μ½λμ νμν©λλ€. μ’μ κ°λ°μλ μ€λ₯λ₯Ό 무μνμ§ μκ³ , μμΈλ₯Ό λͺ ννκ² μ²λ¦¬ν©λλ€.
π‘ βμ€ν¨ν μ μλ κ³³μ νμ μ€ν¨νλ€. λλΉνμ.β
λ§λ¬΄λ¦¬: λ¨μν¨μ΄ κ°ν¨μ΄λ€
μ’μ κ°λ°μκ° μ°λ μ½λλ κ²°μ½ νλ €νμ§ μμ΅λλ€. μ€νλ € λ¨μνκ³ , λͺ ννλ©°, μ½κΈ° μ¬μ΄ μ½λμΌ λΏμ λλ€.
μ€λ μκ°ν μ½λ ꡬ문λ€μ²λΌ, μμ§λ§ κ°λ ₯ν λꡬλ€μ μ νμ©νλ©΄ μ¬λ¬λΆμ μ½λλ λ λμμ§ μ μμ΅λλ€.
βοΈ μ΄ κΈμ΄ λμμ΄ λμ
¨λ€λ©΄ λκΈμ΄λ μ’μμλ‘ μμν΄μ£ΌμΈμ!
νΉμ νμμ μμ£Ό μ°λ μ€νμΌμ΄λ ν¨ν΄μ΄ μλ€λ©΄ 곡μ ν΄ μ£Όμ
λ μ’μ΅λλ€ π