Ana içeriğe geç

Yan yana

OOPvsFonksiyonel programlama

OOP ile fonksiyonel programlama arasındaki fark nedir?

Güncellendi 2 dk okuma7 fark

Kısaca

Nesne yönelimli programlama veriyi ve onu değiştiren metotları nesnelerde toplar; fonksiyonel programlama ise değişmez veriyi saf fonksiyonlarla dönüştürür.

OOP

Nesne Yönelimli Programlama

OOP, yani nesne yönelimli programlama, kodu ilişkili verileri onlar üzerinde işlem yapan fonksiyonlarla birleştiren nesneler etrafında düzenleme yöntemidir.

OOP sayfasını oku

Fonksiyonel programlama

Fonksiyonel programlama, paylaşılan verileri değiştirmeyen saf fonksiyonlarla yazılım kurma stilidir; kodu daha öngörülebilir ve test etmesi kolay yapar.

Fonksiyonel programlama sayfasını oku

OOP ve Fonksiyonel programlama karşılaştırması

ÖzellikOOPFonksiyonel programlama
Temel birimVeriyi ve davranışı birleştiren nesnelerGirdileri çıktılara dönüştüren fonksiyonlar
DurumNesnelerin içinde tutulan değişebilir durumDeğişmez veri; değişiklik yerine yeni değerler
Yan etkilerMetotların içinde yaygın ve beklenenÖnlenir ya da programın kenarlarına itilir
Kod yeniden kullanımıKalıtım, arayüzler ve nesne bileşimiYüksek dereceli fonksiyonlar ve fonksiyon bileşimi
EşzamanlılıkPaylaşılan değişebilir durum kilit ya da dikkatli tasarım gerektirirDeğişmez veri, iş parçacıkları arasında doğal olarak güvenle paylaşılır
TestÇoğu zaman nesne kurulumu ve mock gerekirSaf fonksiyonlar girdiler ve beklenen çıktılarla test edilir
Tipik dillerJava, C#, C++, Python ve RubyHaskell, Elixir, Clojure, F# ve FP tarzı JavaScript

Fark, açıklamalı

Nesne yönelimli programlama (OOP), bir programı User ya da Order gibi nesneler olarak modeller; her nesne kendi durumunu tutar ve üzerinde işlem yapan metotlar sunar. Fonksiyonel programlama (FP) ise programı, girdi alıp çıktı döndüren ve ideal olarak kendi dışındaki hiçbir şeyi değiştirmeyen fonksiyonlardan oluşan bir boru hattı olarak modeller.

Temel fark, ikisinin durumu nasıl ele aldığıdır. OOP durumu nesnelerin içinde tutar ve metotlarla değiştirir; ona kimin dokunabileceğini denetlemek için kapsüllemeyi kullanır. FP paylaşılan değişebilir durumdan kaçınır: veriyi değiştirmek yerine fonksiyonlar yeni değerler döndürür; bu da kodu test etmeyi kolaylaştırır ve paralel çalıştırmayı daha güvenli kılar.

Çoğu modern dil ikisini de destekler ve iyi kod çoğu zaman ikisini karıştırır. Bir alanın ana kavramlarını modellemek için sınıfları kullanıp bunların mantığını küçük saf fonksiyonlarla, map, filter ve değişmez veriyle yazabilirsiniz. JavaScript, Python, Kotlin, Scala ve C# bu birleşimi doğal kılar.

Sık yapılan bir yanlış, FP'nin nesne olmaması ya da OOP'nin her şeyin sınıf olması gerektiği anlamına geldiği düşüncesidir. Bunlar katı kurallar değil, tarzlardır: asıl soru durumun nerede durduğu ve nasıl değiştiğidir; her tarz farklı problemlere uygun araçlar sunar.

Hangisini kullanmalısınız?

OOP şu durumlarda doğru seçim:

  • Alanınızda kendi durumu ve davranışı olan net varlıklar var.
  • Arayüz bileşenleri, oyun nesneleri ya da hesaplar gibi uzun ömürlü şeyleri modelliyorsunuz.
  • Ekibiniz ve framework'ünüz sınıflar etrafında kurulu.

Fonksiyonel programlama şu durumlarda doğru seçim:

  • Veriyi bir dizi adımdan geçirerek dönüştürüyorsunuz.
  • Kod eşzamanlı çalışıyor ve paylaşılan durum bir risk.
  • Test etmesi kolay, küçük ve öngörülebilir fonksiyonlar istiyorsunuz.

Her tarzda bir alışveriş sepeti

OOPjavascript
// OOP: the object holds state and changes it
class Cart {
  constructor() {
    this.items = [];
  }
  add(item) {
    this.items.push(item);
  }
  total() {
    return this.items.reduce((sum, i) => sum + i.price, 0);
  }
}
Fonksiyonel programlamajavascript
// FP: pure functions return new data
const add = (items, item) => [...items, item];

const total = (items) =>
  items.reduce((sum, i) => sum + i.price, 0);

let cart = [];
cart = add(cart, { name: "Book", price: 12 });
console.log(total(cart)); // 12

Sık sorulan sorular

Fonksiyonel programlama, OOP'den daha mı iyi?

Genel olarak hiçbiri diğerinden iyi değildir. FP veri dönüşümlerinde ve eşzamanlı kodda öne çıkar; OOP ise durumu ve davranışı olan varlıkları modellerken iyi uyar. Birçok kod tabanı ikisini de kullanır.

OOP ile fonksiyonel programlama birlikte kullanılabilir mi?

Evet. Yaygın dillerin çoğu iki tarzı da destekler; sık kullanılan bir yaklaşım, yapı için nesneleri, mantık için saf fonksiyonları kullanmaktır.

JavaScript nesne yönelimli mi, fonksiyonel mi?

İkisi de. JavaScript'te OOP için sınıflar ve prototipler; fonksiyonel tarz için birinci sınıf fonksiyonlar, closure'lar ve map ile filter gibi dizi metotları vardır.

Daha fazla

Ayarlar