December 2, 2025 (4mo ago)

Fonksiyonel Programlama vs Nesne Yönelimli: Hızlı Bir Rehber

Fonksiyonel programlama vs nesne yönelimli: Paradigmaları karşılaştırın, pratik kod örneklerini görün ve projeniz için en iyi yaklaşımı nasıl seçeceğinizi öğrenin.

← Back to blog
Cover Image for Fonksiyonel Programlama vs Nesne Yönelimli: Hızlı Bir Rehber

Fonksiyonel programlama vs nesne yönelimli: Paradigmaları karşılaştırın, pratik kod örneklerini görün ve projeniz için en iyi yaklaşımı nasıl seçeceğinizi öğrenin.

Fonksiyonel vs Nesne Yönelimli Programlama: Hızlı Bir Rehber

Fonksiyonel programlama vs nesne yönelimli: Paradigmaları karşılaştırın, pratik kod örneklerini görün ve projeniz için en iyi yaklaşımı nasıl seçeceğinizi öğrenin.

Fonksiyonel Programlama ve Nesne Yönelimli Programlama ilkelerini açıklayıcı kavramlarla karşılaştıran el çizimi diyagram.

Giriş

Fonksiyonel programlama ile nesne yönelimli programlama arasındaki gerçek fark, odak noktasına dair bir soruya kadar indirgenir: kodu ne yaptığınıza göre mi yoksa kim yaptığınıza göre mi düzenliyorsunuz? Fonksiyonel Programlama (FP) ne yaptığınıza vurgu yapar ve yazılımı durumsuz, matematiksel fonksiyon çağrıları zinciri olarak ele alır. Nesne Yönelimli Programlama (OOP) ise bunu kimin yaptığına vurgu yapar ve mantığı birbirleriyle etkileşen durumlu nesneler etrafında organize eder. Bu rehber her iki paradigmayı karşılaştırır, pratik TypeScript ve React örnekleri gösterir ve projeniz için en iyi yaklaşımı seçmenize yardımcı olur.

FP vs OOP'ye Hızlı Bir Bakış

Fonksiyonel ile nesne yönelimli stiller arasında seçim yapmak sadece teknik bir karar değildir; yazılımı yapılandırma ve veri akışını ele alma konusunda bir zihniyete bağlılıktır. Bu üst düzey karşılaştırma somut örnekler ve pratik ödünleşimleri hazırlıyor.

Temel Felsefi Farklar

OOP, veri ve üzerine işlem yapan fonksiyonları nesneler halinde paketleyerek dünyayı modellemeye çalışır. Örneğin adı ve e-posta gibi verileri tutan ve updateEmail() veya sendPasswordReset() gibi yöntemler sunan bir User nesnesini düşünebilirsiniz. Her nesne kendi durumunu yönetir.

FP tam tersini benimser; veri ile davranışı ayırır. Veriler genellikle değişmezdir (immutable) ve saf fonksiyonlar girdi alıp yan etkisiz yeni çıktılar döner. Bu, büyük OOP sistemlerinde ortaya çıkabilecek paylaşılan durumun yol açtığı karışıklığı azaltır.

“Daha sonra kod hakkında akıl yürütmek gerçek zorluktur. FP hareket eden parçaları en aza indirir, OOP ise bu parçaları anlaşılır bileşenler halinde organize eder.”

Birçok modern ekip en iyi yanları elde etmek için her iki paradigmanın fikirlerinden ödünç alır. Başlangıç için işte temel farkların kısa özeti.

Fonksiyonel ve Nesne Yönelimli Programlama Arasındaki Temel Farklar

ConceptFunctional Programming (FP)Object-Oriented Programming (OOP)
Primary UnitFunctionsObjects
State ManagementImmutable stateMutable state
Data & OperationsKept separateEncapsulated together
ConcurrencyEasier to handle, statelessRequires explicit locks or synchronization
Flow ControlFunction calls and compositionMethods, loops, and conditionals
Key PrinciplesPure functions, immutabilityEncapsulation, inheritance, polymorphism

Temel Felsefeleri Anlamak

Bu paradigmalar sadece sözdizimi tercihleri değil; veriyi, davranışı ve sistemleri inşa etme biçimlerini düşünme yollarıdır. Hangi paradigmanın projenize uyduğu, değişimi ve karmaşıklığı nasıl yönetmek istediğinize bağlıdır.

Temel felsefeleri, matematiksel kökenleri, saf yığınları, değişmez fonksiyonları, yatırım yapılmış nesneleri ve çok biçimliliği (polymorphism) gösteren kavramsal diyagramlar.

Fonksiyonel Programlama Paradigması

FP, lambda kalkülüsüne kadar uzanır ve hesaplamayı matematiksel fonksiyonların değerlendirilmesi olarak ele alır. Aynı girdiye her zaman aynı çıktıyı döndüren ve yan etki üretmeyen saf fonksiyonlar merkezidir. Değişmezlik (immutability), yerinde değişiklikleri engeller ve yeni değerler döndürmeyi teşvik eder.

Bu öngörülebilirlik, FP kodunu test etmeyi ve üzerinde akıl yürütmeyi kolaylaştırır; özellikle paylaşılan değiştirilebilir durumun sıkça hata kaynağı olduğu eşzamanlı (concurrent) sistemlerde. FP'nin tek yönlü veri akışı ayrıca veriyi dönüştürmek için daha net boru hatları (pipeline) oluşturma eğilimindedir.

Nesne Yönelimli Programlama Paradigması

OOP, sistemleri hem durum hem de davranışı kapsülleyen (encapsulate) etkileşen nesneler olarak modeler. Kapsülleme iç detayları gizleyerek nesnelerin sisteme basit bir arayüz sunmasını sağlar. Kalıtım (inheritance) ve çok biçimlilik (polymorphism) kod tekrarını ve esnek soyutlamaları destekler.

Bu yaklaşım, karmaşık alan (domain) varlıklarını ve bunların etkileşimlerini modellemek için uygundur. Alan kavramları stabil olduğunda ve nesne ilişkileri iş kurallarına doğal olarak uyduğunda, OOP sezgisel ve sürdürülebilir tasarımlar üretebilir.

Bakım ve Ölçeklenebilirliği Karşılaştırma

Bir paradigma seçmek, uzun vadeli bakım ve sistemlerin nasıl ölçeklendiğini etkiler. Hem FP hem OOP değerli stratejiler sunar, ancak karmaşıklığa farklı yaklaşımlar getirir.

Bakım: Öngörülebilirlik vs Kapsülleme

FP, saf fonksiyonlar ve değişmezlik aracılığıyla öngörülebilirliğe öncelik verir. Aynı girdiler için her zaman aynı sonucu döndüren bir fonksiyon test edilmesi ve izole edilmesi kolaydır. OOP ilgili veri ve davranışı bir arada toplayarak geliştiricilerin kendine yeten bileşenleri inceleyerek bir sistemi kavramasına yardımcı olur.

Takas: FP'nin açıklığı veri ve davranışın ayrılmasından gelirken, OOP'nin açıklığı bunları gruplayarak gelir. Bu durum hata ayıklama iş akışlarını etkiler—FP genellikle hataları belirli fonksiyonlarla sınırlar, OOP ise birden çok nesne arasındaki etkileşimlerin izlenmesini gerektirebilir.

Ölçeklenebilirlik: Eşzamanlılık ve Paralellik

FP'nin durumsuz yaklaşımı, saf fonksiyonlar paylaşılan veriyi değiştirmediği için eşzamanlı ve paralel işlemeyi basitleştirir. Bu, kilitlere ve senkronizasyona olan ihtiyacı azaltır. OOP eşzamanlı hale getirilebilir, ancak genellikle yarış koşullarından kaçınmak için dikkatli durum yönetimi ve senkronizasyon mekanizmaları gerektirir.

FP, öngörülebilir, eşzamanlı davranış gerektiren alanlarda ilgi kazanıyor, ancak ana akım geliştirici benimsemesi çok paradigmalı ve nesne yönelimli dillere odaklanmış durumda 1.2

Gerçek Dünya Örnekleri: TypeScript ve React

Aşağıda aynı kullanıcı ayarları formunu iki tarzda oluşturuyoruz: klasik bir React sınıf bileşeni (OOP) ve Hooks kullanan modern bir fonksiyonel bileşen (FP tarzı). Bu, mimari seçimin durum yönetimini, mantık tekrarını ve yapıyı nasıl etkilediğini vurgular.

Sınıf tabanlı React bileşenlerinden fonksiyonel React Hooks'a geçişi gösteren diyagram.

OOP Yaklaşımı: React Sınıf Bileşeni

Sınıf bileşeni durumu ve yöntemleri tek bir nesne içinde gruplayarak kapsülleme (encapsulation) modeline uyar.

import React, { Component } from 'react';

interface UserSettings {
  name: string;
  email: string;
}

class UserSettingsForm extends Component<{}, UserSettings> {
  state = {
    name: 'Jane Doe',
    email: 'jane.doe@example.com',
  };

  handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {
    const { name, value } = event.target;
    this.setState({ [name]: value } as Pick<UserSettings, keyof UserSettings>);
  };

  handleSubmit = (event: React.FormEvent) => {
    event.preventDefault();
    console.log('Submitting data:', this.state);
  };

  render() {
    return (
      <form onSubmit={this.handleSubmit}>
        <input name="name" value={this.state.name} onChange={this.handleChange} />
        <input name="email" value={this.state.email} onChange={this.handleChange} />
        <button type="submit">Save Settings</button>
      </form>
    );
  }
}

Bu desen ilgili veri ve davranışı bir arada tutar, ancak daha büyük bileşenler ek desenler (ör. higher-order components) olmadan yeniden düzenlenmesi (refactor) ve yeniden kullanılabilirliği zorlaşabilir.

Fonksiyonel Yeniden Yazım: Hooks ve Saf Yardımcılar

Fonksiyonel yaklaşım, durumu ve saf fonksiyonları ayırır; bu da parçaların bağımsız test edilmesini ve yeniden kullanılmasını kolaylaştırır.

import React, { useState } from 'react';

const formatUserDataForApi = (name: string, email: string) => ({
  userName: name,
  userEmail: email,
});

const UserSettingsFormFunctional = () => {
  const [name, setName] = useState('Jane Doe');
  const [email, setEmail] = useState('jane.doe@example.com');

  const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {
    const { name, value } = event.target;
    if (name === 'name') {
      setName(value);
    } else {
      setEmail(value);
    }
  };

  const handleSubmit = (event: React.FormEvent) => {
    event.preventDefault();
    const payload = formatUserDataForApi(name, email);
    console.log('Submitting data:', payload);
  };

  return (
    <form onSubmit={handleSubmit}>
      <input name="name" value={name} onChange={handleChange} />
      <input name="email" value={email} onChange={handleChange} />
      <button type="submit">Save Settings</button>
    </form>
  );
};

React’in Hooks’u, fonksiyonlarda durum ve yan etkileri mümkün kılarak bu stili yaygın hale getirdi ve modern React geliştirmede geniş kabul gördü 3.

Doğru Paradigmayı Nasıl Seçersiniz

Bu bir ölümüne kavga değil. Doğru seçim, ekibinize, problem alanına ve uzun vadeli hedeflerinize bağlıdır. Pratik bir karar vermek için bu ipuçlarını kullanın.

Ne Zaman OOP Seçilmeli

Zengin alan (domain) varlıklarını kalıcı durum ve davranışlarla modelliyorsanız OOP’yi seçin, örneğin:

  • Birbirine bağlı çok modüllü büyük kurumsal sistemler
  • Bileşen düzeyinde durumun nesnelere doğal olarak eşlendiği zengin, durumlu UI bileşenleri
  • Stabil, iyi tanımlanmış varlıkların olduğu alanlar

Ne Zaman FP Seçilmeli

Öngörülebilirlik, eşzamanlılık ve veri dönüşümleri önceliğinizse FP’yi seçin, örneğin:

  • Veri işleme boru hatları (pipelines) ve ETL görevleri
  • Durum senkronizasyonunun maliyetli olduğu eşzamanlı veya paralel sistemler
  • Fonksiyonların algoritmalara temiz şekilde eşlendiği matematiksel veya bilimsel hesaplamalar

Pratik Karar Kontrol Listesi

  1. Verinizin doğası nedir: durumlu nesneler mi yoksa dönüştürülebilir akışlar mı?
  2. Performans ve doğruluk için eşzamanlılık ne kadar kritik?
  3. Ekibinizin uzmanlığı ve yeni desenleri öğrenmeye istekliliği nedir?
  4. Zorlamadan hibrit bir yaklaşım probleme uyabilir mi?

Hibrit Yaklaşımı Benimsemek

Çoğu başarılı sistem her iki paradigmayı birleştirir. TypeScript ve Python gibi çok paradigmalı diller, sınıflar içinde değişmez veri kullanmanıza, koleksiyonlarda map ve filter uygulamanıza ve temel iş mantığı için saf fonksiyonlar izole etmenize izin verir.

Pratikte Paradigmaların Kombinasyonu

Yaygın hibrit desenler:

  • Sınıflar içinde değişmez durum: yöntemler dahili durumu değiştirmek yerine yeni örnekler döndürür.
  • Servisler için saf fonksiyonlar: iş mantığı, girdileri alıp çıktıları döndüren durumsuz fonksiyonlar olarak uygulanır.
  • Fonksiyonel koleksiyon yöntemleri: dizileri işlemek için map, filter, reduce kullanın, döndürücü döngüler yerine.

Nesneleri “şeyleri” modellemek için, saf fonksiyonları ise bunlar arasındaki davranışı düzenlemek için kullanın. Bu ayrım açıklığı ve test edilebilirliği artırır.

Nesne yönelimli (OP) kavramlarını, map filter akışı ile fonksiyonel programlamaya (FP) doğru bir akışla karşılaştıran diyagram.

Sık Sorulan Sorular

Fonksiyonel Programlama, Nesne Yönelimli Programlamadan daha mı hızlı?

Performans problem, dil ve çalışma zamanı ortamına bağlıdır. FP’deki değişmezlik tahsis (allocation) yükü getirebilir, ama durumsuz doğası eşzamanlılığı basitleştirir ve paralel sistemlerde verimi artırabilir. Yerinde güncellemeye dayalı tek iş parçacıklı görevler OOP tarzı mutasyonla daha hızlı çalışabilir.

Fonksiyonel ve nesne yönelimli kod karıştırabilir miyim?

Evet. Paradigmaları karıştırmak yaygındır ve çoğu zaman en pratik seçimdir. Temel varlıkları nesnelerle modelleyip karmaşık mantığı saf fonksiyonlar olarak ifade edin.

Bir acemi önce hangi paradigmayı öğrenmeli?

OOP genellikle sınıflar ve nesnelerin gerçek dünya kavramlarına sezgisel olarak eşlenmesi nedeniyle başlangıçta daha kolay anlaşılır. Saf fonksiyonlar ve değişmezlik gibi temel fonksiyonel fikirleri erken öğrenmek, kod kalitesini artıran alışkanlıklar kazandırır.

Temel Öneriler

  1. Paradigmayı probleme göre eşleştirin. Öngörülebilir veri dönüşümleri ve eşzamanlılık için FP’yi, zengin alan modelleme için OOP’yi kullanın.
  2. Çekirdek mantık için küçük, saf fonksiyonları tercih edin. Bileşenleri ve sınıfları odaklı ve küçük tutun.
  3. Faydalı olduğunda hibrit yaklaşımı benimseyin. Tüm kod tabanı için tek bir paradigmaya bağlı kalmanız gerekmez.

Pratik Soru-Cevap

S: Var olan bir kod tabanı için FP ve OOP arasında nasıl karar veririm?

A: En büyük ağrı noktalarını değerlendirin. Hatalar paylaşılan değiştirilebilir durumdan kaynaklanıyorsa, değişmezlik ve saf fonksiyonlar ekleyin. Alan doğası doğal olarak nesne tabanlıysa, nesneleri koruyun ama durumdan bağımsız servisleri çıkarın.

S: OOP projesine FP ilkelerini güvenli şekilde nasıl getiririm?

A: Küçük, test edilebilir servislerle başlayın; bunları saf fonksiyonlar olarak uygulayın, fonksiyonel dizi yöntemleri ekleyin ve durumu değiştirmek yerine yeni nesne örnekleri döndürmeyi düşünün.

S: Bugün bakım kolaylığını artırmak için hızlı kazanımlar nelerdir?

A: Küçük fonksiyonları zorunlu kılın, saf mantık için otomatik testler ekleyin, döndürücü döngüler yerine map/filter kullanın ve durumlu nesneler için invariantları belgeleyin.


1.
https://insights.stackoverflow.com/survey/2023 — Stack Overflow Developer Survey showing dominant usage of multi-paradigm and scripting languages compared with niche functional languages.
2.
https://octoverse.github.com/ — GitHub Octoverse reports and language usage trends, showing broad adoption of JavaScript, TypeScript, Python and smaller shares for purely functional languages.
3.
https://reactjs.org/docs/hooks-intro.html — React documentation on Hooks, which popularized functional components and stateful logic reuse in React applications.
4.
https://www.cs.kent.ac.uk/people/staff/dat/miranda/whyfp.html — John Hughes, “Why Functional Programming Matters,” a foundational essay on the benefits of functional design.
← 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.