SOLID: Päť princípov kvalitného objektového návrhu

Ako písať kód, ktorý je prehľadný, udržateľný a ľahko rozširovateľný

SOLID je súbor piatich princípov objektovo orientovaného návrhu, ktoré pomáhajú vytvárať čitateľný, flexibilný, testovateľný a udržateľný kód. Tieto princípy sú základom modernej architektúry vo väčšine objektovo orientovaných jazykov ako C#, Java, Python či C++.


Čo znamená SOLID?

  • S – Single Responsibility Principle
  • O – Open/Closed Principle
  • L – Liskov Substitution Principle
  • I – Interface Segregation Principle
  • D – Dependency Inversion Principle

1. Single Responsibility Principle (SRP)

Trieda by mala mať len jeden dôvod na zmenu.
Každá trieda má vykonávať jednu jedinú zodpovednosť.

Príklad – nesprávny dizajn:


public class ReportService
{
    public void GenerateReport() { }
    public void SaveToFile() { }
    public void SendEmail() { }
}

Príklad – správny dizajn:


public class ReportGenerator { }
public class FileSaver { }
public class EmailSender { }

2. Open/Closed Principle (OCP)

Softvér má byť otvorený pre rozšírenie, ale uzavretý pre zmenu.
Nové funkcionality sa majú pridávať bez zmien v existujúcom kóde.

Príklad – nesprávny dizajn:


public class DiscountService
{
    public decimal GetDiscount(Customer c)
    {
        if (c.Type == "Regular") return 0.05m;
        if (c.Type == "Vip") return 0.20m;
        return 0;
    }
}

Príklad – správny dizajn:


public interface IDiscountStrategy
{
    decimal GetDiscount();
}

public class RegularCustomerDiscount : IDiscountStrategy
{
    public decimal GetDiscount() => 0.05m;
}

public class VipCustomerDiscount : IDiscountStrategy
{
    public decimal GetDiscount() => 0.20m;
}

3. Liskov Substitution Principle (LSP)

Potomok musí byť plnohodnotnou náhradou svojho predka.
Triedy odvodené od iných tried sa musia dať používať bez porušenia logiky aplikácie.

Príklad – nesprávny dizajn:


public class Bird
{
    public virtual void Fly() { }
}

public class Ostrich : Bird
{
    public override void Fly()
    {
        throw new NotSupportedException();
    }
}

Príklad – správny dizajn:


public abstract class Bird { }

public class FlyingBird : Bird
{
    public void Fly() { }
}

public class Ostrich : Bird { }

4. Interface Segregation Principle (ISP)

Klienti nemajú byť nútení implementovať metódy, ktoré nevyužívajú.
Rozhrania majú byť malé, špecializované a presné.

Príklad – nesprávny dizajn:


public interface IWorker
{
    void Work();
    void Eat();
}

Príklad – správny dizajn:


public interface IWorkable
{
    void Work();
}

public interface IEatable
{
    void Eat();
}

5. Dependency Inversion Principle (DIP)

Závislosti majú smerovať od detailov ku abstrakciám.
Triedy nemajú závisieť od konkrétnych implementácií, ale od rozhraní.

Príklad – nesprávny dizajn:


public class NotificationService
{
    private EmailSender _sender = new EmailSender();

    public void Notify(string message)
    {
        _sender.Send(message);
    }
}

Príklad – správny dizajn:


public interface IMessageSender
{
    void Send(string message);
}

public class EmailSender : IMessageSender
{
    public void Send(string message) { }
}

public class NotificationService
{
    private readonly IMessageSender _sender;

    public NotificationService(IMessageSender sender)
    {
        _sender = sender;
    }
}

Zhrnutie SOLID

Princíp Význam
S Jedna trieda = jedna zodpovednosť
O Možnosť rozšírenia bez úprav existujúceho kódu
L Deti musia plne nahradiť rodičov
I Malé, presné rozhrania
D Závislosť na abstrakciách, nie detailoch

Záver

SOLID je základ profesionálneho objektovo orientovaného návrhu. Dodržiavaním týchto piatich princípov získate kód, ktorý je flexibilný, ľahko rozšíriteľný a dlhodobo udržateľný. Tieto princípy prirodzene vedú ku kvalitnej architektúre a znižujú množstvo chýb v projekte.

Máte projekt? Prvá konzultácia je zadarmo

Či už máte hotové zadanie alebo len nápad - odpoviem vám do 24 hodín.

Kapacita obmedzená: V danom čase aktívne pracujem maximálne na 2 projektoch súčasne, aby som zachoval vysokú kvalitu.

Napísať Email 📞 Zavolať teraz LinkedIn Profil