Forum: Diğer Konular RSS
Fonksiyonel Programlama ve NYP Hakkında
agora #1
Üye Tem 2013 tarihinden beri · 221 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Fonksiyonel Programlama ve NYP Hakkında
Şu şu farkları var diyebilir miyiz?

Ben sınıfları gerçekten hiç sevmiyorum. Sınıflara aşinalığım bir türlü olmadı. Şu sıralarda programlama ile ilgilenemiyorum ama bilgisayarı her açtığımda forumu ve konuları açıyorum okuyorum geri kalmamak amacı ile.

Örneğin Java'da sınıflarla çalışıyorum ama gerçekten sevdiğimden değil. Dilin doğası gereği.

D dilinde bence bu konu daha yumuşatılmış daha rahatım yani.

Java'dan türetilmiş ya da JVM mi demeliyim karar kılamadım bilmediğimden yani Scala dili var. Bu dil ise fonksiyonel.

Dil üreticileri hangi konuları görerek o dilin yapısına karar veriyorlar?

Fonksiyonel ya da Nesnel olmalı diyorlar?

Örneğin D dili kullanılarak yazılan bir program sadece fonksiyonel olarak inşaa edilemez mi?

Sadece ana farklarini merak ettim. Getirilerini :)

Tesekkurler.
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
agora:
Şu şu farkları var diyebilir miyiz?

Tabii ki farklılar. Daha çok "ortak yanları var mı" diye sormak gerek. :)

Ben sınıfları gerçekten hiç sevmiyorum. Sınıflara aşinalığım bir türlü olmadı.

Sevmediğin üye işlevler mi? Öyleyse yapıların üye işlevlerini de mi sevmiyorsun? Yoksa çok şekilliliği mi sevmiyorsun? Belki de sınıfların başka bir farklılıkları itici geliyor. (?)

Örneğin Java'da sınıflarla çalışıyorum ama gerçekten sevdiğimden değil. Dilin doğası gereği.

Ben hiç Java kodlamadım ama o dilin NYP'de ısrarcı olmasının eleştirildiğini çok okudum.

Dil üreticileri hangi konuları görerek o dilin yapısına karar veriyorlar?

Aslında çok zor iş, değil mi? :)

Örneğin D dili kullanılarak yazılan bir program sadece fonksiyonel olarak inşaa edilemez mi?

(Kusura bakma, sınıflarla karşılaştırdığın için sormak zorundayım: Fonksiyonel derken fonksiyonlar kullanılarak yazılmış mı demek istiyorsun yoksa fonksiyonel programlama dili anlamında mı kullanıyorsun. İkisi aynı değil.)

Fonksiyonel dillerin özelliklerini Wikipedia maddesinden alıyorum:

  http://en.wikipedia.org/wiki/Functional_programming_langua…

  • İşlevler nesne olarak kullanılabiliyorlar mı? Örneğin, işlevlere parametre olarak gönderilebiliyorlar mı veya işlevlerden döndürülebiliyorlar mı? (First-class and higher-order functions) D'de evet.

  • Saf işlev kavramı var mı? (Pure functions) D'de var.

  • Özyineleme var mı? (Recursion) D'de var.

  • Hevesli veya tembel işlemler var mı? (Strict versus non-strict evaluation) D'de var.

  • Tür sistemi var mı? (Type systems) D'de var.

Bu yanıtlara bakıldığında evet, D'de fonksiyonel programlama yöntemleri kullanılabilir.

Sadece ana farklarini merak ettim. Getirilerini :)

NYP bana özellikle çekici veya itici gelmiyor. NYP çok basit bir sorunu çözüyor: Klasik Hayvan (veya Komut) örneği: Aslında tam olarak ne olduklarını bilmediğim hayvanları bir araya getirip kullanacak mıyım ve onlar otomatik olarak kendi asıl türlerine göre davranacaklar mı?
void foo(Hayvan[] hayvanlar)
{
    foreach (hayvan; hayvanlar) {
        hayvan.şarkıSöyle();
    }
}
Eğer yukarıdaki gibi bir işlev yazmak istiyorsam ve her hayvan otomatik olarak kendi dilinde şarkı söyleyecekse NYP yararlı bir araç.

Fonksiyonel programlamayı ise yan etki üretmemek olarak anlıyorum. Evet, her programlama dilinde değerli bir kavramdır: İşlevler yan etki üreteceklerine değer döndürsünler. Güzel bir ilkedir. :) Öyle yazıyorsam fonksiyonel programlamanın en etkin bölümünü gerçekleştirdim demektir.

Ali
Avatar
Salih Dinçer #3
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Ben de OOP ile 1-2 sene önce tanıştım ve ben de benzer bir bakış açısıyla bakardım. Şimdi ise fikirlerim değişti; bu yüzden "Aralarındaki farklar nedir?" sorusunu, taze hatıralarım ile birlikte sanırım yanıtlayabilirim...

Aslında programlama tekniği olarak baktığımızda, kuşkusuz bir çok farkı var. Bunu Wikipedia maddelerini karşılaştırarak görebiliriz. Ama eğlenceli bir açıdan baktığımızda (işin büyüsünden sıyrıldığımızda) aslında hiç bir fark yok. Çünkü assembly tarafında siz bir işlevi (call ile) çağırırken nasıl bir altyordama dallanıyorsa, nesneler üzerinde cirit atarken de benzer şeyler oluyor. Tıpkı şu ikisinin farkı olmadığı gibi:
import std.stdio;
 
struct KayıtDefteri {
  string kimlik;
  string isim;
  string[] notlar;
}
 
void main() {
  auto kayıt = KayıtDefteri("E21f", "falan filan", [ "geldi", "durdu", "gitti" ]);
  kayıt.writeln();
  DefterYaz(kayıt).writeln();
}
 
string DefterYaz(KayıtDefteri kayıt) {
  string çıktı = KayıtDefteri.stringof ~ "(\"";
  çıktı ~= kayıt.kimlik ~ "\", \"";
  çıktı ~= kayıt.isim ~ "\", [";
  
  auto ekle = kayıt.notlar.length - 1;
  foreach(i, not; kayıt.notlar) {
    çıktı ~= "\"" ~ not ~ "\"";
    if(i < ekle) çıktı ~= ", ";
  }
  return çıktı ~ "])";
}/* Çıktısı:
KayıtDefteri("E21f", "falan filan", ["geldi", "durdu", "gitti"])
KayıtDefteri("E21f", "falan filan", ["geldi", "durdu", "gitti"])
*/
Elbette çıktılarının aynı olması demek hiç bir farkları olmadığı anlamına gelmiyor. Çünkü D, bir yapının içindeki üyeleri ekrana yazarken karşılaştığı nesne elemanlarının (element, member) her birine göre farklı bir altyordamı çağırıyor olmalı. Örneğin integer değerler için çok farklı, float'lar için daha farklı algoritmalar işletiliyor. Tıpkı Ali hocamın verdiği hayvanlar sınıfı gibi. Çünkü o sınıftaki üyelerin özelliklerini bilmesek dahi, sınıfı geliştiren kişinin bilgisi dahilinde, ihtiyacımız olan her şey bir yapı altında toplanmıştır.

Ben KayıtDefteri() içindeki her üyenin dizge olduğunu bildiğimden, gereksiz tüm olasılıkları eleyip kendi çıktımı ürettim; hatta özelleştirebilirdim de. Aslında std.format modülündeki algoritmaları, writeln(), dolayısıyla write() işlevi de kullanmakta. Sanırım o da std.format.formattedWrite temelli bir şey olmalı.

Biraz da gerçek hayattan örneklersek:

Vücudumuzu oluşturan her bir hücrenin aslında benzer yapı taşlarından meydana geldiğini hatırlarsak neler döndüğünü az çok fark edebiliriz. Beynimiz, her bir hücreye sinir ağları ile bağlanmaz öyle değil mi! Kendi başına hareket eden bir sürü yapı olsa da temelde birbirleri ile uyumlu bir kod (DNA) ile şekillendikleri için her an merkezi bir denetleme sistemine ihtiyaç duymadan, hepsi birbiri ile uyumlu çalışmakta. Size sadece en üstten bir denetleme yeterli olmakta. Örneğin yolda adım atmak için sadece omuriliğinizden kalcanızdaki kas gruplarına doğru bir tetiklenme gider. Yolda yürürken acaba şu adımımı atsam diye düşünmezsiniz ya da durmak istediğinizde arkadan gelen ayak olduğu yerde kalmaz. ATP dengesi azaldığında beynimiz bunun meşgul olmaz ama kaslar arasındaki potasyum azaldığında meydana gelen exception bize ağrı olarak ulaştırılır.

İşte böyle...

Özetle, vücudumuzdaki her işlev bir nöron grubu tarafından kontrol edilseydi herhalde şu yazıyı yazmak benim yıllarımı alırdı...:)
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #4
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Şu konu ilgili:

  http://ddili.org/forum/thread/1295

Ali
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-18, 09:23:36 (UTC -08:00)