ความเป็นมา:ฉันเป็นผู้สนับสนุนการเขียนโปรแกรมฟังก์ชั่นที่ทำงานที่ร้าน VB.NET ซึ่งรูปแบบจิตที่แพร่หลายคือการเขียนโปรแกรมที่จำเป็น การเป็นรากฐานของระบบของเราคือ WinForms ฉันสามารถเข้าใจได้ว่าเราจะไม่หนีจากการเขียนโปรแกรมที่จำเป็นทั้งหมด แต่ฉันก็ยังพยายามใช้ FP (หลัก ๆ ผ่าน Linq) ทุกที่ที่ทำได้เพราะฉันเชื่อในข้อดีของมัน
อาร์กิวเมนต์ & การโต้แย้งแย้งกับ FP
บางคนอาจสังเกตเห็นว่าความคล่องแคล่วของ Linq นั้นมีประสิทธิภาพน้อยกว่าคู่ที่จำเป็นในลักษณะนี้จะประมวลผลลำดับลงไปที่ลำดับอื่นและทำซ้ำนั้น โดยทั่วไปมันจะใช้เวลาอีกสองสามครั้งกว่าวิธีการที่จำเป็นซึ่งสามารถปรับให้เหมาะสมได้ดีกว่าเพื่อหลีกเลี่ยงการทำซ้ำซ้ำในลำดับ ด้วยเหตุนี้ผู้นำจึงไม่เข้าใจว่าทำไมฉันจึงเลือกวิธีการใช้งานที่ชัดเจนว่า "มีประสิทธิภาพน้อยลง"
- การโต้แย้ง : ฉันแย้งว่าในขณะที่บางครั้งมันมีประสิทธิภาพน้อยกว่าในแง่ของรอบการทำงานของ CPU แต่ฉันรู้สึกว่ามันเป็นสิ่งที่เข้าใจง่ายและเป็นมนุษย์มากกว่าเพราะแต่ละบรรทัดทำสิ่งเดียวที่ผ่านไปตามลำดับ สำหรับฉันนี้รู้สึกเหมือนมีสายการประกอบที่แต่ละคนที่สถานีของเขามีเพียงงานเดียวที่จะทำ ฉันรู้สึกว่าการแลกเปลี่ยนที่มีประสิทธิภาพน้อยมากได้รับการตอบแทนด้วยรหัสที่มีข้อกังวลแยกออกจากกันอย่างเรียบร้อย
ข้อโต้แย้งต่อไปกับ FP ที่ฉันได้ยินในร้านค้าของฉันคือการ debug ยากขึ้นซึ่งเป็นเรื่องจริง ไม่ใช่เรื่องง่ายที่จะเหยียบรหัส Linq และบางครั้งฉันก็ต้องคลี่คลายห่วงโซ่วิธีการเพื่อติดตามและแยกแยะปัญหาที่ฉันไม่สามารถมองเห็นได้ทันที
- _Counter-argument: ส่วนใหญ่แม้ว่าฉันจะไม่ได้มีปัญหากับเรื่องนี้เพราะฉันคิดว่ารูปแบบการทำงานนั้นมีความชัดเจนในการอ่านและเมื่อมีข้อผิดพลาดเกิดขึ้นในห่วงโซ่การทำงานฉันมักจะเห็นปัญหาทันที
คำถามของฉัน
ฉันพยายามโปรโมตสไตล์การใช้งานในร้านของเราและฉันไม่รู้สึกว่ากำลังทำอะไรอยู่ ฉันทำทั้งสองรูปแบบของการเขียนโปรแกรมและเพิ่งขลุกอยู่ใน Haskell เมื่อไม่นานมานี้ แม้จะมีประสบการณ์ที่จำเป็นมาหลายปี แต่ตอนนี้ฉันใช้ FP ใน JavaScript เป็นประจำ แต่มันก็ทำให้ฉันโตขึ้น มันบันทึกความถูกต้องในแกนกลางของฉันเมื่อฉันเปรียบเทียบกับสิ่งที่ฉันอาจทำถ้าฉันติดอยู่กับสไตล์ที่จำเป็น ฉันฝึกสมองของฉันต่อการคิดเชิงหน้าที่
สิ่งที่ฉันไม่เข้าใจคือความยากลำบากในการโน้มน้าวใจผู้อื่นจากข้อดีของ FP
ตัวอย่างเช่นนักพัฒนาในร้านของฉันใช้ Linq แต่ฉันคิดว่าพวกเขามักจะใช้มันในบริบทของการจัดการกับข้อมูลโดเมน ฉันใช้มันในความหมายทั่วไปมากกว่าและชอบได้ทุกเวลาที่ฉันต้องจัดการกับลำดับ / รายการหรือโครงสร้างข้อมูลถาวร ฉันไม่สามารถโน้มน้าวให้เพื่อนร่วมทีมของฉันขยายการใช้ Linq ได้
สิ่งที่ฉันพยายามทำความเข้าใจคือสิ่งที่ทำให้นักพัฒนาไม่ชอบ FP
ฉันต้องการเห็นคำตอบจากคนที่มีประสบการณ์เกี่ยวกับ FP เป็นอย่างมาก แต่ตัดสินใจเลือกสไตล์ที่จำเป็น อะไรทำให้การตัดสินใจอยู่กับความจำเป็นแทนที่จะใช้ฟังก์ชั่น
นี่คือตัวอย่างเพิ่มเติมที่เน้นความแตกต่างระหว่างการเขียนโปรแกรมที่จำเป็นและมีประโยชน์
ฉันเขียนSelectedRows
วิธีการของตารางของเราใน Linq เช่น:
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
อย่างไรก็ตามโค้ดรูปแบบนี้ทำให้นักพัฒนาของเราบางคนรู้สึกไม่สบายใจและโอกาสในการขายของเราจึงเขียนใหม่ให้คุ้นเคยมากขึ้น:
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