Merhaba, yeniliklerin peşinde koşanlar! TypeScript dünyasında nesne yönelimli programlamayı (OOP) keşfetmeye hazır mısınız? TypeScript ile OOP, kod yazmayı daha eğlenceli ve etkili hale getiriyor. Hem de bu yazıda sıkıcı teknik terimlere boğulmadan, basit ve anlaşılır bir şekilde OOP'nin temel prensiplerini inceleyeceğiz. Hazırsanız başlayalım! 🚀
OOP Nedir? 🎓
OOP, yani Nesne Yönelimli Programlama, yazılım geliştirmenin bir yolu. Aslında hayatımızda sıkça karşılaştığımız bir kavram. Örneğin, arabalar, telefonlar veya insanlar gibi nesneleri düşünün. Her nesnenin kendine ait özellikleri (properties) ve yapabileceği işler (methods) vardır. İşte OOP de yazılımda bu mantığı kullanır.
TypeScript ve OOP 💻
TypeScript, JavaScript'in üzerine inşa edilmiş ve statik tip kontrolü ekleyen bir dil. TypeScript'in sunduğu tip güvenliği ve güçlü OOP desteği sayesinde, kodlarımız daha sağlam ve okunabilir oluyor. Hadi şimdi, OOP'nin prensiplerini TypeScript ile nasıl kullanacağımıza bakalım.
1. Classes (Sınıflar) 🏫
Classes, nesnelerin planı gibidir. Bir sınıf, nesnenin özelliklerini ve davranışlarını tanımlar. Mesela, bir Araba sınıfı oluşturalım:
2. Inheritance (Kalıtım) 👪
Inheritance, bir sınıfın başka bir sınıftan özellik ve davranışları miras almasıdır. Mesela, ElektrikliAraba sınıfı Araba sınıfından miras alabilir:
3. Encapsulation (Kapsülleme) 🔒
Encapsulation, verilerin dışarıdan erişilmesini engellemek ve sadece belirli yöntemlerle erişilmesini sağlamaktır. TypeScript'te private ve protected anahtar kelimeleri ile kapsülleme yapabiliriz:
4. Polymorphism (Çok Biçimlilik) 🦸♂️
Polymorphism, aynı yöntem adının farklı sınıflarda farklı işlevler gerçekleştirebilmesidir. Örneğin:
5. Interfaces (Arabirimler) 📄
Interfaces, sınıfların belirli bir yapıya sahip olmasını sağlar ve kodun daha tutarlı olmasına yardımcı olur. Mesela, Ucan arayüzünü inceleyelim:
6. Abstraction (Soyutlama) 🔍
Abstraction, karmaşıklığı azaltmak ve sadece gerekli detayları ortaya çıkarmaktır. Soyut sınıflar (abstract classes) bu prensibi destekler:
7. Method Overloading (Metot Aşırı Yükleme) 🔄
Method overloading, aynı isimde birden fazla metot tanımlayarak farklı parametreler ile kullanılmasını sağlar:
9. Static Methods and Properties (Statik Metotlar ve Özellikler) ⚙️
Static methods and properties, sınıfın örneği olmadan doğrudan sınıf üzerinden erişilebilir:
10. Generics (Genel Tipler) 🧩
Generics, tip güvenliğini koruyarak kodun yeniden kullanılabilirliğini artırır:
11. Mixins (Karışımlar) 🎨
Mixins, birden fazla sınıfın özelliklerini ve metodlarını bir sınıfta birleştirmek için kullanılır. TypeScript'te mixins kullanarak sınıfları genişletebiliriz:
12. Decorators (Dekoratörler) 🎁
Decorators, sınıfları ve metotları değiştirmek için kullanılan özel türde fonksiyonlardır. TypeScript'te dekoratörlerle meta-veri ekleyebilir veya mevcut işlevselliği genişletebiliriz:
13. Namespaces (Ad Alanları) 🏷️
Namespaces, kodu modüllere ayırarak daha düzenli ve yönetilebilir hale getirir. TypeScript'te namespace kullanarak kodumuzu bölümlere ayırabiliriz:
14. Module Resolution (Modül Çözümlemesi) 🔍
TypeScript, modülleri çözümlemek ve dışa aktarılan fonksiyonlar, sınıflar veya değişkenler arasında bağlantı kurmak için çeşitli stratejiler sunar. Bu, büyük projelerde kodu organize etmek için önemlidir:
15. Advanced Types (İleri Seviye Tipler) 🧬
TypeScript, birleşim (union) ve kesişim (intersection) tipleri, mapped tipler ve conditional tipler gibi ileri seviye tip sistemleri sunar:
16. Type Guards (Tip Koruyucuları) 🛡️
Type guards, belirli bir tipte olup olmadığını kontrol eden fonksiyonlardır. Bu, kodun güvenli bir şekilde çalışmasını sağlar:
17. Conditional Types (Koşullu Tipler) 🛠️
Conditional types, bir tipin başka bir tipe bağlı olarak nasıl belirlendiğini tanımlar:
18. Decorator Factories (Dekoratör Fabrikaları) 🏭
Decorator factories, parametre kabul eden ve bir dekoratör fonksiyonu döndüren fonksiyonlardır. Bu, dekoratörleri daha dinamik hale getirir:
19. Reflect Metadata (Yansıma Meta Verisi) 📊
TypeScript, dekoratörlerle birlikte kullanılabilen yansıma (reflection) API'si sağlar. Bu, meta veri eklemeyi ve erişmeyi sağlar:
20. Async/Await ve Promises ile OOP 🚀
TypeScript, asenkron programlamayı async/await ve Promises ile destekler. Bu, özellikle asenkron işlemleri yönetmek için çok önemlidir:
21. Modular Structure (Modüler Yapı) 🏗️
Büyük projelerde kodun daha yönetilebilir olması için modüler yapı çok önemlidir. TypeScript'te kodu modüller halinde organize edebiliriz:
22. Unit Testing (Birim Testleri) 🧪
Kodun güvenilirliğini sağlamak için birim testleri yazmak önemlidir. TypeScript, birim testleri için jest gibi test araçları ile uyumludur:
23. Abstract Classes (Soyut Sınıflar) 🏛️
Abstract classes , temel işlevselliği tanımlar ancak kendileri doğrudan örneklenemez. Alt sınıflar, bu soyut sınıfı genişleterek somutlaştırır:
24. Access Modifiers (Erişim Belirleyiciler) 🔒
TypeScript'te erişim belirleyiciler (public, private, protected) kullanarak sınıf üyelerinin erişim seviyesini kontrol edebiliriz:
25. Polymorphism (Çok Biçimlilik) 🧩
Polymorphism, aynı metot ismi ile farklı işlevsellikler sunmamızı sağlar. Bu, alt sınıfların kendi özel davranışlarını tanımlayabilmesine olanak tanır:
26. Singleton Pattern (Tekil Örnek Deseni) 🏢
Singleton Pattern, bir sınıfın yalnızca bir örneğinin oluşturulmasını garanti eder ve bu örneğe global erişim sağlar:
27. Composition (Bileşim) 🧱
Composition, sınıflar arasında güçlü bir ilişki kurmak yerine, nesnelerin işlevselliğini birleştirerek daha esnek ve yeniden kullanılabilir kod yazmayı sağlar:
28. SOLID Prensipleri 🏗️
SOLID prensipleri, yazılım geliştirmede daha iyi tasarımlar yapmamıza yardımcı olan beş prensibi içerir: Single Responsibility, Open/Closed, Liskov Substitution, Interface Segregation, ve Dependency Inversion. Bu prensipleri uygulayarak daha sürdürülebilir ve esnek yazılımlar geliştirebiliriz:
Single Responsibility Principle (SRP): Bir sınıfın yalnızca bir nedeni olmalı, yani bir sınıf yalnızca bir sorumluluğa sahip olmalı.
Open/Closed Principle (OCP): Yazılımlar genişlemeye açık, ancak değişikliğe kapalı olmalıdır.
Liskov Substitution Principle (LSP): Türetilmiş sınıflar, türetildikleri sınıfın yerine geçebilmelidir.
Interface Segregation Principle (ISP): Bir sınıf, kullanmadığı metodları içeren arayüzlere bağımlı olmamalıdır.
Dependency Inversion Principle (DIP): Üst seviye modüller, alt seviye modüllere bağımlı olmamalı; her ikisi de soyutlamalara bağımlı olmalıdır.
TypeScript ile OOP'nin ne kadar geniş ve kapsamlı olabileceğini gördük. Temel prensiplerden ileri düzey konulara kadar birçok konuyu ele aldık. Bu makale, TypeScript ve OOP hakkında kapsamlı bir bilgi edinmenize yardımcı olmayı hedefliyor. Umarım bu yazı, projelerinizde OOP tekniklerini daha ileri seviyede kullanmanız için size ilham verir. Bu yazıda öğrendiklerimizi burada noktalıyoruz. Bir sonraki keşifte buluşmak üzere! 🖥️👨💻👩💻