7 entry daha
  • programlamada yazililm kod kalitesini arttirmayi amaclayan "solid" prensiplerinin "l" harfine denk gelen "liskov substitution principle" yani bir temel sinif bir method tarafindan kullaniliyo ise o temel sinifin alt siniflari da kullanilabilmelidir. bu cok soyut bir anlatim, bunu bir ornek (java) ile anatir isek su sekilde ifade edebiliriz. ornegin bir "kus" sinifimiz olsun. dolayisi ile kuslar ucabilir, o nedenle "uc" diye methodumuz olsun.

    class kus{
    public void uc(){
    //ucma islemini yap
    };
    }

    simdi "serce" sinifi uretelim, serce bir kustur (ıs-a) o nedenle kus sinifini "extend" eder.
    class serce extends kus{}

    simdi de "devekusu" sinfi uretelim, devekusu bir kustur (ıs-a), o nedenle kus sinifini extend eder, ama bir sartla devekusu ucamaz. bu nedenle "uc" methodunu "override" edip, hicbirsey yapmayan bir method haline getirmek durumundayiz.
    class devekusu extends kus{
    public void uc(){
    //hicbirsey yapma
    };
    }

    bu durum liskov değiştirme prensibinin ihlalidir. cunku ilerde gelen kuslari ucurma gorevine sahip bir method tum kuslara "uc" emrini verebilir, cunku tum kuslarin ucma methodu var. ama bazi kuslarin ucma emri karsisinda hicbir sey yapmadigini gorecektir. bu sistemde hatalara neden olacaktir. bu nedenle kuslara uc emrini veren method sadece ucabilen kuslar ile calismalidir, sadece ucabilen kuslari kabul etmelidir. biz bu methoda sadece ucabilen kuslari once tiplerine gore kontrol edip gonderebiliriz ama bu durumda da "solid" prensiplerinin "o" harfine denk gelen "open/closed principle" prensibini ihlal etmis oluruz. bu mimari hatayi su sekilde cozebiliriz, onelikle "tum kuslar ucabilir" on kabulunu reddedecegiz ve "kus" sinifindan "uc" methodunu silecegiz, cunku tum kuslar ucamaz.

    class kus{//ucma ozelligi olmamali, cunku tum kuslar ucamaz}

    daha sonra ucabilen kuslar icin ozellik yaratmaliyiz. bu bir interface olabilir.

    public interface ucabilir {
    public void uc();
    }

    daha sonra da sadece ucabilen kuslaria bu ozelligi ekleyecegiz, yani serce bir kustur ve ucabilir.
    class serce extends kus implements ucabilir{
    public void uc(){
    //hicbirsey yapma
    };
    }

    ama devekusuna bu ucabilme ozelligini eklemeyecegiz, devekusu sadece bir kustur.
    class devekusu extends kus {}

    en son olarak da kuslari ucurma gorevine sahip method sadece ucabilir kuslari kabul etmeli
    void ucurucu(ucabilir u){
    u.uc();
    }

    boylece ucurucu methodu "ucurucu(new serce());" ile cagirilabilirken "ucurucu(new kus());" ve "ucurucu(new devekusu());" ile cagirilamaz, cunku sadece ucabilen kuslar "ucurucu" tarafindan kabul edilir.
4 entry daha
hesabın var mı? giriş yap