Yazılım projeleri büyüdükçe kodların okunması, geliştirilmesi ve yönetilmesi zorlaşabilir. Bir uygulamaya yeni özellik eklemek, mevcut bir hatayı düzeltmek veya aynı kodu farklı bölümlerde kullanmak karmaşık bir sürece dönüşebilir. Nesne yönelimli programlama, bu karmaşıklığı azaltmak ve yazılımı daha düzenli bileşenler hâlinde geliştirmek için kullanılan programlama yaklaşımıdır.

İngilizcede Object-Oriented Programming olarak adlandırılan bu yaklaşım, yaygın biçimde OOP kısaltmasıyla ifade edilir.

OOP yaklaşımında yazılım; yalnızca arka arkaya çalışan komutlardan oluşan bir yapı olarak görülmez. Gerçek hayattaki varlıkları temsil eden nesneler, bu nesnelerin özellikleri ve gerçekleştirebildiği işlemler üzerinden modellenir.

Örneğin bir e-ticaret uygulamasında şu yapılar ayrı nesneler olarak düşünülebilir:

  • Müşteri
  • Ürün
  • Sepet
  • Sipariş
  • Ödeme
  • Kargo
  • İndirim kuponu

Bir Ürün nesnesinin adı, fiyatı, stok miktarı ve kategorisi olabilir. Aynı nesne; stok azaltma, fiyat güncelleme veya indirim hesaplama gibi işlemler gerçekleştirebilir.

Nesne yönelimli programlamanın temel amaçları şunlardır:

  • Kodları daha düzenli hâle getirmek
  • Tekrar eden kodları azaltmak
  • Büyük projeleri yönetilebilir parçalara ayırmak
  • Kodların yeniden kullanılmasını sağlamak
  • Bakım ve güncelleme süreçlerini kolaylaştırmak
  • Yazılım bileşenleri arasındaki sorumlulukları ayırmak
  • Ekiplerin aynı proje üzerinde daha rahat çalışmasını sağlamak
  • Gerçek dünya problemlerini yazılım içerisinde modellemek

OOP yalnızca bir kod yazma tekniği değildir. Yazılımın nasıl tasarlanacağını, bileşenlerin birbirleriyle nasıl iletişim kuracağını ve sorumlulukların nasıl dağıtılacağını belirleyen bir yaklaşımdır.

Nesne Yönelimli Programlama Nedir?

Nesne yönelimli programlama, yazılımın sınıflar ve bu sınıflardan oluşturulan nesneler etrafında tasarlandığı programlama paradigmasıdır.

Bir nesne genel olarak iki temel unsurdan oluşur:

  • Özellikler: Nesnenin sahip olduğu veriler
  • Metotlar: Nesnenin gerçekleştirebildiği işlemler

Örneğin bir otomobil nesnesini ele alalım.

Otomobilin özellikleri:

  • Marka
  • Model
  • Renk
  • Hız
  • Yakıt miktarı

Otomobilin metotları:

  • Çalıştır
  • Hızlan
  • Fren yap
  • Yakıt doldur
  • Motoru durdur

Bu model yazılıma aktarıldığında otomobille ilgili veriler ve işlemler aynı yapı içerisinde bir araya getirilir.

OOP Açılımı Nedir?

OOP Açılımı Nedir?

OOP, “Object-Oriented Programming” ifadesinin kısaltmasıdır.

Türkçe karşılıkları şunlardır:

  • Nesne yönelimli programlama
  • Nesneye yönelik programlama
  • Nesne tabanlı programlama

Teknik kaynaklarda en yaygın kullanım nesne yönelimli programlama şeklindedir.

Programlama Paradigması Ne Demek?

Programlama paradigması, yazılım problemlerine nasıl yaklaşılacağını ve kodların nasıl yapılandırılacağını belirleyen genel yöntemdir.

Yaygın programlama paradigmaları arasında şunlar bulunur:

  • Prosedürel programlama
  • Nesne yönelimli programlama
  • Fonksiyonel programlama
  • Mantıksal programlama
  • Olay güdümlü programlama
  • Bildirimsel programlama

Bir programlama dili birden fazla paradigmayı destekleyebilir. Örneğin Python ve JavaScript hem prosedürel hem de nesne yönelimli yaklaşımla kullanılabilir.

Yazılımların genel yapısının nasıl planlandığını anlamak için en çok kullanılan yazılım mimarileri de incelenebilir.

Nesne Nedir?

Nesne, belirli özelliklere ve davranışlara sahip yazılım bileşenidir.

Bir nesne, sınıf adı verilen şablondan oluşturulur.

Örneğin bir Müşteri nesnesi şu verilere sahip olabilir:

  • Ad
  • Soyad
  • E-posta
  • Telefon
  • Adres
  • Müşteri numarası

Müşteri nesnesinin gerçekleştirebildiği işlemler ise şunlar olabilir:

  • Giriş yapma
  • Adres güncelleme
  • Sipariş oluşturma
  • Şifre değiştirme
  • Hesabı kapatma

Her müşteri aynı sınıftan oluşturulmasına rağmen farklı verilere sahip olabilir.

NesneÖzellik örnekleriMetot örnekleri
MüşteriAd, e-posta, adresGiriş yap, sipariş ver
ÜrünAd, fiyat, stokStok azalt, fiyat güncelle
SiparişNumara, tutar, durumOnayla, iptal et
Banka hesabıBakiye, IBANPara yatır, para çek
ÇalışanAd, departman, maaşİzin kullan, görev güncelle

Sınıf Nedir?

Sınıf, aynı özelliklere ve davranışlara sahip nesnelerin oluşturulmasını sağlayan şablondur.

Örneğin bir otomobil fabrikasında aynı model otomobiller belirli bir üretim planına göre üretilir. Sınıf bu üretim planına, nesneler ise üretilen otomobillere benzetilebilir.

Basit bir sınıf örneği:

class Urun:
    def __init__(self, ad, fiyat, stok):
        self.ad = ad
        self.fiyat = fiyat
        self.stok = stok

    def stok_azalt(self, miktar):
        self.stok -= miktar

Bu sınıftan nesne oluşturulabilir:

telefon = Urun("Akıllı Telefon", 25000, 15)
kulaklik = Urun("Kablosuz Kulaklık", 3000, 40)

Burada:

  • Urun, sınıftır.
  • telefon ve kulaklik, nesnelerdir.
  • ad, fiyat ve stok, özelliklerdir.
  • stok_azalt, metottur.

Sınıf ile Nesne Arasındaki Fark Nedir?

KriterSınıfNesne
TanımNesnelerin oluşturulduğu şablonSınıftan oluşturulan örnek
AmaçOrtak özellik ve davranışları tanımlamakGerçek verilerle çalışmak
Bellek kullanımıTanım olarak bulunurOluşturulduğunda veri taşır
ÖrnekOtomobil sınıfıKırmızı bir otomobil
AdetGenellikle bir kez tanımlanırÇok sayıda oluşturulabilir
VeriGenel yapıKendine özgü değerler

Aynı sınıftan farklı özelliklere sahip çok sayıda nesne oluşturulabilir.

Özellik Nedir?

Özellik, bir nesnenin sahip olduğu veriyi ifade eder. Programlama dillerinde attribute, field veya property gibi terimlerle karşılaşılabilir.

Bir çalışan nesnesinin özellikleri şu şekilde olabilir:

  • Ad
  • Soyad
  • Departman
  • Maaş
  • İşe giriş tarihi
  • Çalışan numarası

Özellikler nesnenin mevcut durumunu temsil eder.

Metot Nedir?

Metot, bir sınıfa veya nesneye ait fonksiyondur.

Metotlar nesnenin gerçekleştirebildiği işlemleri tanımlar.

Çalışan nesnesi için metot örnekleri:

  • Maaş güncelle
  • Departman değiştir
  • İzin oluştur
  • Mesai kaydet
  • Bilgileri göster

Metotlar, nesnenin verileri üzerinde işlem yapabilir.

Constructor Yapıcı Metot Nedir?

Constructor, bir nesne oluşturulurken çalışan ve nesnenin başlangıç değerlerini belirleyen özel metottur. Türkçede yapıcı metot olarak adlandırılır.

Python örneğinde __init__ metodu yapıcı metottur:

class Kullanici:
    def __init__(self, ad, email):
        self.ad = ad
        self.email = email

Nesne oluşturulduğunda başlangıç değerleri gönderilir:

kullanici = Kullanici("Ayşe", "ayse@example.com")

Farklı programlama dillerinde constructor söz dizimi değişebilir.

Nesne Yönelimli Programlamanın Temel İlkeleri Nelerdir?

Nesne yönelimli programlama dört temel ilke üzerine kuruludur:

  • Kapsülleme
  • Kalıtım
  • Çok biçimlilik
  • Soyutlama

Bu ilkeler, yazılım bileşenlerinin daha güvenli, düzenli ve yeniden kullanılabilir biçimde geliştirilmesine yardımcı olur.

Kapsülleme Nedir?

Kapsülleme, bir nesnenin verileriyle bu veriler üzerinde çalışan metotların aynı yapı içerisinde toplanması ve verilere erişimin kontrol edilmesidir.

Kapsüllemenin temel amacı, nesnenin iç yapısının dışarıdan kontrolsüz biçimde değiştirilmesini önlemektir.

Örneğin bir banka hesabının bakiyesi doğrudan dışarıdan değiştirilmemelidir.

Yanlış yaklaşım:

hesap.bakiye = -500000

Bunun yerine para yatırma ve çekme işlemleri metotlarla kontrol edilebilir:

class BankaHesabi:
    def __init__(self, bakiye):
        self.__bakiye = bakiye

    def para_yatir(self, tutar):
        if tutar > 0:
            self.__bakiye += tutar

    def para_cek(self, tutar):
        if 0 < tutar <= self.__bakiye:
            self.__bakiye -= tutar

Bu yapıda bakiye, belirlenen kurallar dışında değiştirilemez.

Kapsüllemenin Faydaları

  • Veriyi kontrolsüz değişikliklerden korur.
  • Nesnenin iç yapısını gizler.
  • Hatalı veri girişlerini azaltır.
  • Kodun bakımını kolaylaştırır.
  • Güvenlik kontrollerini merkezi hâle getirir.
  • Sınıflar arasındaki bağımlılığı azaltabilir.

Kalıtım Nedir?

Kalıtım, bir sınıfın başka bir sınıfın özelliklerini ve metotlarını devralmasıdır.

Ortak özellikler üst sınıfta tanımlanır. Alt sınıflar bu özellikleri kullanabilir veya kendilerine özgü davranışlar ekleyebilir.

Örneğin:

  • Çalışan
    • Yazılımcı
    • Tasarımcı
    • Muhasebeci
    • Satış uzmanı

Bütün çalışanların adı, maaşı ve departmanı olabilir. Ancak yazılımcının programlama dili, satış uzmanının satış hedefi gibi farklı özellikleri bulunabilir.

class Calisan:
    def __init__(self, ad, maas):
        self.ad = ad
        self.maas = maas

    def bilgi_goster(self):
        return f"{self.ad} - {self.maas}"

class Yazilimci(Calisan):
    def __init__(self, ad, maas, dil):
        super().__init__(ad, maas)
        self.dil = dil

Burada Yazilimci sınıfı, Calisan sınıfından kalıtım alır.

Kalıtımın Faydaları

  • Tekrar eden kodları azaltır.
  • Ortak özellikleri merkezi hâle getirir.
  • Yeni sınıfların daha hızlı oluşturulmasını sağlar.
  • Sınıflar arasında hiyerarşi kurar.
  • Kod bakımını kolaylaştırabilir.

Kalıtımın Riskleri

Kalıtım gereğinden fazla kullanılırsa:

  • Karmaşık sınıf hiyerarşileri oluşabilir.
  • Alt sınıflar üst sınıfa aşırı bağımlı olabilir.
  • Küçük değişiklikler birçok sınıfı etkileyebilir.
  • Kodun anlaşılması zorlaşabilir.

Her ortak özellik için kalıtım kullanılmamalıdır. Bazı durumlarda bileşim, yani composition yaklaşımı daha uygun olabilir.

Çok Biçimlilik Nedir?

Çok biçimlilik, aynı isimdeki metodun farklı sınıflarda farklı biçimde çalışabilmesidir. İngilizcede polymorphism olarak adlandırılır.

Örneğin farklı ödeme yöntemlerinin hepsinde odeme_yap() metodu bulunabilir.

class KrediKarti:
    def odeme_yap(self, tutar):
        return f"Kredi kartıyla {tutar} TL ödendi."

class Havale:
    def odeme_yap(self, tutar):
        return f"Havale ile {tutar} TL ödendi."

Her iki sınıfta da aynı metot adı kullanılmasına rağmen işlem biçimi farklıdır.

Çok Biçimliliğin Faydaları

  • Ortak arayüz kullanımını sağlar.
  • Kodun genişletilmesini kolaylaştırır.
  • Farklı nesnelerin aynı yapı üzerinden yönetilmesini sağlar.
  • Koşul ifadelerinin azalmasına yardımcı olabilir.
  • Yeni sınıfların sisteme eklenmesini kolaylaştırır.

Soyutlama Nedir?

Soyutlama, karmaşık bir sistemin yalnızca gerekli özelliklerinin kullanıcıya gösterilmesi, iç ayrıntılarının ise gizlenmesidir.

Bir otomobili kullanan kişinin motorun içindeki bütün mekanik işlemleri bilmesine gerek yoktur. Sürücü:

  • Direksiyonu
  • Gaz pedalını
  • Freni
  • Vitesi

kullanarak otomobili kontrol eder.

Yazılımda da kullanıcı veya başka sınıflar yalnızca gerekli arayüzle etkileşim kurar. İçerideki karmaşık işlemler gizlenir.

Soyutlama ile Kapsülleme Arasındaki Fark

KriterSoyutlamaKapsülleme
Temel amaçGereksiz ayrıntıları gizlemekVeriye erişimi kontrol etmek
OdakNe yapılabildiğiVerinin nasıl korunduğu
ÖrnekÖdeme yap arayüzüKart bilgilerinin özel tutulması
KullanımArayüz ve soyut sınıflarErişim belirleyiciler ve metotlar
SonuçKarmaşıklık azalırVeri güvenliği ve bütünlüğü artar

Abstraction ile Interface İlişkisi

Bazı programlama dillerinde interface, sınıfların uygulaması gereken metotları tanımlayan sözleşme yapısıdır.

Örneğin bütün ödeme sınıflarının odeme_yap() metoduna sahip olması gerektiği belirtilebilir.

Interface, metodun nasıl çalışacağını değil hangi metodun bulunması gerektiğini tanımlar. Böylece farklı sınıflar ortak bir yapı üzerinden kullanılabilir.

Encapsulation, Inheritance, Polymorphism ve Abstraction Karşılaştırması

İlkeTürkçesiTemel amaçÖrnek
EncapsulationKapsüllemeVeriyi korumak ve erişimi yönetmekBakiyeyi özel tutmak
InheritanceKalıtımOrtak özellikleri devralmakYazılımcının çalışan sınıfından türemesi
PolymorphismÇok biçimlilikAynı arayüzle farklı davranış sunmakFarklı ödeme yöntemleri
AbstractionSoyutlamaKarmaşık ayrıntıları gizlemekÖdeme servisinin iç işlemlerini saklamak

Nesne Yönelimli Programlama Nasıl Çalışır?

OOP ile bir uygulama geliştirilirken genel olarak şu adımlar izlenebilir:

  • Sistemdeki temel varlıklar belirlenir.
  • Bu varlıkların özellikleri tanımlanır.
  • Gerçekleştirecekleri işlemler belirlenir.
  • Sınıflar arasındaki ilişkiler planlanır.
  • Sınıflardan nesneler oluşturulur.
  • Nesnelerin birbirleriyle iletişim kurması sağlanır.
  • Ortak davranışlar soyutlanır.
  • Verilere erişim sınırlandırılır.
  • Kod test edilir ve geliştirilir.

Örneğin bir e-ticaret sistemi şu sınıflardan oluşabilir:

SınıfSorumluluk
UrunFiyat, stok ve ürün bilgilerini yönetmek
MusteriKullanıcı bilgilerini ve adresleri yönetmek
SepetSepetteki ürünleri ve toplam tutarı hesaplamak
SiparisSipariş durumunu ve ürünleri yönetmek
OdemeÖdeme sürecini gerçekleştirmek
KargoGönderi ve takip bilgilerini yönetmek
Kuponİndirim kurallarını uygulamak

Her sınıfın belirli bir sorumluluğa sahip olması kodun daha düzenli olmasını sağlar.

Nesneler Arasındaki İlişkiler Nelerdir?

OOP içerisinde sınıflar arasında farklı ilişki türleri kurulabilir.

Association Nedir?

Association, iki sınıfın birbiriyle bağlantılı olmasıdır.

Örnek:

  • Müşteri sipariş oluşturur.
  • Doktor hastayı muayene eder.
  • Öğretmen öğrenciye ders verir.

İki nesne birbirinden bağımsız olarak varlığını sürdürebilir.

Aggregation Nedir?

Aggregation, bir nesnenin başka nesneleri içermesi ancak bu nesnelerin bağımsız olarak var olabilmesidir.

Örnek:

Bir departmanda çalışanlar bulunur. Departman kapatılsa bile çalışanlar var olmaya devam edebilir.

Composition Nedir?

Composition, bir nesnenin başka nesnelerden oluştuğu ve alt nesnelerin ana nesne olmadan anlamlı biçimde varlığını sürdüremediği ilişkidir.

Örnek:

Bir sipariş, sipariş kalemlerinden oluşur. Sipariş silindiğinde ilgili sipariş kalemleri de anlamını kaybedebilir.

İlişki Türleri Karşılaştırması

İlişkiBağlılık seviyesiÖrnek
AssociationGenel bağlantıÖğretmen ve öğrenci
AggregationZayıf bütün-parça ilişkisiDepartman ve çalışan
CompositionGüçlü bütün-parça ilişkisiSipariş ve sipariş kalemi
InheritanceTür hiyerarşisiÇalışan ve yazılımcı

OOP ile Prosedürel Programlama Arasındaki Fark

Prosedürel programlama, programın fonksiyonlar ve işlem adımları etrafında yapılandırıldığı yaklaşımdır. OOP ise veri ve davranışı nesneler içerisinde bir araya getirir.

KriterNesne yönelimli programlamaProsedürel programlama
Temel yapıSınıf ve nesneFonksiyon ve prosedür
OdakVeri ve davranışİşlem adımları
Veri yönetimiNesneler içinde tutulurFonksiyonlar arasında aktarılabilir
Tekrar kullanımKalıtım ve bileşim kullanılabilirFonksiyonlar yeniden kullanılabilir
Büyük projelerDüzenli tasarlanırsa uygundurKarmaşıklık artabilir
Öğrenme süreciDaha fazla kavram içerirBaşlangıçta daha kolay olabilir
BakımModüler yapı sayesinde kolaylaşabilirYapıya göre zorlaşabilir
Örnek dillerJava, C#, PythonC, Pascal ve diğerleri

Küçük ve doğrusal işlemlerde prosedürel yaklaşım daha sade olabilir. Büyük ve sürekli gelişen projelerde nesne yönelimli tasarım avantaj sağlayabilir.

OOP ile Fonksiyonel Programlama Arasındaki Fark

Fonksiyonel programlama, yazılımı saf fonksiyonlar ve değişmeyen veriler etrafında tasarlamaya odaklanır.

KriterOOPFonksiyonel programlama
Temel birimNesneFonksiyon
Veri durumuNesne içinde değişebilirDeğişmez veri tercih edilir
DavranışMetotlarla tanımlanırFonksiyonlarla tanımlanır
Yan etkiKullanılabilirAzaltılmaya çalışılır
ModellemeGerçek dünya varlıklarıVeri dönüşümleri
Uygun alanİş uygulamaları ve büyük sistemlerVeri işleme ve eş zamanlı işlemler

Modern yazılımlarda iki yaklaşım birlikte kullanılabilir.

OOP ile Nesne Tabanlı Programlama Arasındaki Fark

Nesne tabanlı programlama sınıf ve nesne kullanımını destekleyebilir ancak OOP’nin bütün ilkelerini sunmayabilir.

Özellikle kalıtım ve çok biçimlilik desteğinin sınırlı olması, nesne tabanlı yaklaşımı tam nesne yönelimli programlamadan ayırabilir.

Nesne Yönelimli Programlamanın Avantajları Nelerdir?

Kodların Yeniden Kullanılmasını Sağlar

Sınıflar farklı projelerde veya uygulamanın farklı bölümlerinde tekrar kullanılabilir.

Kod Tekrarını Azaltır

Ortak özellikler üst sınıflarda veya yeniden kullanılabilir bileşenlerde toplanabilir.

Büyük Projeleri Yönetilebilir Hâle Getirir

Uygulama daha küçük sınıf ve nesnelere ayrıldığı için karmaşıklık kontrol edilebilir.

Bakım Sürecini Kolaylaştırır

Belirli işlemler ilgili sınıf içerisinde bulunduğu için hata ve güncellemeler daha kolay yönetilebilir.

Takım Çalışmasını Destekler

Farklı geliştiriciler ayrı sınıf ve modüller üzerinde çalışabilir.

Yazılım projelerinde farklı uzmanlıkların birlikte çalışması gerektiğinde multidisipliner ekip yapıları önemli hâle gelir.

Veri Güvenliğini Artırabilir

Kapsülleme sayesinde nesne içerisindeki verilere erişim kontrol edilebilir.

Sistemin Genişletilmesini Kolaylaştırır

Yeni özellikler mevcut yapıyı tamamen değiştirmeden eklenebilir.

Gerçek Dünya Modellemesini Kolaylaştırır

Müşteri, sipariş, ürün ve çalışan gibi gerçek varlıklar sınıflarla temsil edilebilir.

Nesne Yönelimli Programlamanın Dezavantajları Nelerdir?

Öğrenme Süreci Daha Uzun Olabilir

Sınıf, nesne, kalıtım, arayüz ve çok biçimlilik gibi kavramların anlaşılması gerekir.

Küçük Projelerde Gereksiz Karmaşıklık Oluşturabilir

Basit bir işlem için çok sayıda sınıf oluşturmak geliştirme süresini artırabilir.

Yanlış Tasarım Bağımlılığı Artırabilir

Sınıflar birbirine aşırı bağımlı hâle geldiğinde değişiklik yapmak zorlaşır.

Fazla Kalıtım Karmaşık Yapı Oluşturabilir

Derin sınıf hiyerarşileri kodun anlaşılmasını zorlaştırabilir.

Bellek ve İşlem Yükü Oluşturabilir

Çok sayıda nesne ve soyutlama bazı uygulamalarda ek kaynak kullanabilir.

Başlangıç Planlaması Gerektirir

Sınıflar ve sorumluluklar iyi tasarlanmazsa proje büyüdükçe yapı bozulabilir.

OOP Hangi Programlama Dillerinde Kullanılır?

Nesne yönelimli programlamayı destekleyen yaygın diller şunlardır:

  • Java
  • C++
  • C#
  • Python
  • PHP
  • Ruby
  • Swift
  • Kotlin
  • JavaScript
  • TypeScript
  • Dart
Programlama diliOOP desteğiYaygın kullanım
JavaGüçlüKurumsal yazılım ve Android
C++GüçlüSistem, oyun ve masaüstü
C#Güçlü.NET ve oyun geliştirme
PythonEsnekWeb, veri bilimi ve otomasyon
PHPDesteklerWeb uygulamaları
JavaScriptPrototip tabanlıWeb arayüzleri ve sunucu
DartGüçlüFlutter uygulamaları
SwiftGüçlüiOS ve macOS uygulamaları

Mobil uygulama geliştirme süreçlerinde nesne yönelimli Dart dilini kullanan Flutter tercih edilebilir.

JavaScript Nesne Yönelimli Bir Dil midir?

JavaScript, klasik sınıf tabanlı dillerden farklı olarak prototip tabanlı nesne modeline sahiptir. Modern JavaScript sürümlerinde class söz dizimi bulunur ancak bu yapı temelde prototip sistemi üzerinde çalışır.

class Urun {
    constructor(ad, fiyat) {
        this.ad = ad;
        this.fiyat = fiyat;
    }

    bilgiGoster() {
        return `${this.ad}: ${this.fiyat} TL`;
    }
}

JavaScript ile web sayfası etkileşimleri geliştirirken kullanılan jQuery de JavaScript tabanlı bir kütüphanedir.

OOP Web Geliştirmede Nasıl Kullanılır?

Web uygulamalarında nesne yönelimli programlama şu alanlarda kullanılabilir:

  • Kullanıcı yönetimi
  • Ürün ve kategori sistemleri
  • Sipariş işlemleri
  • Ödeme servisleri
  • Yetkilendirme
  • Form doğrulama
  • İçerik yönetimi
  • API servisleri
  • Raporlama
  • Bildirim sistemleri

Örneğin bir içerik yönetim sisteminde:

  • Yazı
  • Kategori
  • Kullanıcı
  • Yorum
  • Etiket

sınıfları oluşturulabilir.

Web projelerinin kullanıcı arayüzü, yazılım altyapısı ve içerik yapısı birlikte profesyonel web tasarım sürecinde planlanmalıdır.

OOP Mobil Uygulamalarda Nasıl Kullanılır?

Mobil uygulamalarda:

  • Kullanıcı
  • Ekran
  • Bildirim
  • Sipariş
  • Mesaj
  • Konum
  • Ödeme

gibi yapılar sınıf ve nesnelerle modellenebilir.

Nesne yönelimli tasarım, farklı ekran ve servislerin sorumluluklarını ayırarak uygulamanın bakımını kolaylaştırabilir.

Web teknolojileriyle uygulama benzeri deneyimler sunan Progressive Web Apps projelerinde de JavaScript tabanlı nesne yapıları kullanılabilir.

OOP ve Mikroservis Mimarisi Aynı Şey mi?

Hayır. OOP bir programlama paradigması, mikroservis ise bir yazılım mimarisi yaklaşımıdır.

KriterOOPMikroservis
TürüProgramlama paradigmasıSistem mimarisi
OdakKod içerisindeki sınıf ve nesnelerBağımsız servisler
KapsamUygulama koduBütün sistem
İletişimNesne ve metot çağrılarıAPI ve mesajlaşma
AmaçKod düzeni ve yeniden kullanımServislerin bağımsız geliştirilmesi

Bir mikroservisin kendi içerisindeki kodlar OOP yaklaşımıyla geliştirilebilir. Detaylı sistem yapısı için microservice mimarisi incelenebilir.

SOLID Prensipleri Nedir?

SOLID, nesne yönelimli yazılım tasarımında daha sürdürülebilir kodlar oluşturmak için kullanılan beş temel prensibin baş harflerinden oluşur.

HarfPrensipTemel anlam
SSingle ResponsibilityBir sınıfın tek temel sorumluluğu olmalı
OOpen/ClosedGenişlemeye açık, değişikliğe kapalı olmalı
LLiskov SubstitutionAlt sınıflar üst sınıfın yerine kullanılabilmeli
IInterface SegregationBüyük arayüzler küçük parçalara ayrılmalı
DDependency InversionSomut sınıflar yerine soyutlamalara bağımlı olunmalı

Tek Sorumluluk Prensibi

Bir sınıfın değişmesi için yalnızca tek temel nedeni olmalıdır.

Örneğin Sipariş sınıfı:

  • Sipariş toplamını hesaplayabilir.
  • Sipariş durumunu yönetebilir.

Ancak aynı sınıfın:

  • E-posta göndermesi
  • PDF fatura oluşturması
  • Veri tabanı bağlantısı kurması

sorumlulukların gereğinden fazla birleşmesine neden olabilir.

Open Closed Prensibi

Sınıflar yeni davranışlarla genişletilebilmeli ancak mevcut çalışan kod sürekli değiştirilmemelidir.

Bu yaklaşım yeni ödeme yöntemlerinin sisteme mevcut yapıyı bozmadan eklenmesini kolaylaştırabilir.

Dependency Injection Nedir?

Dependency Injection, bir sınıfın ihtiyaç duyduğu bağımlılıkları kendi içerisinde oluşturmak yerine dışarıdan almasıdır.

Örneğin SiparişServisi sınıfının e-posta servisini doğrudan oluşturması yerine dışarıdan alması test ve değişiklik süreçlerini kolaylaştırabilir.

Bu yaklaşım:

  • Sınıflar arasındaki bağımlılığı azaltır.
  • Test yazmayı kolaylaştırır.
  • Servis değişikliklerini kolaylaştırır.
  • Kodun esnekliğini artırır.

OOP Tasarım Kalıpları Nelerdir?

Tasarım kalıpları, yazılım geliştirmede tekrar eden sorunlara yönelik genel çözüm yaklaşımlarıdır.

Yaygın tasarım kalıpları:

  • Singleton
  • Factory
  • Builder
  • Strategy
  • Observer
  • Adapter
  • Decorator
  • Repository
  • Command

Tasarım kalıpları doğrudan kopyalanacak kodlar değil, belirli problemlere uygulanabilecek tasarım fikirleridir.

Nesne Yönelimli Programlama Örneği

Bir e-ticaret sepeti için basitleştirilmiş Python örneği:

class Urun:
    def __init__(self, ad, fiyat):
        self.ad = ad
        self.fiyat = fiyat


class Sepet:
    def __init__(self):
        self.urunler = []

    def urun_ekle(self, urun):
        self.urunler.append(urun)

    def toplam_hesapla(self):
        return sum(urun.fiyat for urun in self.urunler)


telefon = Urun("Telefon", 25000)
kulaklik = Urun("Kulaklık", 3000)

sepet = Sepet()
sepet.urun_ekle(telefon)
sepet.urun_ekle(kulaklik)

print(sepet.toplam_hesapla())

Bu örnekte:

  • Urun sınıfı ürün verilerini temsil eder.
  • Sepet sınıfı ürünleri ve toplam hesaplama işlemini yönetir.
  • Telefon ve kulaklık, Ürün sınıfından oluşturulan nesnelerdir.
  • Sepet nesnesi ürün nesnelerini içerisinde tutar.

İyi Bir OOP Tasarımı Nasıl Olmalıdır?

Her Sınıfa Açık Bir Sorumluluk Verin

Bir sınıf gereğinden fazla işlem yapmamalıdır.

Sınıflar Arasındaki Bağımlılığı Azaltın

Bir sınıftaki değişiklik bütün sistemi etkilememelidir.

Kalıtım Yerine Bileşimi Değerlendirin

“Bir türüdür” ilişkisi yoksa kalıtım kullanılmamalıdır.

Örneğin otomobil bir motor türü değildir; otomobilin motoru vardır. Bu nedenle bileşim daha uygundur.

Küçük ve Anlaşılır Metotlar Yazın

Bir metot çok sayıda farklı işlem gerçekleştirmemelidir.

Anlamlı İsimler Kullanın

Sınıf ve metot isimleri sorumluluklarını açıkça göstermelidir.

Gereksiz Soyutlama Yapmayın

Gelecekte belki kullanılacak özellikler için aşırı karmaşık sınıf yapıları oluşturulmamalıdır.

Test Edilebilir Kod Yazın

Sınıfların bağımlılıkları ve sorumlulukları test yazmayı kolaylaştıracak biçimde düzenlenmelidir.

OOP Kullanırken Yapılan Hatalar

  • Her işlem için gereksiz sınıf oluşturmak
  • Çok büyük sınıflar hazırlamak
  • Bir sınıfa birden fazla sorumluluk vermek
  • Kalıtımı gereğinden fazla kullanmak
  • Verileri tamamen herkese açık bırakmak
  • Sınıflar arasında aşırı bağımlılık oluşturmak
  • Nesne yönelimli tasarımı yalnızca söz dizimi sanmak
  • Çok uzun metotlar yazmak
  • Aynı kodu farklı sınıflarda tekrarlamak
  • Interface ve soyut sınıfları gereksiz kullanmak
  • Gerçek ihtiyaç oluşmadan tasarım kalıbı eklemek
  • Test yazmayı ihmal etmek
  • Hata yönetimini sınıflar arasında dağıtmak
  • Sınıf isimlerini belirsiz seçmek
  • Kodun bakım maliyetini düşünmemek

OOP Ne Zaman Kullanılmalıdır?

Nesne yönelimli programlama şu durumlarda yararlı olabilir:

  • Proje büyük ve sürekli gelişiyorsa
  • Çok sayıda veri modeli bulunuyorsa
  • Kodların yeniden kullanılması gerekiyorsa
  • Birden fazla geliştirici çalışıyorsa
  • Sistem farklı modüllerden oluşuyorsa
  • Bakım ve test önemliyse
  • Gerçek dünya varlıkları modelleniyorsa
  • Uygulamanın uzun süre kullanılması planlanıyorsa

Şu durumlarda daha basit yaklaşımlar tercih edilebilir:

  • Program çok küçükse
  • Tek seferlik betik hazırlanıyorsa
  • İşlem yalnızca birkaç adımdan oluşuyorsa
  • Yoğun veri dönüşümü yapılıyorsa
  • OOP ek karmaşıklık dışında değer sağlamıyorsa

OOP Öğrenmek İçin Neler Bilinmelidir?

Nesne yönelimli programlamaya başlamadan önce şu temel konular bilinmelidir:

  • Değişkenler
  • Veri türleri
  • Koşullar
  • Döngüler
  • Fonksiyonlar
  • Diziler ve listeler
  • Hata yönetimi
  • Temel algoritma mantığı
  • Programlama dilinin söz dizimi

OOP öğrenirken şu sırayla ilerlenebilir:

  • Sınıf ve nesne
  • Özellik ve metot
  • Constructor
  • Erişim belirleyiciler
  • Kapsülleme
  • Kalıtım
  • Çok biçimlilik
  • Soyutlama
  • Interface
  • Composition
  • SOLID prensipleri
  • Tasarım kalıpları

OOP Öğrenme Örnek Projeleri

Başlangıç seviyesinde şu projeler geliştirilebilir:

  • Kütüphane yönetim sistemi
  • Öğrenci kayıt sistemi
  • Banka hesabı uygulaması
  • Ürün ve sepet sistemi
  • Araç kiralama uygulaması
  • Personel yönetimi
  • Otel rezervasyon sistemi
  • Basit oyun karakterleri
  • Görev takip uygulaması

Her projede gerçek varlıklar sınıflara ayrılarak özellik ve metotlar belirlenebilir.

Nesne Yönelimli Programlama Kontrol Listesi

Sınıf Tasarımı

  • Sınıfın tek ve açık bir sorumluluğu var mı?
  • Sınıf adı yaptığı işi anlatıyor mu?
  • Özellikler gerçekten bu sınıfa mı ait?
  • Metotlar gereğinden uzun mu?
  • Sınıf çok fazla bağımlılık içeriyor mu?
  • Aynı kod farklı sınıflarda tekrar ediyor mu?
  • Gereksiz kalıtım kullanılmış mı?
  • Bileşim daha uygun olabilir mi?

Kapsülleme

  • Hassas veriler dışarıdan doğrudan değiştirilebiliyor mu?
  • Veri doğrulaması metotlarda yapılıyor mu?
  • Erişim belirleyiciler doğru kullanılmış mı?
  • Nesnenin iç yapısı gereksiz biçimde dışarı açılmış mı?
  • Verinin geçerli durumda kalması sağlanıyor mu?
  • Setter metotları gereksiz mi?

Kalıtım ve Çok Biçimlilik

  • Gerçek bir “bir türüdür” ilişkisi var mı?
  • Alt sınıf üst sınıfın yerine kullanılabiliyor mu?
  • Sınıf hiyerarşisi gereğinden derin mi?
  • Ortak arayüz kullanılabilir mi?
  • Yeni sınıf eklemek mevcut kodu değiştiriyor mu?
  • Çok fazla koşul ifadesi bulunuyor mu?

Kod Kalitesi

  • Sınıf ve metot isimleri anlaşılır mı?
  • Kod tekrarları azaltıldı mı?
  • Hatalar uygun yerde yönetiliyor mu?
  • Testler yazıldı mı?
  • Bağımlılıklar dışarıdan verilebiliyor mu?
  • Gereksiz soyutlama bulunuyor mu?
  • Dokümantasyon yeterli mi?
  • Kod ekibin anlayabileceği sadelikte mi?

Nesne Yönelimli Programlama Hakkında Sıkça Sorulan Sorular

Nesne yönelimli programlama nedir?

Yazılımın sınıf ve nesneler etrafında tasarlandığı, veri ile davranışların aynı yapı içerisinde toplandığı programlama yaklaşımıdır.

OOP açılımı nedir?

Object-Oriented Programming ifadesinin kısaltmasıdır. Türkçesi nesne yönelimli programlamadır.

OOP ne işe yarar?

Büyük yazılım projelerini daha düzenli, yeniden kullanılabilir, geliştirilebilir ve yönetilebilir hâle getirmeye yardımcı olur.

Nesne nedir?

Bir sınıftan oluşturulan, kendine özgü veri ve davranışlara sahip yazılım bileşenidir.

Sınıf nedir?

Benzer özellik ve davranışlara sahip nesnelerin oluşturulduğu şablondur.

Sınıf ile nesne arasındaki fark nedir?

Sınıf genel yapıyı tanımlar, nesne ise bu sınıftan oluşturulan gerçek örnektir.

OOP’nin temel ilkeleri nelerdir?

Kapsülleme, kalıtım, çok biçimlilik ve soyutlamadır.

Kapsülleme nedir?

Verilerin ve bu veriler üzerinde çalışan metotların aynı sınıfta toplanması ve erişimin kontrol edilmesidir.

Kalıtım nedir?

Bir sınıfın başka bir sınıfın özellik ve metotlarını devralmasıdır.

Çok biçimlilik nedir?

Aynı metot veya arayüzün farklı sınıflarda farklı davranış göstermesidir.

Soyutlama nedir?

Karmaşık sistem ayrıntılarının gizlenerek yalnızca gerekli işlevlerin kullanıcıya sunulmasıdır.

Constructor nedir?

Nesne oluşturulurken çalışan ve başlangıç değerlerini belirleyen özel metottur.

Metot nedir?

Bir sınıfa veya nesneye ait olan ve belirli bir işlemi gerçekleştiren fonksiyondur.

Property nedir?

Bir nesnenin sahip olduğu veri veya özelliktir.

Interface nedir?

Sınıfların uygulaması gereken metotları tanımlayan sözleşme yapısıdır.

Composition nedir?

Bir nesnenin başka nesneleri içerisinde barındırarak oluşturulmasıdır.

OOP ile prosedürel programlama arasındaki fark nedir?

OOP sınıf ve nesnelere, prosedürel programlama ise fonksiyon ve işlem adımlarına odaklanır.

OOP ile fonksiyonel programlama arasındaki fark nedir?

OOP nesne ve durum yönetimine, fonksiyonel programlama veri dönüşümleri ve saf fonksiyonlara odaklanır.

OOP hangi dillerde kullanılır?

Java, C++, C#, Python, PHP, JavaScript, TypeScript, Swift, Kotlin ve Dart gibi birçok dilde kullanılabilir.

Python nesne yönelimli midir?

Evet. Python sınıf, nesne, kalıtım ve çok biçimlilik gibi OOP özelliklerini destekler.

Java tamamen nesne yönelimli midir?

Java büyük ölçüde nesne yönelimli tasarlanmıştır ancak primitive veri türleri gibi nesne olmayan yapılar da bulunur.

JavaScript nesne yönelimli midir?

JavaScript prototip tabanlı nesne modelini destekler. Modern sürümlerde sınıf söz dizimi de bulunur.

PHP nesne yönelimli midir?

Evet. PHP sınıf, nesne, interface, trait, kalıtım ve erişim belirleyiciler gibi OOP özelliklerini destekler.

OOP öğrenmek zor mu?

Temel programlama bilgisi olan kişiler düzenli örneklerle öğrenebilir. Soyutlama ve tasarım prensipleri başlangıçta zorlayıcı olabilir.

OOP her projede kullanılmalı mı?

Hayır. Küçük ve basit işlemlerde prosedürel veya fonksiyonel yaklaşımlar daha uygun olabilir.

OOP’nin avantajı nedir?

Kod tekrarını azaltabilir, modülerliği artırabilir ve büyük projelerin bakımını kolaylaştırabilir.

OOP’nin dezavantajı nedir?

Yanlış kullanıldığında gereksiz sınıflar, karmaşık hiyerarşiler ve yüksek bakım maliyeti oluşturabilir.

SOLID nedir?

Nesne yönelimli yazılım tasarımında sürdürülebilir ve esnek kod geliştirmeyi amaçlayan beş prensiptir.

Tasarım kalıbı nedir?

Yazılım geliştirmede tekrar eden problemlere yönelik genel çözüm yaklaşımıdır.

OOP web geliştirmede kullanılır mı?

Evet. Kullanıcı, ürün, sipariş, ödeme ve içerik gibi yapıların modellenmesinde kullanılabilir.

OOP mobil uygulamalarda kullanılır mı?

Evet. Android, iOS, Flutter ve diğer mobil geliştirme teknolojilerinde yaygın olarak kullanılır.

OOP mikroservis midir?

Hayır. OOP programlama paradigması, mikroservis ise yazılım mimarisidir. Birlikte kullanılabilirler.

OOP’yi Sadece Sınıf Yazmak Değil, Sorumlulukları Doğru Dağıtmak Olarak Değerlendirin

Nesne yönelimli programlama, yazılımları sınıf ve nesneler etrafında düzenleyen güçlü bir programlama yaklaşımıdır.

OOP sayesinde:

  • Gerçek dünya varlıkları modellenebilir.
  • Veri ve davranış aynı yapı içerisinde toplanabilir.
  • Kod tekrarları azaltılabilir.
  • Büyük projeler modüllere ayrılabilir.
  • Yeni özellikler daha kontrollü eklenebilir.
  • Ekip çalışması kolaylaştırılabilir.
  • Kodların test ve bakım süreçleri geliştirilebilir.

Ancak yalnızca sınıf oluşturmak bir yazılımı iyi nesne yönelimli hâle getirmez. Başarılı bir OOP tasarımı için:

  • Her sınıfa açık bir sorumluluk verilmeli
  • Veriler kapsüllenerek korunmalı
  • Kalıtım yalnızca uygun ilişkilerde kullanılmalı
  • Sınıflar arasındaki bağımlılık azaltılmalı
  • Bileşim ve arayüzlerden yararlanılmalı
  • Gereksiz soyutlamadan kaçınılmalı
  • Kodlar test edilebilir biçimde hazırlanmalı
  • SOLID prensipleri proje ihtiyacına göre uygulanmalıdır

OOP, her proje için zorunlu bir çözüm değildir. Küçük ve basit uygulamalarda daha sade programlama yöntemleri yeterli olabilir. Projenin büyüklüğü, ekip yapısı, bakım süresi ve teknik gereksinimleri değerlendirilerek uygun programlama yaklaşımı seçilmelidir.

Web sitesi, mobil uygulama ve kurumsal yazılım projelerinde kullanılacak dil ve mimari, yalnızca güncel teknolojilere göre değil; performans, güvenlik, ölçeklenebilirlik ve bakım hedeflerine göre belirlenmelidir.

Bu kararların deneyimli ekipler tarafından alınması, yazılımın uzun vadeli sürdürülebilirliğini güçlendirir. Kurumsal projeler geliştirilirken Ankara yazılım şirketleri gibi uzman hizmet sağlayıcıların teknik yetkinlikleri ve proje deneyimleri karşılaştırılabilir.