Latar Belakang: Saya pendukung pemrograman fungsional yang bekerja di toko VB.NET di mana model mental yang berlaku adalah pemrograman imperatif. Menjadi fondasi dari sistem kami adalah WinForms, saya dapat memahami bahwa kami tidak akan sepenuhnya menjauh dari pemrograman imperatif, tetapi tetap saya mencoba menggunakan FP (terutama melalui Linq) sedapat mungkin karena saya percaya pada manfaatnya.
Argumen & kontra-argumen melawan FP
Orang mungkin memperhatikan bahwa Fasih Linq kurang efisien daripada rekan imperatifnya dalam gaya ini memproses urutan ke urutan lain dan mengulanginya. Secara umum, ini akan mengambil beberapa lintasan lebih banyak daripada pendekatan imperatif yang dapat dioptimalkan lebih baik untuk menghindari lintasan berulang pada suatu urutan. Untuk alasan ini, pemimpin tidak dapat memahami mengapa saya memilih pendekatan fungsional yang jelas "kurang efisien."
- Kontra-argumen : Saya berpendapat bahwa meskipun kadang-kadang kurang efisien dalam hal siklus CPU, saya merasa lebih dapat dipahami secara manusiawi dan mudah diikuti karena setiap baris hanya melakukan satu hal saat melewati urutan. Bagi saya ini terasa seperti memiliki jalur perakitan di mana setiap orang di stasiunnya hanya memiliki satu pekerjaan untuk dilakukan. Saya merasa bahwa pertukaran efisiensi yang dapat diabaikan dikompensasi oleh kode yang kekhawatirannya dipisahkan dengan rapi.
Argumen berikutnya terhadap FP yang saya dengar di toko saya adalah bahwa lebih sulit untuk debug - yang benar. Tidak mudah untuk melangkahi kode Linq. Dan saya kadang-kadang harus mengurai rantai metode untuk mengikuti dan membedah masalah yang saya tidak bisa segera temui.
- _Counter-argumen: Sebagian besar meskipun saya tidak memiliki masalah dengan ini karena saya pikir gaya fungsional lebih deklaratif dalam cara membaca dan ketika kesalahan dilemparkan dalam rantai fungsional, saya biasanya dapat segera menemukan masalah.
Pertanyaan saya
Saya sudah mencoba mempromosikan gaya fungsional di toko kami dan saya tidak merasa sedang mengalami kemajuan. Saya telah melakukan kedua gaya pemrograman dan baru-baru ini mencoba-coba Haskell. Terlepas dari pengalaman bertahun-tahun yang penting, sekarang saya menggunakan FP secara rutin dalam JavaScript, sudah saya miliki. Itu berdering nada kebenaran di inti saya ketika saya membandingkannya dengan apa yang mungkin saya lakukan jika saya tetap pada gaya imperatif. Saya telah melatih kembali otak saya ke arah pemikiran fungsional, ke arah komposisi fungsional.
Yang tidak bisa saya pahami adalah betapa sulitnya meyakinkan orang lain tentang manfaat FP.
Sebagai contoh, para pengembang di toko saya memang menggunakan Linq, tapi saya pikir mereka umumnya menggunakannya dalam konteks berurusan dengan data domain. Saya menggunakannya dalam arti yang lebih umum dan lebih suka kapan saja saya berurusan dengan urutan / daftar atau struktur data yang persisten. Saya belum bisa meyakinkan rekan tim saya untuk memperluas penggunaan Linq.
Apa yang saya coba pahami adalah apa yang menyebabkan pengembang tidak menyukai FP.
Saya ingin melihat jawaban dari seseorang yang memiliki banyak pengalaman dengan FP tetapi memutuskan mendukung gaya imperatif. Apa yang mendorong keputusan untuk tetap menggunakan imperatif alih-alih menggunakan fungsional?
Berikut adalah contoh tambahan yang menyoroti perbedaan antara pemrograman imperatif & fungsional.
Saya menulis SelectedRows
metode grid kami di Linq sebagai berikut:
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
Namun, gaya kode ini membuat beberapa pengembang kami merasa tidak nyaman dan karenanya pemimpin kami menulis ulang untuk yang lebih akrab:
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