Cevap:
Vikipedi, İşlevsel Programlama hakkında , istediğiniz örneklerden bazıları ile ilgili harika bir makaleye sahiptir . @Konrad Rudolph OOP makalesine bağlantıyı zaten verdi .
Bir paradigmanın diğerinin bir süper seti olduğunu sanmıyorum. Programlamaya yönelik farklı bakış açılarıdır ve bazı problemler bir bakış açısıyla, bazıları ise diğerinden daha iyi çözülür.
Sorunuz FP ve OOP'un tüm uygulamaları ile daha da karmaşıklaşıyor . Her dilin, sorunuza herhangi bir iyi cevapla alakalı kendi tuhaflıkları vardır.
Giderek Teğet Rambling:
Scala gibi bir dilin size her iki dünyanın da en iyisini sunmaya çalıştığı fikrini seviyorum. İki dünyanın da komplikasyonlarını sağlamasından endişe ediyorum.
Java bir OO dilidir, ancak sürüm 7 bir çeşit kapatmayı taklit etmek için kullanılabilecek bir "kaynakları ile dene" özelliği ekledi. Burada, başka bir işlevin ortasındaki "a" yerel değişkenini, bu işleve görünür hale getirmeden güncellemeyi taklit eder. Bu durumda, diğer işlevin ilk yarısı ClosureTry () yapıcısı ve ikinci yarısı close () yöntemidir.
public class ClosureTry implements AutoCloseable {
public static void main(String[] args) {
int a = 1;
try(ClosureTry ct = new ClosureTry()) {
System.out.println("Middle Stuff...");
a = 2;
}
System.out.println("a: " + a);
}
public ClosureTry() {
System.out.println("Start Stuff Goes Here...");
}
/** Interface throws exception, but we don't have to. */
public void close() {
System.out.println("End Stuff Goes Here...");
}
}
Çıktı:
Start Stuff Goes Here...
Middle Stuff...
End Stuff Goes Here...
a: 2
Bu, bir akış açma, akışa yazma ve güvenilir bir şekilde kapatma amacı için iki işlevin eşleştirilmesi ya da aralarında bazı işler yaptıktan sonra ikincisini çağırmayı unutamayacağınız şekilde eşleştirmek için faydalı olabilir. . Tabii ki, o kadar yeni ve sıradışı ki, başka bir programcı bir şeyi kırdıklarının farkında olmadan try bloğunu kaldırabilir, bu yüzden şu anda bir tür anti-patern, ama yapılabilmesi ilginç.
Zorunlu dillerdeki herhangi bir döngüyü özyineleme olarak ifade edebilirsiniz. Nesneler ve değişkenler değişmez yapılabilir. Yan etkileri en aza indirmek için işlemler yazılabilir (bir bilgisayarda gerçek bir fonksiyonun mümkün olmadığını iddia edersem - yürütülmesi için geçen süre ve tükettiği işlemci / disk / sistem kaynakları kaçınılmaz yan etkilerdir). Bazı işlevsel diller, hepsi nesne yönelimli işlemlerin tümü değilse bile birçok şey yapabilir. Bazı dillerin belirli kalıpları (değiştirilebilir alanlar gibi) önleyen kısıtlamaları olsa da (değişkenlerin güncellenmesine izin vermemek gibi) karşılıklı olarak dışlayıcı olmak zorunda değillerdir.
Bana göre, nesne yönelimli programlamanın en yararlı kısımları veri gizleme (enkapsülasyon), yeterince benzer nesnelere aynı şekilde (polimorfizm) davranmak ve verilerinizi ve bu veriler üzerinde birlikte çalışan yöntemleri (nesneler / sınıflar) toplamaktır. Kalıtım, OOP'un amiral gemisi olabilir, fakat benim için en az önemli ve en az kullanılan kısım.
İşlevsel programlamanın en kullanışlı kısımları değişmezlik (değişkenler yerine belirteçler / değerler), işlevler (yan etki yok) ve kapaklardır.
Nesne yönelimli olduğunu sanmıyorum, ancak bilgisayar bilimindeki en yararlı şeylerden birinin bir arabirim bildirme becerisi olduğunu ve sonra da bu işlevi uygulayan çeşitli işlevsellik ve verilere sahip olduğunu söylemeliyim. Ayrıca çalışacak birkaç değişken veriye sahip olmayı seviyorum, bu yüzden tüm program tasarımlarımdaki değişkenliği ve yan etkileri sınırlandırmaya çalışmama rağmen, sadece işlevsel dillerde tamamen rahat değilim.