İşlevsel programlama , en eski programlama paradigmalarından biridir. Ancak, sektörde daha popüler paradigmalara kıyasla çok kullanılmaz. Ancak, akademi'de büyük ölçüde vurgulanmıştır.
İşlevsel programlamaya karşı en güçlü görüşünüz nedir?
İşlevsel programlama , en eski programlama paradigmalarından biridir. Ancak, sektörde daha popüler paradigmalara kıyasla çok kullanılmaz. Ancak, akademi'de büyük ölçüde vurgulanmıştır.
İşlevsel programlamaya karşı en güçlü görüşünüz nedir?
Yanıtlar:
Sorun en yaygın kod doğal olarak devlet olduğunu içerir - iş uygulamaları, oyunları, UI, vb ile hiçbir problem var bazı bir uygulama tamamen fonksiyonel olmanın parçaları; Aslında çoğu uygulama en az bir alanda fayda sağlayabilir. Ancak paradigmayı her yere zorlamak karşı sezgiseldir.
İşlevsel programlamanın sorunu işlevsel programlamanın kendisi değildir - bunu yapan insanların çoğu (ve daha da kötüsü) içinde bunu yapan dilleri tasarlayanların çoğu.
Sorun, çok akıllı olmasına rağmen (bazen düpdüz parlak) çok fazla insanın, saflık, mükemmellik ve dünyaya yönelik kendi (genellikle oldukça dar) görüşlerini uygulama ve dünyaya programlanma konusunda biraz fanatik olmasından kaynaklanıyor. dil ve onu kullanan herkes.
Sonuçlardan biri uzlaşılamamasıdır. Bu, (diğer şeylerin yanı sıra) kabaca 10.000 dile ve rahatsız edici durumdan yeterince farklı olan lehçelere, ancak birisinin diğerlerine göre gerçekten önemli bir avantaja sahip olması için nadiren yeterince farklı olan lehçelere yol açar. Birçoğu ayrıca gerçek dünyaya bakar ve fonksiyonel modele çok iyi uymadığından temelde sadece yanlış ve en iyi göz ardı edildiğine karar verir.
Uzlaşma yetersizlik da sorunun belirli bir tip (veya sorunların birkaç belirli türleri) için kesinlikle güzel ama gerçekten epeyce dillere yol açmıştır emmek başkalarının bir sürü için. Bunların bir kısmı muhtemelen işlevsel modelin kendisinden kaynaklanıyor, ancak daha çok (en azından benim için) bu alana başlamak için çeken temel kişilik tipinden kaynaklanıyor gibi görünüyor.
Bu bir dizi soruna yol açar. Her şeyden önce, "işlevsel programlama" öğrenmek çoğunlukla felsefi bir değerdir. Diğer dil türlerinin çoğunda, belirli bir türün bir dilini bilmek, bir başkasını öğrenmek için çok önemlidir. Projem XI dilini kullanıyorsa, Y dilini bilen birini (ancak X'i değil) oldukça güvenli bir şekilde işe alabilir. İşlevsel dillerle bu daha az doğru. Erlang'ı çok iyi tanıyor olabilirsin ama yine de Haskell monadlarını tamamen yabancı ve anlaşılmaz buluyorlar.
Dillerin sayısını, aralarında sınırlı yetenek taşınabilirliği ile birleştirin ve çirkin bir durum elde edersiniz: Bir dilin ya da lehçenin, makul bir şekilde genel kullanımı için gereken "kritik kütleyi" oluşturması neredeyse imkansızdır. Bu yavaş yavaş değişiyor, ama çok Linux baskın masaüstü işletim sistemi olma gibi hala - insanlar argümanlar ikna ile gelip, her yıl sonunda bu olacak yıl - ve sadece insanlar gibi her öngörüyor oldum kim onlarca yıl şimdi, yine yanlış olacaklar. Bu, her ikisinin de asla olamayacağı anlamına gelmez - sadece tahminlere bakan ve "bu yıl olmaz" diye düşünen insanların şu ana kadar haklı oldukları kişilerdi.
...roughly 10,000 languages and dialects that are enough different to annoy but only rarely enough different for one to have a truly significant advantage over the others...
Hayır, bu tüm işlemsel dillere benziyor. Java, Scala, Kotlin, C ++, C #, Groovy, Cheddar, ES6, Ceylon, Python, liste uzayıp gidiyor - hepsi gerçek sorunları çözmeyen sadece C sıkıcı yinelemeleri. Bu ranty cevabını tamamlayan benim bence düşüncem: D
Fonksiyonel programlamanın çok yaygın kullanılmamasının sebebi, çok fazla yol almasıdır. Örneğin, Lisp veya Haskell'e ciddi bir göz atmak zor, "bütün bu dil büyük bir soyutlama çevrimidir" demeden. Kodlayıcının gerektiğinde altını çizemediği temel soyutlamaları oluşturduğunuzda, dilin basitçe yapamayacağı şeyleri belirlersiniz ve dil ne kadar işlevsel olursa, sahip olma eğilimi o kadar artar.
Mesela Haskell'i ele alalım. İşlevsel saflık adına, herhangi bir şeyle etkileşime giren her bir bilgisayar programının en temel iki bölümü olan devleti ve G / Ç'yi yönetmek için kimsenin anlamadığı beyin kırma soyutlamaları kullanmanız gerekir ! Bu hızlı yaşlanır.
Tüm saygımla, sorunuzun kötü niyetli olduğunu düşünüyorum. İşlevsel programlama bir araç ya da belirli sorunların çözümü için yararlı bir araç setidir. Bununla ilgili bir görüşe sahip olmak yalnızca belirli bir problem veya uygulama bağlamında anlamlıdır. Genel olarak bu konuda bir görüş sahibi olmak, pense veya anahtarlara karşı bir görüş sahibi olmak gibidir.
Ben uzman olsaydım bile, ticari bir ürün için işlevsel bir dili kullanmamın nedeni, yaygın olarak anlaşılmamasının basit bir nedenidir ve işin büyümesini beklemem durumunda, diğer geliştiricilerin yeteneklerini bulma becerisi konusunda endişeliyim. zaman içinde sürdürülmesi veya uzatılması.
Bu düşünülemez bir şey değildir ve muhtemelen daha yüksek bir geliştirici standardı elde edersiniz, çünkü gerçek bir korsanlık becerisine sahip olmayan bir javaschool mezunu, bu tür bir projede nereden başlayacağını bilemez, ancak yetenekli geliştiricilerin sınırlı havuzu kesinlikle gerekli bir değerlendirme olacaktır. iş açısından.
Market zamanı
Tam bir IT prosedür prosedür kodunu ve mantralarını kaldırmak zor.
her şeyden önce devlet-programlama ve fp ile ilgili herhangi bir tartışmayı kabul etmiyorum. haskell'deki Devlet monadını inceleyin ve devletin kodunuz üzerindeki etkisini değerlendirmek için ilginç yeni yollar bulacaksınız.
fp'ye karşı anlamlı bir tartışma yapacak olsaydım, haskell gibi ciddi bir işlevsel dili öğrenmek, bir formül bir araba kullanmayı öğrenmek gibi bir şey olur… heyecan verici ve eğitici, ancak günlük endüstriyel kodlama için ne yazık ki işe yaramaz çünkü, ortalama olarak İş arkadaşlarınız camrys kullanıyor ve bunu yapmaktan çok mutlular. fp dostu bir ortamda iş bulmak hala çok zordur ve kişi kendi başına grev yapmak veya tanınmış fp uygulayıcılarından bazılarını araştırmak istemiyorsa, bu değişimin olmadığını görüyorum.
Sanırım cevabım bana bir fp fanboy olarak geldi. neden olmamalısınız diye endişelenmeden önce haskell gibi gerçek bir fp dili vermeyi öneriyorum.
Ben büyük bir hayranıyım ve işlevsel programlamanın savunucusuyum. Ama işte noktalarım:
öğrenmesi kolay
python ve ruby gibi programlama dilleri (ve diğer birçok dil) öğrenmesi kolaydır. Gelişmiş fonksiyonel programlama, Haskell, Agda, Coq, ATS, vb. Dillerle öğrenmek oldukça zordur. Bazıları “matematiksel yapısal programlama” terimini kullanır. Eğer kategori teorisi ve soyut matematiğe aşina iseniz kolay, fakat örneğin "monad" lerin ne olduğu hakkında hiçbir fikriniz yoksa, oldukça işe yarar.
bir kodlama dili ile programlama daha fazla verimlilik anlamına gelebilir.
Bazı durumlarda python ve ruby gibi betik dilleri kullanmak daha fazla üretkenliğe yol açabilir. Bu, farklı prototipleri veya kütüphaneleri hızlı prototipleme ve yapıştırma anlamına gelir. Dinamik dilleri kullanmak (örneğin dinamik nesne yönelimli programlama) bu bağlamda iyi bir şey olabilir. Genellikle statik yazma daha iyidir, ancak dinamik türlerle komut dosyası yazmanın olumlu bir etkisi olabilir.
iş ile ilgili konular
Programlama, başarılı bir yazılım projesinin yalnızca küçük bir alt kümesidir. Yazılımın çalışması gerekiyor, kullanıcıların mutlu olması gerekiyor ve bu mutlaka kullanılan programlama diline bağlı değil. Yöneticiler, yeni teknoloji ve programlama dillerini değerlendirirken faydaları ve riskleri düşünmek zorundadır. Yeni programcılar yeni programlama dilini hızlı bir şekilde öğrenebilir mi? Teknolojide şirkette deneyim var mı? Bir risk var mı ve bunun üst yönetimle tartışmak zor olacak mı?
İş bağlamında, işlevsel programlama, çekirdek yazılım bileşenlerine ekleyen sistemlerde, örneğin çok kritik olmayan bileşenlerde kullanılabilir. Örneğin, çekirdek yazılımı zor değiştirecek ancak yeni programlama dilinde yeni parçalar (GUI, izleme yazılımı vb.) Ekleyecek bir banka. (Belki de istisnalar vardır, ama bu benim bankalarla olan deneyimim.)
Ayrıca, resmi doğrulama bir fayda veya şart olduğunda, fonksiyonel programlama çok yararlıdır.
Faydalı bir paradigma olarak FP'ye karşı değilim, ancak programlama dilinde mevcut olan tek paradigmaya karşıyım.
Bir çok problemi çözmede avantajlar sunar. Bununla birlikte, AP C gibi işlemsel dillerde uygulanabilir ve uygulanmıştır.
Yüzlerce çekirdeğe sahip olduğumuzda işlevsellik ortaya çıkacak ve kilitlerin ölçeklenmediğinin farkına varacaksınız. Sonra iç içe geçmiş veriler paralel "büyük demir" programları için gidilecek tek yol olacaktır ve bu konuda işlevsel üstünlükler olacaktır.
FP akademi'de havalıdır, çünkü performansı görmezden gelirken güzel kısa programlar yazmak iyidir. Gerçek dünyada buna karşı bir komplo yok. Ayrıca, örneğin bazı şeyleri uygulamak (örneğin radix sıralaması) FP'de toplam ağrı gibi görünmektedir. Oh ve oluşturulan kod IMHExperience sloooooooooooooooooooooow.
Bazılarının oldukça dik bir öğrenme eğrisi vardır, uzun zaman alırlar (özellikle OOP'dan geliyorsanız; paradigma değişimini almadan önce birkaç kez başınızı gevşetirsiniz).
Fonksiyonel programlamaya başladığım halde (Java'dan geliyor ve Clojure'a gidiyorum) hala oldukça zor buluyorum. Topluluk, Java kadar açık kod yazmıyor.
Anlaşılırlıkta küçük bir kayıp ve karmaşıklıkta küçük bir artış var gibi görünüyor.
İşlevsel programlama dilleri hakkında çok az deneyimim olsa da (bazı Haskell ve Lisp'leri biliyorum) FP paradigmasını çok güçlü ve diğer paradigmalardan daha zarif buluyorum. FP kullanarak ciddi bir proje üzerinde çalışma şansım olsaydı.
FP'nin etkinliği ile ilgili bazı ciddi şüphelerim olan tek alan, endüktif olarak tanımlanamayan karmaşık veri yapılarıyla, örneğin grafiklerle nasıl başa çıkabileceği konusudur. Örneğin, büyük bir grafik üzerinde çalışan, muhtemelen grafiğin içinden geçen ve küçük yerel değişiklikler yapan bir algoritma uygulamak zorunda kalırsam, bir FP yaklaşımının, programın düğümden geçiş yapmasına izin verilen zorunlu bir yaklaşıma uyup uymadığını merak ediyorum. işaretçileri kullanan düğüm.