# SOLID Prensipler Daha temiz, okunabilir, bakımı kolay ve esnek bir yapıya sahip kodlar yazabilmek için prensipler bütünüdür. Her prensibin özel bir ismi vardır. Böylece İngilizce isimlerin baÅ harflerin bir araya gelmesiyle SOLID olarak isimlendirilmiÅtir. Bu kavram ilk kez Robert C. Martin isimli yazılımcının âDesign Principles and Design Patternsâ isimli kitabında geçmiÅtir. S: Single Responsibility Principle (Tek Sorumluluk) O: Open/Closed Principle (Açık-Kapalı Olma Durumu) L: Liskov Substitution Principle (Liskov Prensibi) I: Interface Segregation Principle (Arayüzlerin Ayrılması Prensibi) D: Dependency Inversion Principle (BaÄımlılıkları Tersine Ãevirme) Åimdi her prensibi ayrı ayrı inceleyelim. Konu sonunda da hepsini içeren bir örnek uygulama yapmıŠolacaÄız. ## Single Responsibility Prensibi Yazılımları oluÅtururken projeler büyüdüÄünde karmaÅıklık boyutu da artmaya baÅlar. Böyle durumlarda sınıfların dizaynında ve sınıfların bir araya getirdiÄi mimari boyutunda sorunlar ortaya çıkabilir. Proje büyüdükçe bazı sınıflar gereÄinden fazla sorumluluÄu fark etmeden üzerlerine çekmeye baÅlarlar. Bu tarz sınıflar âGod Classâ ismi verilir. SorumluluÄu dıÅında birçok iÅ yapıp birçok baÄımlılıÄı bünyesinde barındırır. TasarladıÄımız sınıfların tek bir iÅi yerine getiriyor olması gerekir. Aynı Åekilde mantıksal olarak birbirine yakın sınıflar bir araya gelmelidir. Inheritance (Kalıtım) veya Aggeration (Biraraya Getirme) gibi iliÅki biçimleriyle sınıfları da organize etmeliyiz. Bu prensip bizlere bir sınıfın ve bir fonksiyonun sadece bir görevi olduÄunu söylemektedir.  ## Open/Closed Prensibi YazdıÄımız kodların birbirinden iyi izole olmuÅ olması gerekmektedir. Böylece, bakımı kolay programlar yazılabilir. TasarladıÄımız sınıflarda kod deÄiÅikliÄi yapabilmek için gerçekten tek bir nedenimizin olması gerekmektedir. Bir üstte bahsettiÄimiz Single Responsibility prensibi gereÄi her sınıf tek bir iÅi yapmakla yükümlü olmalıdır. Diyelim ki yazılım üzerine yeni bir istek geldi. EÄer bu durumda hemen sınıf içinde birçok kod deÄiÅikliÄi yapmaya baÅlıyorsak, tasarladıÄımız sınıf Open/Closed prensibe uygun deÄildir. Bunun yerine ek bir özellik için sınıflarımız geniÅleyebilir olmalıdır. Sınıf içinde yapılan deÄiÅiklik bir baÅka sorunun (bug) ortaya çıkmasına sebep olabilir. Ãrümcek aÄı gibi birbirine baÄlı karmaÅık bir sınıf yapısı var ise bu deÄiÅiklik pahalıya patlayabilir. Bu nedenle sınıflarımız gelen deÄiÅim isteklerine kalıtım yoluyla baÅka sınıflar eklenebilir olma özelliÄiyle cevap vermelidir. Yani, bir deÄiÅiklik olduÄunda ilgili sınıfın kodlarını deÄiÅtirmek yerine, yeni özelliÄi ayrı bir sınıf Åeklinde tasarlayıp kullanabilmek gerekmektedir. Bu birbirinden iyi izole olmuÅ sınıflar olmasını saÄlayacaktır. Buna deÄiÅime kapalı, geniÅlemeye açık sınıflar diyoruz.  ## Liskov Substitution Prensibi SOLID prensipler içinde en muÄlak kalan baÅlıklardan biridir. Ãzetle, kalıtım yoluyla birbiriyle iliÅkisi olan A ve B sınıfımız olsun. A sınıfı ATA (üst) sınıf olsun. B ise A sınıfından türemiÅ alt sınıfımız olsun. B herhangi bir özellik kaybına veya deÄiÅime uÄramadan A referansında kullanılabilmelidir. Yani, A b = new B(); dediÄimizde Bâde fonksiyon kaybına veya bir bozulmaya sebep vermemeliyiz.  ## Dependency Inversion Prensibi (BaÄımlılıÄın tersine çevrilmesi) Yazılımları gerçekleÅtirirken onlarca sınıf yazarız. Bu sınıflar bir diÄerine mutlaka ihtiyaç duyar. Bu ihtiyaç sonucu bazı sınıfları diÄer sınıfların özelliklerini âAggregationâ yoluyla veya âInheritanceâ yoluyla bünyesine alır. İÅte bu durumda diÄer sınıfın özelliklerini kullanan sınıf ona karÅı bir baÄımlılıÄı oluÅur. Sınıflar arası baÄımlılıÄın olması çok normaldir. Fakat, bu sınıflar arası baÄımlılıÄın nasıl düzgün yönetileceÄi önemli bir konudur. İÅte baÄımlılıÄı tersine çevirme de bu kolaylıÄı saÄlayan prensiptir. Bir sınıf baÅka bir sınıfa ihtiyaç duyduÄunda onun alt sınıflarından birine referans alıp sınıf içinde oluÅturmak yerine, kalıtım aldıÄı ATA sınıf tipinde bir referans tutarak bu nesnenin dıÅarıdan gönderilmesini bekler. Bu baÄımlılıÄı tersine çevirmek için önemli bir adımdır. Burada amaç oluÅan baÄımlılıÄın referansının interface veya abstract class tipinde olmasıdır. Ayrıca diÄer önemli nokta sınıf içinde ânewâ anahtar kelimesi ile bu interface veya abstract classâdan türeyen bir alt sınıfın yaratılmaması gerekmektedir. 