कार्यात्मक प्रोग्रामिंग पर अनिवार्य प्रोग्रामिंग क्यों पसंद की जाती है? [बन्द है]


13

पृष्ठभूमि: मैं कार्यात्मक प्रोग्रामिंग का प्रस्तावक हूं जो VB.NET की दुकान पर काम करता है जहां प्रचलित मानसिक मॉडल अनिवार्य प्रोग्रामिंग है। हमारे सिस्टम की नींव होने के नाते WinForms मैं समझ सकता हूं कि हम अनिवार्य प्रोग्रामिंग से पूरी तरह से दूर नहीं होने जा रहे हैं, लेकिन फिर भी मैं एफपी (मुख्य रूप से लिनक के माध्यम से) का उपयोग करने की कोशिश करता हूं जहां भी संभव हो, क्योंकि मुझे इसकी खूबियों पर विश्वास है।

एफपी के खिलाफ तर्क और प्रतिवाद

  1. एक व्यक्ति यह देख सकता है कि धाराप्रवाह लिनाक अपने अनिवार्य समकक्ष की तुलना में कम कुशल है कि यह शैली एक अनुक्रम को दूसरे अनुक्रम में ले जाती है और उसे दोहराती है। आम तौर पर, इसकी अनिवार्यता से कुछ और गुजरने की संभावना होती है जो एक अनुक्रम में दोहराने से बचने के लिए बेहतर अनुकूलित हो सकती है। इस कारण से, लीड समझ नहीं पा रहा था कि मैं एक कार्यात्मक दृष्टिकोण क्यों चुनूंगा जो स्पष्ट रूप से "कम कुशल" है।

    • प्रतिवाद : मैंने तर्क दिया कि सीपीयू चक्रों के संदर्भ में कभी-कभी यह कम कुशल होता है, कि मुझे लगा कि यह अधिक मानवीय रूप से समझदार और आसान है क्योंकि प्रत्येक पंक्ति अनुक्रम के ऊपर से गुजरती है। मेरे लिए ऐसा लगता है कि एक असेंबली लाइन है जहाँ उनके स्टेशन के प्रत्येक व्यक्ति के पास बस एक काम है। मुझे लगता है कि दक्षता के नगण्य व्यापार को कोड द्वारा फिर से बनाया गया है, जिनकी चिंताओं को बड़े करीने से अलग किया गया है।
  2. एफपी के खिलाफ अगला तर्क जो मैं अपनी दुकान में सुनता हूं, वह यह है कि डीबग करना कठिन है - जो सच है। लिनक कोड पर कदम रखना आसान नहीं है। और मुझे कभी-कभी बेहतर तरीके से पालन करने और विघटित करने के लिए एक विधि श्रृंखला को खोलना पड़ता है जिसे मैं तुरंत हाजिर नहीं कर सकता।

    • _-मुठभेड़-तर्क: हालांकि अधिकांश भाग के लिए मेरे पास यह मुद्दा नहीं है क्योंकि मुझे लगता है कि कार्यात्मक शैली अधिक घोषित है कि यह कैसे पढ़ता है और जब एक कार्यात्मक श्रृंखला के भीतर कोई त्रुटि होती है, तो मैं आमतौर पर इस मुद्दे को तुरंत हल कर सकता हूं।

मेरा प्रश्न

मैं अपनी दुकान में कार्यात्मक शैली को बढ़ावा देने की कोशिश कर रहा हूं और मुझे ऐसा नहीं लगता कि मैं हेडवे बना रहा हूं। मैंने प्रोग्रामिंग की दोनों शैलियों को किया है और हाल ही में हास्केल में डब किया है। वर्षों के अनुभवजन्य अनुभव के बावजूद, अब जब मैं जावास्क्रिप्ट में एफपी का नियमित उपयोग कर रहा हूं, तो यह मुझ पर उगाया जाता है। यह मेरे कोर में सही होने की सूचना देता है जब मैं इसकी तुलना करता हूं कि अगर मैं एक अनिवार्य शैली से जुड़ा हुआ हूं तो मैं क्या कर सकता हूं। मैंने अपने मस्तिष्क को कार्यात्मक सोच की ओर, कार्यात्मक रचना की ओर फिर से पकड़ लिया है।

मैं यह नहीं समझ सकता कि एफपी की खूबियों के बारे में दूसरों को यकीन दिलाना कितना कठिन है।

उदाहरण के लिए, मेरी दुकान के डेवलपर्स Linq का उपयोग करते हैं, लेकिन मुझे लगता है कि वे आम तौर पर डोमेन डेटा से निपटने के संदर्भ में इसका उपयोग करते हैं। मैं इसे और अधिक सामान्य अर्थों में उपयोग करता हूं और इसे कभी भी पसंद करता हूं कि मैं अनुक्रमों / सूचियों या लगातार डेटा संरचनाओं के साथ काम कर रहा हूं। मैं अपने साथियों को लिनक के उपयोग के बारे में समझाने में सक्षम नहीं हुआ।

क्या मैं समझने की कोशिश कर रहा हूं कि क्या एक डेवलपर एफपी को पसंद नहीं करता है।

मैं किसी ऐसे व्यक्ति से जवाब देखना चाहता हूं जिसे एफपी के साथ अच्छा अनुभव है, लेकिन उसने अनिवार्य शैली के पक्ष में फैसला किया। कार्यात्मक का उपयोग करने के बजाय अनिवार्य के साथ रहने का निर्णय क्या है?


यहाँ एक अतिरिक्त उदाहरण अनिवार्य और कार्यात्मक प्रोग्रामिंग के बीच अंतर को उजागर करता है।

मैंने SelectedRowsअपने ग्रिड की विधि इस प्रकार लिखी है :

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

मुझे कार्यात्मक प्रोग्रामिंग पसंद है, लेकिन कोड पर एक त्वरित नज़र से मैं "अनिवार्य" (मैं घोषणात्मक ) दृष्टिकोण को पसंद करूंगा । यह पढ़ना मेरे लिए बहुत आसान है - प्रदान किया गया यह मेरा अनुभव हो सकता है और मेरे पर्यावरण का उत्पाद हो सकता है। उस ने कहा, 5 सेकंड की तेज गति से मैं प्रीप स्टेप्स देख सकता हूं और क्या लौटा रहा हूं। मैं देख सकता हूँ कि वहाँ एक लूप है और यह जानते हैं कि उस डेटा में समायोजन होने की संभावना इसके भीतर होने की तुलना में अधिक होगी। मुझे फंक्शन परिभाषाओं को ट्रैक नहीं करना है; यह वहाँ है, यह सरल है। लेकिन FP साफ-सुथरा है और एक बार सीखने की अवस्था को पार कर लेता है, शायद कोड के रूप में जल्दी होगा।
Vol7ron

यह सीखने की अवस्था है जो कि मुद्दा है, खासकर जब लोगों के साथ काम करना जो केवल कई भाषाओं के "बस पर्याप्त" जानते हैं। अगर किसी विशेष भाषा में विशेषज्ञता है तो मुझे यकीन है कि FP एक बेहतर पहला प्रयास होगा। फिर अगर अक्षमताएं (इकाई परीक्षण प्रदर्शन) थीं, तो कोई उनके कार्यान्वयन में अधिक स्पष्ट हो सकता है।
Vol7ron

जवाबों:


11

अनुभवहीन प्रोग्रामिंग केवल अनुभवहीन प्रोग्रामर के लिए बहुत जटिल है । उदाहरणों में से एक यह है , जहां छात्रों ने घोषित किया कि चार-स्तरीय एफपीओ एनालॉग की तुलना में 30-एलओसी गड़बड़ समझने में आसान और अधिक सहज था।

(यह एफपी उदाहरण का मूल संस्करण है, क्योंकि लिंक में उत्तर को हाल ही में संपादित किया गया है ताकि इसे पढ़ने में थोड़ा आसान हो सके।)

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)));

कार्यात्मक प्रोग्रामिंग के लिए हमारे कोड के तरीके और इस कोड को निष्पादित करने के तरीके के बारे में सोचने के एक अलग तरीके की आवश्यकता होती है। यह शायद ही कभी जिस तरह से छात्रों को कॉलेज में बताया गया है, और एक बार बुरी आदतों को लेने के बाद, उन्हें बदलना मुश्किल है।

कार्यात्मक प्रोग्रामिंग की अपनी विशिष्ट विशेषताएं भी हैं जो शुरुआती लोगों के हाथों में जोखिम भरी हो सकती हैं । आलसी मूल्यांकन उनमें से एक है, और यह समझने में महीनों पहले लग सकते हैं कि क्यों आलसी मूल्यांकन एक उत्कृष्ट विशेषता है, और एक झुंझलाहट नहीं है।

यही कारण है कि इतने सारे शुरुआती लोग PHP जैसी भाषाओं के साथ प्रोग्रामिंग करना शुरू करते हैं न कि हास्केल जैसी भाषाओं के साथ।


8
मेरे पास एक विश्वविद्यालय में विपरीत अनुभव है जहां स्कीम का उपयोग इंट्रो कोर्स के लिए किया जाता है। जब छात्रों को जावा या सी # सीखना होता था, तो सबसे ज्यादा शिकायत होती थी कि यह योजना अधिक पठनीय थी
डैनियल ग्रैज़र

2
जो मेरी बात साबित करता है। जिन छात्रों ने वर्षों के लिए अनिवार्य प्रोग्रामिंग और OOP सीखा, उन्हें यह अधिक पठनीय लगेगा। जिन लोगों ने एफपी के साथ शुरुआत की, वे इसे अनिवार्य प्रोग्रामिंग की तुलना में अधिक पठनीय पाएंगे। यह जानना दिलचस्प होगा कि छात्रों के साथ क्या होता है जो समान रूप से अच्छी तरह से एफपी और गैर-एफपी प्रतिमान जानते हैं।
आर्सेनी मूरज़ेंको

1
मुख्य समस्या यह है कि कार्यात्मक भाषाएँ बहुत अधिक हैं। जब एक हास्केलर आपको बताता है कि आप याददाश्त से बाहर भाग गए हैं क्योंकि आपने बिना पके हुए थक्के जमा किए हैं तो निश्चित रूप से कुछ गड़बड़ है। जब वे एक कार्यात्मक शैली में लिखे जाते हैं तो बहुत सारे एल्गोरिदम कुशल नहीं होते हैं। आप एक तेज़ क्विकॉर्ट इम्प्लांट लागू नहीं कर सकते। मुहावरेदार हास्केल में। हर इन-प्लेस एल्गोरिथ्म अच्छा प्रदर्शन प्राप्त करने के लिए IO सरणियों को करने में समाप्त होता है। कार्यात्मक भाषाएं भाषा के शुद्धतावादियों के लिए होती हैं, अनिवार्य भाषाएं उन लोगों के लिए होती हैं, जो समय पर सोच समझ कर काम करना चाहते हैं।
क्रि

3
@ Kr0e: एक भाषा या प्रतिमान के खिलाफ "सार बहुत अधिक" तर्क मुझे हमेशा अजीब लगता है। सभी (या अधिकांश) भाषाओं के खिलाफ एक ही तर्क का उपयोग किया गया था; उम्मीद है, आज अधिकांश सॉफ्टवेयर असेंबलर में नहीं लिखे गए हैं।
आर्सेनी मूरज़ेंको

6
"कार्यात्मक भाषाएं भाषा के शुद्धतावादियों के लिए होती हैं, अनिवार्य भाषाएं उन लोगों के लिए होती हैं जो समय के साथ विचार करना चाहते हैं।": मेरे अनुभव के अनुसार यह सच नहीं है। मैं कार्यात्मक भाषाओं का उपयोग करके चीजों को अधिक तेज़ी से प्राप्त कर सकता हूं। इम्पीरेटिव स्टाइल बहुत अधिक वर्बोज़ और कम डिक्लेरेटिव है और जब मुझे एक अनिवार्य भाषा का उपयोग करना होता है तो निश्चित रूप से मुझे चीजों को सही करने से पहले अधिक पुनरावृत्तियों की आवश्यकता होती है।
जियोर्जियो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.