Open Closed Principle
- Herhangi bir işlevsel kod bloğu yaptığı iş yetersiz kalınca yeni eklenecek özellikler için mevcut yapıyı koruyarak düzenleme yapılmalıdır.
Mevcut durum
class Vehicle{
void start();
}
class Engine{
Vehicle vehicle;
void startEngine(){
vehicle.start();
}
setVehicle(Vehicle vehicle);
}
Yeni Araç Eklenmek İsteniyor
class Airplane{
}
Hatalı Örnek
class Vehicle{
void start(){
//Vehicle start
}
}
class Airplane extends Vehicle{
@Override
void start(){
//Airplane start
}
}
class Engine{
Vehicle vehicle;
void startEngine(){
vehicle.start();
}
setVehicle(Vehicle vehicle);
}
Genişletilmeye açık olduğu için "Open" bölümünü sağlar fakat "start" methodu modifikasyona kapalı olmadığı için "Closed" bölümünü sağlamaz. İleride beklenmeyen sonuçlara yol açabilir.
Düzeltilmiş Örnek
class Vehicle{
//Final ile prensibin "Closed" kısmını sağladık
final void start(){
vehicleStart();
}
void vehicleStart(){
//Start vehicle
}
}
class Airplane extends Vehicle{
//Start methodu Override edilemez
//Eklenti yapılarak prensibin "Open" kısmı sağlandı
void vehicleStart(){
//Start airplane
}
}
class Engine{
Vehicle vehicle;
void startEngine(){
vehicle.start();
}
setVehicle(Vehicle vehicle);
}