SOLID- Open/closed principle

Druga zasada pisania programów, mówi o tym, że klasy, moduły, funkcje powinny być otwarte na rozszerzenia, ale zamknięte na modyfikacje.

Bardzo istotna zasada, powinniśmy tak pisać kod by do naszych klas łatwo dodawało się nowe funkcjonalności bez konieczności modyfikacji starych funkcji. W średnich lub dużych programach zmiana działania funkcji może spowodować awarię w wielu innych miejscach, więc powinno się jak najmocniej unikać ich modyfikacji. Oczywiście żeby było to możliwe trzeba wcześniej rozplanować sobie jak powinien wyglądać nasz program, co powinno być zadaniem poszczególnych metod.

Przykład źle napisanego kodu:

public class Lion{  
}

public class Cow{
}

public class AnimalsInfo{

    public String getAnimalFood(List<Object> animals){

        for (Animal animal : animals) {

            if (animal instanceof Lion){
                return "meat";
            }
            else if(animal instanceof Cow){
                return "grass";
            }
        }
    }
}

w powyższym przykładzie za każdym razem przy dodawaniu nowego zwięrzęcia będziemy musieli modyfikować metodę getAnimalFood i dodawać każdy gatunek, co zmienia jej działanie i oczywiście jest niezgodne z zasadą open/closed principle.

Kod po refaktoryzacji

public interface Animal {
    public String getFood();
}

public class Lion implements Animal{ 
    @Override
    public String getFood() {
        return "meat";
    } 
}

public class Cow implements Animal{
    @Override
    public String getFood() {
        return "grass";
    }
}

public class AnimalsInfo{

    public String getAnimalFood(List<Animal> animals){
        for (String animal : animals) {
            return animal.getFood();
        }
    }
}

W powyższym kodzie stworzyliśmy interfejs Animal z metodą getFood, który klasy Lion oraz Cow zaimplementowały. Musiały przesłonić metodę getFood(), która jest jedyną metodą w interfejsie. Dzięki temu w klasie AnimalsInfo nie musimy już sprawdzać klasy zwierzęcia na liście, bo każdy ma zaimplementowaną metodę getFood(). Jest tu wykorzystane zjawisko polimorfizmu. Metoda w zależności od tego jak zaimplementowana jest w danej klasie, zwróci inny wynik. Teraz gdy będziemy dodawać nowe klasy zwierząt nie będziemy modyfikować żadnej z naszych metod, a jedynie dodawać nowe klasy do naszego programu. Nie wpływamy więc na sposób działania metody getAnimalFood, co było celem.

Dodaj komentarz