SOLID Nedir?

Ibrahim Yilmaz
Sep 1, 2018 · 5 min read

Oncelikle Muslum Babaya rahmet dileyerek sozlerime baslamak istiyorum. Onun da dedigi gibi “hangimiz sevmedik cilginlar gibi”.

Bazilarimiz sevdigi kisinin isminin bas harfini vucuduna kazitti, kimimiz ise o malum kisinin(grup Anemi geliyor aklima burda bilmeyenler varsa bilenlerden ogrensin!) isminin bas harflerini kullanarak siirler yazdik. Buna kisacasi akronim ya da ecnebicesi acronym diyoruz. Hatta bazilarimiz konuyu abartti akrostisler yapti(Bkz: Osmanli Devleti 9. Sultani 1. Selimin Serdar olur siiri).

Ya da kisa mesajlarda yazdigimiz scs ya da kib gibi seyler de akronime ornek gosterilebilir(Bu arada bazilarimiz da ezber yapmak icin az kullanmadik akronimleri. Periyodik Cetveli Haydar Pasa Lisesinin Namli Kimyasiyi Rabianin Cesetini Firlatti diye ezberlemis bir nesiliz sonucta).

Yazilimci dedigin akronim yaparsa ne olur? Muhakkak cok romantik seyler ortaya cikmayacaktir. SOLID de yazilimcinin yapmis oldugu bir akronimdir. Once Siir gibi kod nasil yazilir bunun kurallarini cikartmislar sonra bu kurallara neden bir akronim yapmayalim deyip SOLID demisler(saka tabiki SOAP protokolu Sabundan gelir kopurt kaydir mantigiyla calisir demek gibi bir saka).

Bu arada ben gercekten SOLID’in boyle populer olmasini bu akronime bagliyorum cunku GRASP Design Patterns’lar da ayni seyleri soyler ama SOLID gibi populer olmamistir.

O zaman yazalim su SOLID akronimini:

Single Responsibility
Open-Closed Principle
Liskov Substitution
Interface Segregation
Dependency Inversion

Bu kurallari tek tek ele alacak olursak:

Single Responsibility

Adindan da anlasilacagi gibi Single yani tek bir sorumluluk yerine getirmesi ilgili sinifin ya da methodun ya da package’in.

Yani soyle dusunun:

Bir methodunuz var hem network ile ilgili islemleri yurutuyor hatalari ele aliyor hem diske yazma ile ilgili islemleri yurutuyor ve bunlari ic ice ele aliyor.

Gelistirdiginiz uygulamada da hata var. Ilgili sorunu tespit edebilmek icin teker teker debug yapip ilgili yeri bulup yama yapiyor ve gideriyorsunuz. Sonra yine hata cikiyor yine kodu bastan asagi debug ediyorsunuz. Sorun belki network erisiminde ama siz diske yazmayi da debug ediyorsunuz ya da tam tersi. Diske degil de baska bir ortama yazilmasi ya da ordaki verinin baska bir ortamda islenmesi isteniyor. Ilgili kod parcagini methodunuzda dogru yere eklemeye calisiyorsunuz(ariyorsunuz ekliyorsunuz calismiyor biraz debug biraz yeni yama derken iyice makarna oluyor kod. Artik bitse de gitsek modlari basliyor. Baska bir yazilimciya is kitlendi mi de rahatliyorsunuz cunku o kodu yazan usta yazilimcisiniz. Saatli bomba baska birinin elinde patliyor o adam iste cok iyi bir yazilimci degil ama makarna kodu yazan siz zati muhterem iyi bir developer oluyorsunuz. ).

Ancak bu methodunuz kucuk methodlara bolup network ile ilgili kisimlari ayri bir methodda disk erisimi ile ilgili kisimlari ayri bir methodda ele almis olsaydiniz. Ana cagirdiginiz methodda da ilgili isinizi bu methodlari cagirarak yaptiginiz bir durumda bug ne olursa olsun hizlica cozume kavusturabilirdiniz ve yaptiginiz duzeltme sadece ve sadece ilgili kismi etkileyecegi icin farkli farkli yerlere yama yapmaktan kurtulmus olurdunuz(Simdi adam bugi buluyor onu cozuyor sonra o bugin cikacagi her yere ilgili yamayi kopyalayip yapistiriyor. Psikolojik siddet vallahi!)

Optimus Prime olan siniflar biliyorum. Adam tum yaptigi herseyi static yapmis bu sinifin icine toplamis. Bu sinif ne is yapiyor diye sordugunuzda cevap herseyi. Bir de bu siniflarin adlari Utils, Helper oldu mu tadindan yenmez.

Bu yuzdendir ki adamlar demis ki bir sinif ya da method bir sorumlulugu yerine getirsin.

Bunu su an aklimizda canlandirabiliyoruz ancak nasil yapicaz? Nasil yazicaz? Bir method yazdik hangi sinifin altina koyucaz bunlar da buyuk soru isaretleri? SOLID’i soran zati muhteremler tanimi bilin yeter isterler ama siz tanimdan ote uygulayin da.

Bunun icin de Information Expert pattern’i kullanilir. Yani bilen yapsin baba. Yani ShapeUtils sinifiniz var alan hesapliyor ama shape ile ilgili bilgiyi bilmiyor(Biz zorla dayatabiliriz parametre olarak ya da instanceoflarla ama sonucta zorlama oluyor.). Alani birakin shape sinifi hesaplasin. Bir ogrenci bir derse enroll olacak, Ogrenci ile ilgili bilgileri ogrenci biliyor birakin Ogrenci ile ilgili Repository ya da her neyse o enroll yapsin.

Herseyi bilen insandan korkun ama herseyi yapan koddan daha cok korkun. Kodlarimiz demokratik olsun. Tek bir method tek bir sinif tum herseyi ustlenmesin!

Open-Closed Principle

Acik-Kapali diye cevrilince aklima kapi ya da lamba geliyor acik mi kapali mi? Ama tabi yazilim gelistirme olunca yazilim acik mi kapali mi deyince insanin aklina acik kaynak kodlu mu ya da kapali kaynak kodlu mu gelebilir. Bunlar tabi isin goygoyu. Isin aslina gelicek olursak. Burdaki denmek istenen, gelistirmeye genisletmeye acik, ama degistirmeye kapali demektir.

Mevcutta calisan bir sisteminiz var ve yeni bir fonksiyonelite eklemek istiyorsunuz. Basliyorsunuz var olan methodlari editlemeye. Al basina bela belki de mevcutta var olan birseyi bozdunuz. Bunun yerine yazilimlarimizi genisletmeye acik degisime kapali olacak sekilde tasarlamaliyiz.

Burda da aslinda devreye giren konu su “Polimorphism”, yani degisim noktasini bul ve minimuma indirge. Optimus prime bir alan hesaplayan fonksiyon yerine. Sekilden sekile degisen bu hesaplamayi kulagindan tuttugumuz gibi interface yapalim ve her shape kendi alanini hesaplasin(Information Expert). Sisteme yeni bir sekil girdi mi digerlerinin kodlarina dokunmamis oluruz. Fonksiyonlardan ote sorumlulugu Object Oriented bir sekilde yerine getiriyoruz(Interface ya da Abstract class ne uygunsa kullanarak…).

Liskov Substitution

Ne zaman bu maddeyi hatirlasam Liskov ismine takiliyorum Rus mu acaba kadin olsa Liskova ya da Ukraynali olsa Liskovenko ya da Farsi olsa Liskovian mi oluyor gibi bir seviyesiz goy goy gelir aklima.

Ama bunlarin hepsi seviyesiz bir goygoydan ote degil. Cunku bu maddenin ismi Amerikali Unlu Kadin Bilgisayar Bilim Insani Barbara Liskov’dan gelir. Kendisi de su an MIT’de Prof’tur. Cennet analarin ayaklarinin altindadir ya Barbara Liskov da Yazilim Mühendisliği ve Bilgisayar Bilimlerinin analarindan biridir.

Gelelim Romayi yakan anamizin ogudune: Adin ne olursa olsun sen gerekirse annenin babanin yerini alabilmelisin. Yani alt siniflar turetilmis olduklari parentlerin yerlerine kullanilabilir.

Interface Segregation

Bu madde de bize kullanmayacagin bir bilgiyi ogrenme ya da yapmayacagin bir ise yatirim yapma demek istiyor. Klasik hemen Egitim Sistemini elestiririz.

Yani gelistirdiginiz bir yazilim component’i kullanmayacagi bir interface i implement etmemelidir. Etse ne olcak ici bos kalicak veya , yazarken ya da ilerde kodlari okurken anlamada zaman kaybi olucak.

Dependency Inversion

Bu madde de bize diyor ki bir is yaparken mutlaka bi yerleri temsil edersin ve yazilim bilesenleri bir entity e ozel degil onun tipine gore davranir. Bu yuzden yazilim gelistirirken genellikle ilgili entitynin interface ya da abstract sinifini kullaniriz. Bu bize ne saglar. Farkli ortamlara kolay uyum saglariz. Ornegin test icin kullandigimiz network sertifikasi ile uretim ortami farklidir. Ikisinin network ile ilgili islemlerini bir interfaceden yonetip ilgili ortama gore bu fonksiyoneliteyi yerine getiren modulu cagirmis olursak, test ya da productionda calisirken birbirleri arasinda hizlica gecebiliriz.

Kisacasi bu isimleri ezbere bilmek cok sacma! Bunlari acikla teker teker demek de cok sacma. Ama malesef bu kurallari izlemeyen insanlar bunlari soruyor.

Bunlari uygulamak ise paha bicilemez. Bir Yazilimciyi Ameloper degil de Developer yapan sey bu 5 kuralda saklidir.

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade