Zorunlu programlama işlevsel programlamaya göre neden tercih edilir? [kapalı]


13

Arka plan: Geçerli zihinsel modelin zorunlu programlama olduğu bir VB.NET mağazasında çalışan fonksiyonel programlamanın savunucusuyum. Sistemimizin bu temeli WinForms olduğundan, zorunlu programlamadan tamamen uzaklaşmayacağımızı anlayabiliyorum, ancak yine de FP'yi (öncelikle Linq aracılığıyla) mümkün olan her yerde kullanmaya çalışıyorum çünkü onun özelliklerine inanıyorum.

FP'ye karşı argümanlar ve karşı argümanlar

  1. Akıcı Linq'in zorunlu karşıtlığından daha az verimli olduğu fark edilebilir, çünkü bu tarz bir sekansı başka bir sekansa indirir ve tekrarlar. Genel olarak, bir dizi üzerinden tekrar geçişlerini önlemek için daha iyi optimize edilebilen zorunlu yaklaşımdan birkaç geçiş daha alacaktır. Bu nedenle, lider neden açıkça "daha az verimli" işlevsel bir yaklaşım seçeceğimi anlayamadı.

    • Karşı argüman : CPU döngüleri açısından bazen daha az verimli olsa da, her satırın sekans üzerinden geçişinde sadece bir şey yaptığı için insanca anlaşılır ve takip edilmesi kolay olduğunu düşündüm. Bana göre bu, istasyonundaki herkesin yapacak tek bir işi olduğu bir montaj hattına sahip olmak gibi. Verimlilik ihmal edilebilir ticaret kaygıları düzgün ayrılmış kod tarafından telafi hissediyorum.
  2. Dükkanımda duyduğum FP'ye karşı bir sonraki argüman, hata ayıklamanın daha zor olduğu - ki bu doğru. Linq kodunun üzerinden geçmek kolay değil. Ve bazen hemen tespit edemediğim sorunları daha iyi takip etmek ve incelemek için bir yöntem zincirini çözmek zorundayım.

    • _Counter-argüman: Çoğunlukla bununla ilgili bir sorunum olmasa da, işlevsel stilin nasıl okunduğunda daha açıklayıcı olduğunu ve bir fonksiyonel zincir içinde bir hata atıldığında, genellikle sorunu hemen tespit edebileceğimi düşünüyorum.

Benim sorum

Dükkanımızda fonksiyonel stili tanıtmaya çalışıyorum ve ilerleme kaydettiğimi hissetmiyorum. Her iki programlama tarzını da yaptım ve Haskell'de son zamanlarda göz gezdirdim. Yıllarca süren zorunlu deneyime rağmen, şimdi JavaScript'te FP'yi rutin olarak kullandığım için, bu benim üzerimde büyüdü. Zorunlu bir stile yapışırsam çekirdiklerimle karşılaştırdığımda çekirdeğimde bir doğruluk notu çalar. Beynimi işlevsel düşünceye, işlevsel bileşime doğru yeniden eğittim.

Anlayamadığım şey, FP'nin değerlerini başkalarına ikna etmenin ne kadar zor olduğudur.

Örneğin, mağazamdaki geliştiriciler Linq kullanıyorlar, ancak genellikle etki alanı verileriyle ilgilenmek bağlamında kullandıklarını düşünüyorum. Daha genel anlamda kullanıyorum ve diziler / listeler veya kalıcı veri yapıları ile uğraştığımda her zaman tercih ediyorum. Takım arkadaşlarımı Linq kullanımını genişletmeye ikna edemedim.

Anlamaya çalıştığım şey, bir geliştiricinin FP'yi sevmemesine neden olan şey.

FP ile iyi deneyime sahip ancak zorunlu stil lehine karar veren birinden bir cevap görmek istiyorum. İşlevsel kullanmak yerine zorunlu olarak kalma kararını ne çekti?


Zorunlu ve fonksiyonel programlama arasındaki farkları vurgulayan ek bir örnek.

SelectedRowsLinq ızgaramızın yöntemini şöyle yazdım :

Public Property SelectedRows() As DataRow() Implements IDataSourceControl.SelectedRows
    Get
        Return Me.ugrBase.Selected.Rows.
            OfType(Of Infragistics.Win.UltraWinGrid.UltraGridRow)().
            Select(Function(ugr) ugr.ListObject).
            OfType(Of DataRowView)().
            Select(Function(drv) drv.Row).
            ToArray
    End Get

Ancak, bu kod stili bazı geliştiricilerimizi rahatsız ediyor ve bu nedenle liderimiz bunu daha tanıdık olarak yeniden yazdı:

Public Property SelectedRows() As DataRow() Implements IDataSourceControl.SelectedRows
    Get
        Dim plstRows As New List(Of DataRow)
        For Each bugrLoop As Infragistics.Win.UltraWinGrid.UltraGridRow In Me.ugrBase.Selected.Rows
            If bugrLoop.ListObject IsNot Nothing Then
                plstRows.Add(CType(bugrLoop.ListObject, DataRowView).Row)
            End If
        Next
        Return plstRows.ToArray()
    End Get

Fonksiyonel programlamayı seviyorum, ancak koda hızlıca baktığımda “zorunlu” ( deklaratif olarak adlandırıyorum ) yaklaşımını tercih ederim . Okumam çok daha kolay - bunun benim deneyimim ve ortamımın bir ürünü olması olabilir. Bununla birlikte, 5 saniyeden kısa bir sürede hazırlık adımlarını ve nelerin geri döndüğünü görebiliyorum. Bir döngü olduğunu görebiliyorum ve bu verilerde yapılan ayarlamaların, içinde muhtemelen daha fazla olacağını biliyorum. İşlev tanımlarını izlemek zorunda değilim; orada, basit. Ancak FP daha temiz ve öğrenme eğrisini geçtikten sonra, muhtemelen kodlamak kadar hızlı olurdu.
vol7ron

Sorun, özellikle birçok dilin “yeterli” olduğunu bilen insanlarla çalışırken öğrenme eğrisidir. Herhangi bir dilde uzmanlaşmak durumunda FP'nin daha iyi bir ilk girişim olacağından eminim. Daha sonra verimsizlikler olsaydı (birim test performansı), uygulamalarında daha açık olabilir.
vol7ron

Yanıtlar:


11

Fonksiyonel programlama deneyimsiz programcılar için çok karmaşıktır . Örneklerden biri , öğrencilerin 30-LOC karışıklığının dört hat FP analoguna kıyasla daha kolay ve daha sezgisel olduğunu beyan ettiği yerdir.

(Bu, bağlantının yanıtının okunmasını biraz daha kolay hale getirmek için daha yakın zamanda düzenlendiğinden, FP örneğinin orijinal sürümüdür.)

return this.Data.Products
    .Where(c => c.IsEnabled)
    .GroupBy(c => c.Category)
    .Select(c => new PricesPerCategory(category: c.Key, minimum: c.Min(d => d.Price), maximum: c.Max(d => d.Price)));

İşlevsel programlama, kodlama şeklimiz ve bu kodun nasıl yürütüldüğü hakkında farklı bir düşünme yöntemi gerektirir. Bu nadiren öğrencilere üniversitede söyleniş biçimidir ve kötü alışkanlıklar alındıktan sonra bunları değiştirmek zordur.

Fonksiyonel programlama, yeni başlayanların elinde riskli görünebilecek kendine özgü özelliklere de sahiptir . Tembel değerlendirme bunlardan biridir ve tembel değerlendirmenin neden bir sıkıntı değil mükemmel bir özellik olduğunu anlamaya başlamadan aylar alabilir.

Bu yüzden birçok yeni başlayan, Haskell gibi dillerle değil, PHP gibi dillerle programlamaya başlar.


8
Şemaya giriş dersi için kullanılan bir üniversitede tam tersi deneyim yaşadım. Öğrenciler Java veya C # öğrenmek zorunda
kaldıklarında

2
Bu benim açımdan kanıtlıyor. Yıllarca zorunlu programlama ve OOP öğrenen öğrenciler bunu daha okunabilir bulurlardı. FP ile başlayan kişiler, zorunlu programlamaya kıyasla daha okunabilir bulacaklardır. Aynı derecede iyi FP ve FP olmayan paradigmaları bilen öğrencilerle neler olacağını bilmek ilginç olurdu.
Arseni Mourzenko

1
Temel sorun fonksiyonel dillerin çok fazla soyutlanmasıdır. Haskeller hafızanız bittiğini söylediğinde, değerlendirilmemiş gövdeler biriktirdiğinizde, kesinlikle yanlış bir şey var. Birçok algoritma işlevsel bir tarzda yazıldığında verimli değildir. Hızlı bir Quicksort impl uygulayamazsınız. deyimsel Haskell. Her yerinde algoritma, iyi performans elde etmek için IO dizileri yapmakla sonuçlanır. İşlevsel diller dil meraklıları içindir, zorunlu diller zaman içinde düşünmek isteyen insanlar içindir.
Kr0e

3
@ Kr0e: bir dile veya paradigmaya karşı “çok fazla özet” iddiası bana her zaman garip geliyor. Aynı argüman tüm (veya çoğu) dillere karşı kullanıldı; umarım çoğu yazılım bugün Assembler'da yazılmamıştır.
Arseni Mourzenko

6
"İşlevsel diller dil meraklıları içindir, zorunlu diller zamanında düşünmek isteyen insanlar içindir.": Deneyimlerime göre bu doğru değil. İşlevsel dilleri kullanarak işleri daha çabuk halledebilirim. Zorunlu stil çok daha ayrıntılı ve daha az açıklayıcıdır ve zorunlu bir dil kullanmam gerektiğinde, işleri doğru yapmadan önce kesinlikle daha fazla tekrarlamaya ihtiyacım var.
Giorgio
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.