Deo zbornika Uvod u softversko inženjerstvo

Otvoren/zatvoren princip

Email Twitter LinkedIn Facebook Google

Otvoren-zatvoren princip (Open-close principle) govori da klasa treba da bude otvorena za proširenja a zatvorena za izmene.

Drugim rečima, treba omogućiti dodavanje novih karakteristika i proširenje klase bez promene unutrašnjeg ponašanja postojećih metoda. Princip teži da se izbegne menjanje postojeće klase i drugih klasa koje od nje zavise, jer će to dovesti do pojavljivanja velikog broja grešaka u samoj aplikaciji.

Primer

U okviru primera možemo posmatrati klasu Customer koja poseduje jednu metodu getDiscount():

class Customer {
  public virtual double getDiscount(double TotalSales) {
    return TotalSales;
  }
}

Ako se vremenom pored klijenata pojave i klijenti posebnog tipa (npr. silver i gold), onda se klasa Customer može promeniti kao što je prikazano:

class Customer {
  private int _custType;

  public int CustType {
    get {
      return _custType;
    }
    set {
      _custType = value;
    }
  }

  public double getDiscount(double TotalSales) {
    if (_custType == 1) {
      return TotalSales - 100;
    }
    else {
      return TotalSales - 50;
    }
  }
}

Problem je što, ako budemo imali još tipova klijenata, moraćemo dodavati još if uslova u okviru getDiscount metode, što će dovesti do nove promene u okviru Customer klase. Kada se god promeni klasa, mora se osigurati da prethodni kod radi, jer izmene mogu dovesti do pojave grešaka u ostatku koda.

Umesto toga, kod treba proširiti kako bi bili sigurni da postojeći kod i dalje radi:

class Customer {
  public virtual double getDiscount(double TotalSales) {
    return TotalSales;
  }
}
class SilverCustomer: Customer {
  public override double getDiscount(double TotalSales) {
    return base.getDiscount(TotalSales) - 50;
  }
}
class GoldCustomer: SilverCustomer {
  public override double getDiscount(double TotalSales) {
    return base.getDiscount(TotalSales) - 100;
  }
}

Ovim kodom smo postigli da je klasa Customer zatvorena za bilo kakve izmene ali je otvorena za proširenja, što je suština OCP-a.

Izvor: Zdravko Ivanković i Dejan Lacmanović, Softversko inženjerstvo 2 (skripta), Tehnički fakultet Mihajlo Pupin, Zrenjanin