December 1, 2025 (8mo ago) — last updated July 23, 2026 (26d ago)

OOP vs Fonksiyonel Programlama: Hangi Paradigma?

OOP ile fonksiyonel programlama arasındaki farkları, avantajları, dezavantajları ve kullanım senaryolarını örneklerle öğrenin.

← Back to blog
Cover Image for OOP vs Fonksiyonel Programlama: Hangi Paradigma?

Nesne yönelimli (OOP) ve fonksiyonel (FP) programlama arasındaki fark, karmaşıklığı, durumu ve veri akışını nasıl yönettiğinizle ilgilidir. Bu rehber iki paradigmayı karşılaştırır, pratik örneklerle avantajları ve dezavantajları gösterir ve hangi durumlarda hangi yaklaşımın daha uygun olduğunu açıkça anlatır.

OOP vs Fonksiyonel Programlama: Bir Geliştiricinin Rehberi

Özet: Nesne yönelimli programlama ile fonksiyonel yaklaşımlar arasındaki seçimleri, bunların avantajlarını, dezavantajlarını ve modern yazılım tasarımında her birini ne zaman uygulamanız gerektiğini keşfedin.

Giriş

Nesne yönelimli (OOP) ve fonksiyonel (FP) programlama arasındaki fark, ideolojiden çok karmaşıklık, durum ve veri akışını nasıl ele almak istediğinizle ilgilidir. Bu rehber iki yaklaşımı karşılaştırır, pratik ödünleri vurgular ve her paradigmanın ne zaman parladığını gösterir; böylece projeleriniz için daha iyi ve daha pragmatik kararlar alabilirsiniz.

Paradigmaların Temel Farkları

İşin özüne indiğinizde, OOP ile FP arasındaki temel fark veri, durum ve yan etkilerin yönetimindedir.

  • OOP, veriyi ve onu işleyen fonksiyonları nesnelerde gruplayarak kapsülleme sağlar. Örneğin, bir Car nesnesi colour ve currentSpeed gibi özelliklere ve bu durumu değiştiren accelerate() ve brake() gibi metotlara sahiptir.
  • FP, hesaplamayı saf fonksiyonların değerlendirilmesi olarak görür: aynı giriş için aynı çıktıyı dönen, yan etkiden kaçınan fonksiyonlar. FP değişmezliği (immutability) vurgular; veriyi yerinde değiştirmek yerine yeni veri yapıları döndürür.

Temel felsefeler

AspectObject-Oriented Programming (OOP)Functional Programming (FP)
Primary unitVeri ve davranışı birleştiren nesnelerVeriyi dönüştüren saf fonksiyonlar
State managementDeğiştirilebilir durumu kapsüller ve yönetirDeğiştirilebilir durumdan ve yan etkilerden kaçınır
Data flowMetotlar iç nesne durumunu değiştirirVeri fonksiyon zincirleri aracılığıyla akar
Core ideaDünyayı etkileşen nesneler olarak modellemekHesaplamayı matematik benzeri fonksiyonlar olarak tanımlamak

Temel Konsept Farkları

OOP değiştirilebilir duruma ve bu durumu değiştiren metotlara sahip varlıkları modeler; bu, GUI’ler, oyunlar ve kurumsal modeller için sezgisel olabilir. FP ise durumu değişmez olarak ele alır: veriyi “güncellemek” için yeni bir kopya oluşturursunuz. Değişmezlik, paylaşılan durum kaynaklı hataları azaltır ve eşzamanlı (concurrent) sistemlerde muhakemeyi kolaylaştırır.

Durum: Değiştirilebilir vs Değişmez

OOP’de user.setEmail('new@example.com') yazabilir ve nesnenin durumunu doğrudan değiştirebilirsiniz. FP’de updateEmail(user, 'new@example.com') gibi bir fonksiyon yeni bir kullanıcı nesnesi döndürür; orijinal değişmez kalır. Değişmezlik, beklenmedik paylaşılan mutasyonlardan kaynaklanan hata sınıfını azaltır.

Mantık Organizasyonu: Metotlar vs Saf Fonksiyonlar

OOP mantığı veriye metotlar aracılığıyla bağlar; FP veriyi ve davranışı saf fonksiyonlara ayırır. Bu ayrım açık veri akışına ve daha kolay birim testlerine yol açar: bir fonksiyona girdi verin, çıktıyı doğrulayın, gizli durum hakkında endişelenmeyin.

Yeniden Kullanım: Kalıtım vs Bileşim

OOP sıklıkla davranışı paylaşmak için kalıtıma dayanır; bu kırılgan hiyerarşiler yaratabilir. FP bileşime öncelik verir: küçük, yeniden kullanılabilir fonksiyonları birleştirerek karmaşık davranışlar oluşturun. Bileşim genellikle daha esnektir ve yeniden düzenlemesi (refactor) daha kolaydır.

Sürdürülebilirlik ve Uzun Vadeli Etkiler

Her iki paradigma da iyi uygulandığında sürdürülebilir sistemler üretebilir. OOP’nin kapsülleme yeteneği karmaşıklığı yönetmeye yardımcı olur; ancak kötü tasarlanmış nesne grafikleri hata ayıklamayı zorlaştırır. FP’nin değişmezliği hata yüzeyini daraltır ve özellikle paralel/dağıtık bağlamlarda muhakemeyi basitleştirir — endüstri analizleri fonksiyonel tekniklere duyulan ilginin arttığını not etmektedir1.

Pratik fark çoğunlukla ekip disiplinine dayanır: sağlam testler, kod incelemeleri ve mühendislik uygulamaları paradigmanın kendisinden daha önemlidir. Test odaklı geliştirme ve iyi uygulamalar üretkenliği ve kaliteyi artırır3.

Paradigmaların Baskı Altında Davranışı

ConcernOOPFP
DebuggingDurumu nesneler arasında izlemeyi gerektirebilirSaf fonksiyonların girdileri ve çıktılarıyla sınırlıdır
ConcurrencyPaylaşılan durum için kilitler veya koordinasyon gerektirirDeğişmezlik nedeniyle paralellik için daha güvenlidir
RefactoringDerin kalıtımda daha zordurFonksiyonları veya bileşimleri değiştirerek daha kolaydır
Cognitive loadBirçok durumlu nesneyi takip ederken yüksek olabilirFonksiyonları izole şekilde düşünmek daha düşüktür

Fonksiyonel teknikler eşzamanlılık ve paralelliği genellikle basitleştirir; bu da FP’nin büyük ölçekli, dağıtık sistemlerde benimsenmesinin artmasına katkıda bulunmuştur1.

Doğru Aracı Seçmek

En iyi seçim proje ihtiyaçlarına, ekip yetkinliğine ve uzun vadeli hedeflere bağlıdır. OOP, durumlu ve etkileşimli varlıkları modelleyen sistemlere uygundur — GUI’ler, oyunlar ve birçok kurumsal uygulama. FP ise veri işleme, olay güdümlü sistemler ve eşzamanlı servislerde öne çıkar.

OOP mantıklı olduğunda

  • Widget’ların doğal olarak nesnelere eşlendiği grafik kullanıcı arayüzleri.
  • Durumu ve davranışı kapsülleyen varlıklarla oyun geliştirme.
  • Müşteriler ve siparişler gibi iş varlıklarını modelleyen büyük kurumsal sistemler.

FP mantıklı olduğunda

  • Verinin bir dizi adım olarak temizce dönüştüğü veri hatları ve ETL süreçleri.
  • Paylaşılan değiştirilebilir durum olmadan olay akışlarını işleyen event-driven sistemler.
  • Değişmezliğin yarış durumlarını azalttığı eşzamanlı veya paralel sistemler.

JavaScript'te Pratik Örnek

Yaygın bir görev: aktif kullanıcıları filtrelemek ve isimleri büyük harfe çevirmek.

OOP yaklaşımı (durumu değiştirir):

class UserList {
  constructor(users) {
    this.users = users;
  }

  filterActive() {
    this.users = this.users.filter(u => u.isActive);
    return this;
  }

  capitalizeNames() {
    this.users.forEach(u => {
      u.name = u.name.toUpperCase();
    });
    return this;
  }
}

const userList = new UserList([
  { name: 'Alice', isActive: true },
  { name: 'Bob', isActive: false }
]);

userList.filterActive().capitalizeNames();
// userList.users is [{ name: 'ALICE', isActive: true }]

FP yaklaşımı (mutasyon yapmadan yeni veri döndürür):

const isActive = user => user.isActive;
const capitalizeName = user => ({ ...user, name: user.name.toUpperCase() });

const processUsers = (users) => {
  return users
    .filter(isActive)
    .map(capitalizeName);
};

const users = [
  { name: 'Alice', isActive: true },
  { name: 'Bob', isActive: false }
];

const processedUsers = processUsers(users);
// processedUsers is [{ name: 'ALICE', isActive: true }]
// original users array is unchanged

FP versiyonu açıktır ve gizli mutasyonlar ile yan etkilerden kaçındığı için test edilmesi daha kolaydır.

Kod Kalitesi ve Hatalar

Saf fonksiyonlar ve değişmezlik gibi fonksiyonel desenler belirli hata sınıflarını azaltır, ancak tek başına mucize değildir. Paradigmalar arasındaki hata oranlarında büyük farklılıklar gösterilmediğini belirten analizler mevcuttur; bu da mühendislik disiplininin en önemli faktör olduğunu düşündürür2.

Testlere, kod incelemelerine ve sağlam mimariye yatırım yapmak genellikle paradigma değiştirmekten daha fazla fayda sağlar. Test odaklı geliştirme hakkında daha fazla bilgi için rehberimize bakabilirsiniz: [/blog/tdd].

Pragmatik Ekip Kararı

Pragmatik bir yaklaşım genellikle en iyisidir. Ekip akıcılığını, problem alanını, eşzamanlılık ihtiyaçlarını ve mevcut araçları göz önünde bulundurun. Birçok ekip paradigmaları birleştirir: yüksek düzey mimari için OOP ve iş mantığı ile veri dönüşümleri için FP teknikleri kullanın. Bu hibrit strateji yapısal açıklığı yakalarken test edilebilirliği artırır.

Ana karar kriterleri:

  • Ekip akıcılığı: Ekibiniz hangi paradigmayla daha iyi çalışıyor?
  • Problem alanı: Durumlu varlıkları mı modelliyorsunuz yoksa veriyi mi dönüştürüyorsunuz?
  • Eşzamanlılık ihtiyaçları: Değişmezlikten fayda sağlar mısınız?
  • Ekosistem ve araçlar: Dilinizde paradigmayı destekleyen kütüphaneler var mı? Daha fazla bilgi için immutable veri yapıları kılavuzumuza bakın: [/guides/immutable-data].

Sıkça Sorulan Sorular

OOP ve FP’yi birleştirebilir miyim?

Evet. JavaScript, TypeScript ve Python gibi modern diller çok paradigmalıdır. Yapı için OOP, saf ve test edilebilir iş mantığı için FP kullanın.

Yeni başlayanlar önce ne öğrenmeli?

Seçtiğiniz dilde hızlıca çalışan projeler inşa etmenize yardımcı olan paradigma ile başlayın, ancak her ikisini de öğrenin. Her biri sizi daha iyi bir geliştirici yapan kavramlar öğretir.

Hangi yaklaşım hataları en çok azaltır?

Hiçbiri tek başına daha az hata garanti etmez. Disiplinli bir süreç—testler, incelemeler ve mimari—çok daha önemlidir3.

Kısa Soru-Cevap (Özet)

Q: OOP ile FP arasındaki en büyük tek fark nedir?

A: Durumu nasıl ele aldıkları: OOP değiştirilebilir, kapsüllenmiş durumu kullanır; FP değişmezlik ve saf fonksiyonları vurgular.

Q: FP’yi ne zaman OOP yerine seçmeliyim?

A: Veri hatları, eşzamanlı sistemler veya değişmezliğin güvenilirliği artırdığı olay güdümlü mimariler için FP’yi seçin.

Q: Paradigmaları karıştırmak projeme yardımcı olur mu?

A: Evet. Yapı için OOP ve iş mantığı ile veri dönüşümleri için FP kullanmak her iki dünyanın en iyisini almanızı sağlar.


Ek: Hızlı Q&A

Q: Performans kaybı yaşar mıyım?

A: Değişmezlik bazı durumlarda ekstra kopyalamaya yol açabilir, ancak modern dillerde optimizasyonlar ve yapısal paylaşım bu etkiyi azaltır.

Q: Ekip için öğrenme maliyeti nedir?

A: Her paradigma öğrenme maliyeti getirir; FP tekniklerini kademeli olarak mevcut OOP kod tabanına eklemek genellikle daha az risklidir.

Q: Hangi araçlar yardımcı olur?

A: Immutable.js, Ramda, Lodash/fp, TypeScript tipleri ve güçlü test çerçeveleri ekiplerin geçişini kolaylaştırır.

1.
Eluminous Technologies, “Functional Programming vs OOP,” https://eluminoustechnologies.com/blog/functional-programming-vs-oop/
2.
Video ve tartışma örnekleri için: https://www.youtube.com/watch?v=Ly9dtWwqqwY
3.
Test odaklı geliştirme ve faydaları hakkında rehber: https://cleancodeguy.com/blog/red-green-refactor-tdd
← Back to blog
🙋🏻‍♂️

AI kod yazar.
Siz onu uzun süre dayanır hale getirirsiniz.

AI hızlanması çağında, temiz kod sadece iyi bir uygulama değil — ölçeklenen sistemlerle kendi ağırlığı altında çöken kod tabanları arasındaki farktır.