Deo zbornika Uvod u softversko inženjerstvo

Otvoreno-zatvoren princip

Otvoreno-zatvoren princip (open-close principle) glasi da klase treba da budu otvorene za proširenje a zatvorene za izmene. To znači da trebaju biti napisane tako da se mogu proširiti, ali da se ne moraju menjati da bi se to postiglo. Odnosno da možemo dodati novu funkcionalnost bez menjanja postojeće.

Menjanje postojeće funkcionalnosti dovodi do mnogih grešaka u aplikaciji. Proširenje se obično postiže kroz interfejse ili nasleđivanje. Polimorfizam omogućava proširenje bez potrebe za menjanjem postojećih klasa, jer možemo dodati nove podklase koje implementiraju specifično ponašanje.

Primer

Imamo klasu Customer koja poseduje jednu metodu getDiscount():

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

Ako vremenom uvedemo posebne tipove mušterija (npr. silver i gold), onda se klasa Customer može promeniti na sledeći način:

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, ako budemo imali još tipova mušterija, moraćemo dodavati još if uslova u getDiscount metodu, što vodi do novih promene u okviru Customer klase. Kad god se promeni klasa, mora se osigurati da prethodni kod radi, jer izmene mogu dovesti do grešaka.

Rešenje pomoću polimorfizma

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 Otvoreno-zatvorenog principa.

Izvori

  • Zdravko Ivanković i Dejan Lacmanović, Softversko inženjerstvo 2 (skripta), Tehnički fakultet Mihajlo Pupin, Zrenjanin
  • Wikipedia, Open–closed principle