2009-04-28 7 views
7

मैं मानता हूं कि मैंने अभी तक एफ # ग्रोक नहीं किया है। लेकिन 30,000 फुट विवरणों में, वे उस कोड का परीक्षण करने में आसान रहते हैं जिसमें परिवर्तनीय स्थिति नहीं है। क्या यह स्थिर तरीकों के समान है?क्या मुझे सी # में अधिक स्थिर तरीकों का उपयोग करके कार्यात्मक प्रोग्रामिंग (एफ #) के समान लाभ मिल सकते हैं?

क्या मुझे सभी स्थिर तरीकों के साथ कक्षाओं में अपने कुछ कोड लिखकर एफ # का लाभ मिल सकता है?

मैं सिर्फ संक्षिप्त उत्तर की तलाश में हूं, मुझे पता है कि इस विषय पर पूरी किताबें मौजूद हैं।

उत्तर

8

आप निश्चित रूप से सी # कोड लिख सकते हैं, लेकिन स्थिर कार्यों के साथ ऐसा करने के लिए कुछ भी नहीं है। अपरिवर्तनीयता ऐसी संरचना या वस्तु जैसी चीजें हैं जो स्वयं की प्रति बनाकर और प्रतिलिपि बनाकर केवल "राज्य बदलती है"।

3

नहीं, यह स्थैतिक तरीकों के समान नहीं है। यदि आप प्रारंभ किए जाने के बाद कुछ भी (स्थानीय, फ़ंक्शन तर्क, स्थिर फ़ील्ड, इंस्टेंस फ़ील्ड) असाइन नहीं करते हैं तो आपके पास परिवर्तनीय स्थिति नहीं है। आप अपने वर्गों को अपरिवर्तनीय बनाने के द्वारा कुछ लाभ प्राप्त कर सकते हैं।

8

बिलकुल नहीं, अपरिवर्तनीयता के पास स्थैतिक या उदाहरण होने के तरीकों से कोई लेना देना नहीं है। String, एक अपरिवर्तनीय वर्ग होने के कारण, बहुत सारे उदाहरण विधियां हैं, जो कि बहुत ही कार्यात्मक तरीके से, कुछ भी संशोधित करने के बजाय String कक्षा का एक नया उदाहरण लौटाती हैं।

आप कार्यात्मक अपघटन का उपयोग करके F # अनुकरण करने का प्रयास कर सकते हैं, लेकिन यह अभी भी बहुत जरूरी कोड होगा।

+0

हम्म, जो एक और सवाल की ओर जाता है, जिसे मैं अब एसओ पर पूछूंगा। साथ ही - कार्यात्मक अपघटन क्या है? – MatthewMartin

+0

यह सब बहुत आसान है: http://en.wikipedia.org/wiki/Decomposition_(computer_science) –

+0

यह कहता है कि फ़ंक्शंस (आदि) से बने कार्यों का उपयोग करना एक अच्छा डिज़ाइन है। क्या यह कार्यात्मक प्रोग्रामिंग की एक विशेषता है या क्या वे दोनों के नाम पर काम करते हैं? – MatthewMartin

2

नहीं, दोनों अवधारणाएं असंबंधित हैं। सी # में स्टेटिक विधियां अभी भी इनकमिंग ऑब्जेक्ट्स को सामान्य के रूप में संशोधित कर सकती हैं, और रेफ या आउट का उपयोग करके अन्य चर।

5

वस्तुओं के विरुद्ध स्थैतिक, कार्यात्मक मॉड्यूल के अलावा, आप सी # 3 और लैम्बडास, LINQ आदि का उपयोग कर एफ # के कुछ लाभ प्राप्त करने का प्रयास कर सकते हैं। हालांकि, यह बहुत दूर नहीं जाता है। क्या मैं एफ # में अच्छा लगता है:

  • निष्कर्ष हर जगह
  • ऑटो सामान्यीकरण (प्रकार पैरामीटर में कहते हैं तो मैं इसे बाहर मैन्युअल रूप से सॉर्ट करने के लिए नहीं है)
  • आसान अचल स्थिति
  • के बीच आराम से मिश्रण मॉड्यूल और वर्गों
  • प्रकार भेदभाव यूनियनों की तरह
  • पैटर्न मिलान
  • नेस्टेड कार्य (हल्के)
  • प्रथम श्रेणी कार्यों (कोई, सी # के नाम पर रखा गया प्रतिनिधियों गिनती नहीं है)
  • सब कुछ एक अभिव्यक्ति है
  • आसान समारोह रचना

तो, आप सी # में इस में से कुछ करने की कोशिश कर सकते हैं। इसमें से कुछ बस समर्थित नहीं है और काम नहीं करेगा। बाकी बहुत बदसूरत, बहुत तेज़ हो जाता है।

तो, यदि आप LINQ और संख्यात्मक एक्सटेंशन के पीटा पथ से बहुत अधिक जाते हैं, तो आप शायद दर्द की दुनिया में समाप्त हो जाएंगे।

4

मैं तारीख के सभी अन्य उत्तरों से अलग होना चाहता हूं। अपरिवर्तनीयता और स्थैतिक विधियां सख्ती से तकनीकी रूप से संबंधित नहीं हो सकती हैं, लेकिन मुझे पता चला है कि एफ # का उपयोग करने से मुझे सी # विधियों को स्थिर बनाने के लिए प्रोत्साहित किया गया है जब भी मैं कर सकता हूं।

सोच एनालॉग है, जिसमें एक अपरिवर्तनीय वस्तु को संभालना आसान है क्योंकि आपको इसे बदलने के बारे में चिंता करने की ज़रूरत नहीं है। इसी तरह, आपको स्थैतिक विधि का उपयोग करते समय राज्य के बारे में चिंता करने की ज़रूरत नहीं है (जब तक आप वैश्विक सिंगलटन या कुछ उपयोग नहीं करते ...)।

+0

मुझे अस्पष्ट क्यों है कि आप स्थिरता को अपरिवर्तनीयता का प्रतिनिधित्व करना चाहते हैं। उदाहरण के लिए, आप क्यों चाहेंगे: x = string.gsub (y, 'a', 'b') x = y.gsub ('a', 'b') के बजाय। ऐसा लगता है कि अधिकतर बार आपके पास एक अभिनेता होगा, इसलिए आप एक नियमित कार्य करना चाहते हैं। स्थिर कार्य आमतौर पर होते हैं जब कोई स्पष्ट अभिनेता नहीं होता है, जैसे String.cmp (x, y) जो x.cmp (y) से भी बदतर नहीं लगता है। जैसा कि आप उल्लेख करते हैं, निश्चित रूप से अपवाद स्थितियां हैं। –

+1

पूरा सवाल यह है, "क्या मैं इस विधि पर भरोसा कर सकता हूं जो मैं उम्मीद करता हूं?"। यदि आपकी विधि * वास्तव में * कार्यात्मक है, तो इसका नतीजा केवल तर्कों का एक कार्य होगा, न कि किसी अन्य 'बाहरी' राज्य के संदर्भ में। इस मामले में आप केवल तर्कों पर आधारित परीक्षण कर सकते हैं और अपनी विधि को भरोसेमंद मान सकते हैं। इस अर्थ में, यहां तक ​​कि एक गैर स्थैतिक वर्ग के भीतर, यदि मैं उचित रूप से एक विधि स्थिर कर सकता हूं, तो मैं ऐसा करूँगा। – Benjol

1

आईटी सच है। आपको सी # में अधिक स्थिर कार्यों का उपयोग करके कार्यात्मक प्रोग्रामिंग के लाभ प्राप्त नहीं होंगे। हाउवर, यदि आप हुड के नीचे देखना चाहते थे (उदाहरण के लिए, प्रतिबिंबक का उपयोग करके) मैं समझता हूं कि एक सरल लेट स्टेटमेंट एक स्थिर कार्य है। दूसरे शब्दों में,

//F# 
let a = 2 

सी # में एक समारोह

//C# 
static int a() 
{ 
    return 2; 
} 

मैं भ्रम की स्थिति को समझ सकता हूँ की तरह है।

लियोन बामब्रिक की "एफ # आई के लिए सी # गाय प्रेजेंटेशन" से स्पष्टीकरण खींच लिया गया।

संबंधित मुद्दे