Nesne yönelimli programlama OOP günümüz yazılım geliştirme sürecinin vazgeçilmez bir parçasıdır ve SOLID prensipleri de OOP'nin öncüsüdür Bu prensipler Single Responsibility Principle SRP, Open-Closed Principle OCP, Liskov Substitution Principle LSP, Interface Segregation Principle ISP ve Dependency Inversion Principle DIP'dan oluşur SRP, her sınıfın tek bir sorumlulukla sorumlu olması gerektiğini belirtirken, OCP değişikliklere kapalı, genişletilebilir kod yazılmasını sağlar LSP, alt sınıfların üst sınıfların yerine kullanılmasını belirtirken, ISP arayüzlerle çalışan sınıfların tasarlanmasını sağlar DIP ise sınıfların birbirlerine olan bağımlılığını azaltır Bu prensipler doğru bir şekilde uygulandığında kodlar daha okunaklı, daha az hata payı olan ve kolay yönetilebilen hale gelir Ayrıca polymorphism, abstraction ve encapsulation gibi OOP kavramları da

Nesne yönelimli programlama (OOP), günümüz yazılım geliştirme alanının vazgeçilmez bir parçasıdır. OOP'nin öncüsü olan SOLID prensipleri de yazılım geliştirme sürecinde kullanılan en önemli kalıp ve prensiplerdir. Temeli Robert C. Martin tarafından atılan SOLID prensipleri, yazılım geliştirme sürecinde yazılımcılara yol gösterir ve kodların yönetimini kolaylaştırır.
SOLID prensiplerinin ilk harfleri bir araya getirilerek ortaya SOLID ismi çıkmıştır. Bu prensipler Single Responsibility Principle (SRP), Open-Closed Principle (OCP), Liskov Substitution Principle (LSP), Interface Segregation Principle (ISP) ve Dependency Inversion Principle (DIP)'dan oluşmaktadır. Bu prensiplerin uygulanması, yazılımın daha okunaklı, bakımı kolay ve daha az hata payıyla çalışmasını sağlayacaktır.
SRP, her sınıfın tek bir sorumluluğu olması gerektiğini ifade eder. Yani bir sınıfın yapması gereken tek bir iş olmalıdır. Bu sayede sınıflar daha az karmaşık hale gelir ve bakımları daha kolay olur. OCP ise değişikliklere kapalı, genişletilebilir kod yazılmasını sağlar. LSP ise alt sınıfların, üst sınıfların yerine geçebilmesini ifade eder. ISP, birbirinden bağımsız arayüzlerle çalışan sınıfların tasarlanmasını sağlar. DIP, bağımlılığı tersine çevirir ve sınıfların birbirlerine bağımlılığı azaltır.
OOP'nin önemli kavramlarından biri olan polymorphism ise bir nesnenin farklı biçimlerde davranabilmesini ifade eder. Abstraction, nesnelerin çok genel olarak tasarlanması ve sınırlı bir alanla sınırlandırılmasıdır. Encapsulation ise nesnelerin iç kısımlarını gizlemek ve sadece belirli yöntemlerle erişilebilir hale getirmektir.
SOLID prensipleri ve OOP'nin arasındaki ilişki oldukça güçlüdür ve bu prensipleri uygulayan kodlar daha okunaklı, daha az hata payı olan ve daha kolay yönetilen kodlar olur. Bu prensipleri uygulayan yazılımcılar, yazılım geliştirme sürecinde daha başarılı sonuçlar elde ederler.
Single Responsibility Principle (SRP)
Single Responsibility Principle (SRP), nesne yönelimli programlama için çok önemli bir prensiptir. Temel olarak, bir sınıfın yalnızca bir işlevi veya sorumluluğu olması gerektiğini belirtir. Bu, bir sınıfın değişiklikleri nedeniyle diğer sınıfları etkilememesi veya kullanıcı taleplerine cevap veremediği durumları önlemeye yardımcı olur.
SRP, kodun daha az bağımlılık, daha fazla sürdürülebilirlik, okunabilirlik, yeniden kullanılabilirlik ve test edilebilirlik gibi avantajlarının yanı sıra daha hızlı geliştirme süreleri sunar. SRP'nin uygulanması, sınıfların bütünlüğünü ve okunabilirliğini artırır. Ayrıca, gerekli gereksinim değişikliklerine yanıt vermek daha da kolaylaşır.
Bir örnek vermek gerekirse, bir email sınıfı ele alalım. Email sınıfı yalnızca e-posta gönderme işlevine sahip olmalıdır. Başka bir özellik, örneğin e-posta şablonlarını yönetme işlevi, ayrı bir sınıf tarafından ele alınmalıdır. Bu, sınıfların kendilerine ait bir işlevi olduğundan, her biri daha belirgin ve okunaklı hale gelir.
SRP'nin uygulanması aynı zamanda paralel çalışmayı da kolaylaştırır. Her bir sınıf, diğerlerinin işlevlerinden bağımsız olarak işlev görebilir ve zaman kazanılmış olur. SRP'nin tam olarak uygulanması için, bir sınıfın birincil sorumluluğunun net bir şekilde tanımlandığından emin olmak gerekir. Böylece, sınıflara gerektiğinde ek sorumluluklar yüklendiğinde, gereksinimlerin ve işlevselliğin değişiklikleri, başka sınıflara ayak uydurmak zorunda kalmadan daha kolay bir şekilde ele alınabilir.
Open-Closed Principle (OCP)
Open-Closed Principle (OCP) açık/kapalı prensibi olarak da bilinir ve nesne yönelimli programlama için önemli bir prensiptir. Bu prensip, yazılım sistemlerinde değişiklik yapmanın yapısını etkilemeden mümkün olduğunu gösterir. Yani bir modül ya da sınıf üzerinde yapılan değişiklikler, diğer sınıfları veya modülleri etkilemeden yapılabilir.
OCP prensibi, esnek ve değiştirilebilir bir yazılmış kod yapısı oluşturmayı hedefler. Bu sayede, yazılım sistemi gereksinimlerinde yapılan değişiklikler sonrasında, mevcut kodu değiştirme ihtiyacını azaltır ve bu da zaman, emek ve maliyet tasarrufu sağlar.
Bu prensibin nesne yönelimli programlama ile ilişkisi, miras(Inheritance) ve kullanım(Composition) gibi teknikler kullanılarak sağlanır. Miras, bir sınıfın başka bir sınıftan özelliklerini devralmasına olanak sağlar. Böylece, değişiklik yaparken, kalıtım yapıları kullanılarak, temel sınıflarda yapılan değişiklikler, yeni sınıfları ve objeleri etkilemez.
Kullanım, bir sınıfın bir başka sınıfta kullanıldığı ve onun özelliklerini kullandığı bir yapıdır. Bu sayede, tasarım deseni ve yazılım kodu ayrı olarak düşünülebilir ve herhangi bir değişiklikte tek bir sınıf veya nesne değiştirilerek, yapısal etkileşim sağlanabilir.
OCP prensibi, yazılım sistemlerinde yapılacak olan değişikliklerin etkisini minimizasyonunu sağlarken, kod karmaşıklığını azaltır ve daha esnek bir yapı oluşturarak yazılımın ömrünü artırır. Bu prensibin doğru bir şekilde kullanılması, yazılım geliştirme sürecinde oldukça önemli bir rol oynar.
Liskov Substitution Principle (LSP)
Liskov Substitution Principle (LSP), nesne yönelimli programlamada çok önemli bir prensiptir. Bu prensip, alt sınıfların, üst sınıfların yerine kullanılabilecek olması gerektiğini belirtir. Yani, bir alt sınıf, miras aldığı üst sınıfın kullanılması gereken koşullarını sağlamalıdır.
LSP, özellikle kalıtım (inheritance) kavramıyla birlikte kullanılır. Bu prensibe uyulduğunda, üst sınıflardan alt sınıflara miras alınan özelliklerin ve davranışların aynı şekilde çalışması gereklidir. Bu sayede, üst sınıfların yerine alt sınıflar kullanılabilir ve programlama hatalarının önüne geçilebilir.
LSP uygulamaları, nesne yönelimli programlamanın sağladığı faydaların en önemlilerinden biridir. Bu prensip, yazılımın daha esnek ve yeniden kullanılabilir olmasına yardımcı olur. Ayrıca, LSP sayesinde yazılımın bakımı ve geliştirilmesi daha kolay hale gelir.
Örneğin, bir araba sınıfı ve bu sınıftan türeyen elektrikli araba sınıfı düşünelim. Elektrikli araba sınıfı, araba sınıfının özelliklerinin büyük bir kısmını miras alır. Ancak, elektrikli araba da arabalar gibi motor gücüne sahip olmak yerine, batarya gücüne sahiptir. LSP prensibi gereği, elektrikli araba sınıfı da arabalar sınıfının kullanılması gereken koşullarını sağlamalıdır. Bu sayede, elektrikli arabaların sorunsuz bir şekilde yerine arabalar kullanılabilir.
LSP prensibi, nesne yönelimli programlama için oldukça önemlidir. Programlama hatalarını önlemeye ve yazılımın bakımını kolaylaştırmaya yardımcı olur. Bu prensibi uygulayan programcılar, daha esnek ve güvenli yazılımlar geliştirebilirler.
Interface Segregation Principle (ISP)
Interface Segregation Principle (ISP), nesne yönelimli programlama (OOP) için önemli bir prensiptir. Bu prensip, bir arayüzün, birden fazla amaç için fazla sayıda metoda sahip olmaması gerektiğini belirtir. Bunun yerine, her amaç için ayrı arayüzler veya sınıflar oluşturulmalıdır.
ISP'nin önemi, bir sınıfın, onun için gereksiz olan birçok özelliğe sahip olmamasını sağlamaktır. Bu, sınıfın gereksiz artışını önler ve kodun daha okunaklı ve anlaşılır hale gelmesini sağlar.
ISP, OOP'nin açık bir güçlü yanı olarak kabul edilir ve tasarım kalitesinin artmasına yardımcı olur. ISP'yi kullanarak, kodunuz daha az karmaşık hale gelir ve sınıflarınız daha az bağımlı hale gelir.
Örnek olarak, bir arabada birden fazla özellik vardır. Fakat, bir sürücü arabayı sadece sürmek istediğinde, diğer özellikler onun için gereksiz hale gelir. Bu nedenle, bir sürücüyü sadece sürmek için gerekli olan arayüzü oluşturarak, ISP prensibine uygun bir şekilde tasarlayabilirsiniz.
ISP, OOP için oldukça önemli bir prensiptir ve doğru bir şekilde uygulandığında, tasarımınızın daha esnek ve ölçeklenebilir hale gelmesine yardımcı olur. Bu nedenle, ISP'yi kullanarak, kodunuzu daha okunaklı ve anlaşılır hale getirebilirsiniz.
Dependency Inversion Principle (DIP)
Dependency Inversion Principle (DIP), nesne yönelimli programlama (OOP) prensiplerinden biridir ve OOP uygulayıcıları için oldukça önemlidir. Bu prensip, yüksek düzeyde esneklik ve bağımsızlık sunarak, uygulamaların daha kolay bakımı ve değiştirilmesi için tasarlanmıştır.
DIP, yüksek düzeyde bağımlılık sağlayan kod yapısını değiştirerek, bir bağımlılık omurgası oluşturur. Bu omurga, yüksek seviyeli modüllerin, daha düşük seviyeli modüllere bağımlı olmamasını sağlamaktadır. Böylece, düşük seviyeli modüllerin değiştirilmesi veya değişikliklerin uygulanması, yüksek seviyeli modülleri de etkilemez.
DIP'nin nesne yönelimli programlama ile ilişkisi oldukça güçlüdür. Bu prensip, üst düzey modüllerin, alt düzey modüllere doğrudan bağımlı olmamasını sağlarken, arayüzleri kullanarak birbirleriyle etkileşim kurmalarını sağlar. Bu sayede, kod yapısı daha esnek ve daha kolay değiştirilebilir bir hale gelir.
DIP aynı zamanda SOLID prensiplerinin de bir parçasıdır. Diğer SOLID prensiplerinde olduğu gibi, DIP de uygulama geliştiricilerine, daha kaliteli ve esnek kod yapısı oluşturma yolunda rehberlik etmektedir. DIP, modern yazılım uygulamalarının temeli olarak kabul edilmekte ve uygulayıcılar tarafından aktif olarak kullanılmaktadır.
DIP'ye örnek vermek gerekirse, bir müşteri sipariş sistemi düşünelim. Bu sistemde, müşteri bilgilerinin depolanması ve işlenmesi gibi düşük seviyeli görevler, daha yüksek seviyeli bir sipariş işleme modülünden ayrı olarak ele alınabilir. Bu sayede, iki modül birbirine bağımlı olmadan çalışabilir ve bir modülde yapılacak herhangi bir değişiklik, diğer modülü etkilemez.
Sonuç olarak, DIP bir uygulama tasarım prensibi olarak, kod esnekliği ve değiştirilebilirliğini artırarak, daha kaliteli yazılım uygulamaları oluşturulmasına yardımcı olur. Bu prensip, nesne yönelimli programlama ile yakından ilişkili olmakla birlikte, modern yazılım geliştirme uygulamalarında sıklıkla kullanılmaktadır.
Polymorphism (Çok biçimlilik)
Polymorphism (Çok biçimlilik), nesne yönelimli programlamanın önemli prensiplerinden biridir. Bu prensip ile bir nesne farklı durumlarda farklı davranışlar sergileyebilir. Yani bir sınıftan türetilen bir nesne, birden fazla şekilde davranabilir.
Örneğin, bir araba sınıfı düşünelim. Bu sınıftan türetilen bir nesne, hareket etme, durma, hızlanma gibi farklı davranışlar sergileyebilir. Ancak bu davranışlar, farklı durumlarda farklı şekillerde olabilir. Örneğin, bir yarış arabası ile bir iş arabası aynı hareketleri sergileyebilir ancak bu hareketler farklı şekillerde gerçekleşir.
Polymorphism'in bir diğer örneği de, bir hayvan sınıfı ve bu sınıftan türetilen bir kedi nesnesi düşünelim. Bu kedi nesnesi, "miyavlamak" davranışı sergilerken, bir köpek nesnesi "havlamak" davranışı sergiler. Yani aynı davranış, farklı şekillerde gerçekleşebilir.
Polymorphism, nesne yönelimli programlamada kodun tekrarını önler ve daha düzenli bir programlamayı sağlar. Ayrıca, kodun daha esnek olmasını sağlayarak gelecekte yapılacak değişikliklere kolayca adapte olabilmesini sağlar.
Abstraction (Soyutlamak)
Abstraction, nesne yönelimli programlama (OOP) dünyasında sıkça kullanılan bir terimdir. Temel olarak, bir nesnenin önemli özelliklerini ve işlevlerini vurgulayarak, detaylardan kaçınarak daha yüksek bir seviyede düşünmeyi sağlar. Bu prensip sayesinde, karmaşık bir yapıyı basitçe ele alabilir ve daha kolay anlaşılabilir hale getirebilirsiniz.
Örneğin, bir araba nesnesi üzerinde düşünürken, sadece aracın markası, modeli ve performansı gibi temel özelliklerine odaklanarak soyutlama yapabilirsiniz. Bu bilgiler, arabanın gerçek hayattaki detaylarından bağımsız olarak düşünebilmeyi sağlar. Ayrıca, bir programcı olarak, bir nesneyle etkileşim kurarken, sadece gerekli olan özelliklerle ilgilenerek kodlarınızı daha kolay yönetebilirsiniz.
Nesne yönelimli programlama (OOP) kullanırken, abstraction önemlidir çünkü kodlarınızın daha anlaşılır ve yönetilebilir olmasını sağlar. Özellikle büyük projelerde ve takım çalışmalarında, abstraction sayesinde kodlama süreçleri daha hızlı ve verimli hale gelebilir. Aynı zamanda, kodunuzun yeniden kullanılabilirliğini artırarak, gelecekteki geliştirmelerde de faydalı olabilir.
Abstraction, aynı zamanda modüler programlama teknikleri ile birlikte kullanıldığında da son derece etkilidir. Özellikle, bir proje için birçok farklı nesne oluştururken, her bir nesnenin soyutlamasını yaparak, daha kolay bir şekilde yönetebilirsiniz.
Sonuç olarak, abstraction, OOP dünyasında önemli bir prensiptir ve kod yönetimi, yeniden kullanılabilirlik ve takım çalışması açısından son derece faydalıdır. Doğru kullanıldığında, kodlarınızın daha anlaşılır ve yönetilebilir olmasını sağlar.
Encapsulation (Kapsülleme)
Encapsulation, nesne yönelimli programlama (OOP) prensiplerinden biridir ve bir nesnenin birleşik bir yapıda özetlenmesini ifade eder. Bu yapıya, anahtar kelimelerle erişilebilir ve girdi çıktı parametreleri ile kullanılabilir. Örneğin bir araba nesnesinde, arabanın markası, yılı, rengi, modeli vb. verileri kapsülleme yöntemiyle saklanır. Bu verilerin değiştirilebilmesi için bir araba sınıfının nesnesine belirli bir yöntemle erişmek gerekmektedir.
Encapsulation, bilgi gizleme denen bir diğer OOP prensibiyle birlikte kullanılır. Nesnenin bir kısmının diğer kısımlarca kullanılması istenmiyorsa, bilgi gizleme ile bu kısımlar saklanabilir. Bu sayede nesnenin iç yapısı, dışarıdan müdahale edilemeyecek şekilde korunur. Örneğin, bir banka hesabı nesnesinde hesap numarası, şifre, bakiye gibi bilgiler gizli tutulabilir.
Encapsulation, OOP uygulamalarının tutarlılığını sağlar ve değişikliklerin olumsuz etkilerini azaltır. Nesne yönelimli programlamada her bir nesne, birçok diğer nesne ile ilişki içinde olabilir. Bu ilişki sırasında nesnelerin birbirleriyle etkileşimleri, nesnenin iç yapısını değiştirmeden yapılır. Bu sayede, kodun bakımı daha kolay hale gelir ve hatalı etkileşimler en aza indirgenir.
Sonuç olarak, Encapsulation OOP prensiplerinden biridir ve bir nesnenin iç yapısını koruyarak tutarlılığı sağlar. Bilgi gizleme ile birlikte kullanıldığında nesnenin iç yapısı sadece belirli yöntemler ile değiştirilebilir ve böylece hatalı etkileşimlerin önüne geçilir.