कार्यात्मक कार्यक्रम कैसे व्यवस्थित करें [बंद]


41

संभावित डुप्लिकेट:
कार्यात्मक प्रोग्रामिंग बनाम OOP कार्यात्मक प्रोग्रामिंग
के साथ प्रबंधनीय कोड कैसे लिखें?

OOP में, कोड के लिए संगठन की आपकी मूल इकाई वर्ग है। जावा, C # और समान भाषाओं में अक्सर उपयोग की जाने वाली कार्यप्रणाली आपके कोड को प्रत्येक वर्ग के लिए एक वर्ग फ़ाइल नाम के साथ फ़ाइल नाम के आसपास व्यवस्थित करने के लिए है।

आप इनमें से प्रत्येक वर्ग को एकल अवधारणा के समूह के लिए संगठन की एक इकाई के रूप में मान सकते हैं।

ये कक्षाएं उन नामस्थानों में हैं जो अक्सर समाधान / परियोजना में फाइलों की निर्देशिका संरचना का पालन करते हैं। नाम स्थान संगठन का एक और स्तर है।

कार्यात्मक भाषाओं में बड़ी परियोजनाएं आमतौर पर कैसे व्यवस्थित होती हैं?

आप कैसे निर्धारित करते हैं कि अपने कार्यों को विभिन्न फाइलों में कैसे विभाजित किया जाए?

क्या फ़ाइलों के पास समूहीकरण की अन्य इकाइयों का उपयोग किया जाता है?

कोड आमतौर पर एक फ़ाइल के भीतर कैसे व्यवस्थित किया जाता है?


18
@ एस.लॉट What's stopping you from...वर्षों और एक पूरी तरह से अलग मानसिकता के साथ प्रोग्रामिंग के वर्ष, इस बिंदु पर कि हास्केल कोड मानसिक रूप से गणना नहीं करता है। और निश्चित रूप से आप मान रहे हैं कि वास्तविक परियोजनाएं हमेशा सही ढंग से और बड़े करीने से व्यवस्थित होती हैं (हो सकता है कि वे हैं, लेकिन मुझे पता है कि मेरे लिए एक noob कैसे है?)
yannis

13
@ S.Lott: मैंने हमेशा OOP में प्रोग्राम किया है। मैंने हाल ही में जिज्ञासा से बाहर कार्यात्मक भाषाओं में डबिंग शुरू कर दी है। आप कहते हैं: "यहाँ क्यों पूछें?"। ए: अनुभव के साथ लोगों से कुछ सलाह और अंतर्दृष्टि प्राप्त करने के लिए (या साइट के रूप में विशेषज्ञ इसे डालते हैं) जो मुझे इस विषय पर बता सकते हैं। क्या इस साइट का उद्देश्य नहीं है? क्या सभी प्रोग्रामर या SO प्रश्नों का उत्तर नहीं दिया जा सकता है: "आप अपने लिए क्यों नहीं खोजते"? जवाब है हां, आप कर सकते हैं। लेकिन सवाल पूछने का कारण किसी ऐसे व्यक्ति से बेहतर / तेज परिणाम प्राप्त करना है जो विषय का विशेषज्ञ है।
गिल्स

5
@ एस.लॉट: यदि वह सिर्फ यादृच्छिक कोड पढ़ता है, तो उसे कैसे पता चलेगा कि जो संगठनात्मक निर्णय उन्होंने किए हैं वे अच्छे हैं या बुरे? और वे अच्छे या बुरे क्यों हैं?
कार्सन63000


4
@ S.Lott संक्षेप में, भाषा या प्रतिमान में एक विशेषज्ञ होने के लिए एक अच्छी तरह से संगठित परियोजना की पहचान करें, किसी भी कमजोरियों / कमियों की पहचान करें जो संगठन में मौजूद हो सकते हैं, और समझा सकते हैं कि कोड पढ़ने और संगठन को देखने की तुलना में कहीं अधिक मूल्यवान क्यों है? इस धारणा के साथ कि यह अच्छी तरह से संरचित है।
थॉमस ओवेन्स

जवाबों:


32

मुझे संदेह है कि यह भाषा पर निर्भर करता है। जहां तक ​​कार्यात्मक प्रोग्रामिंग की बात है, मैंने ज्यादातर हास्केल में डब किया है, इसलिए मैं यह समझाने जा रहा हूं कि यह वहां कैसे काम करता है।

हास्केल कोड को "मॉड्यूल" में व्यवस्थित किया गया है जो मूल रूप से केवल फ़ंक्शन और डेटा प्रकारों का संग्रह है। प्रत्येक मॉड्यूल एक एकल फ़ाइल है। एक मॉड्यूल जावा वर्ग और एक जावा पैकेज के बीच मिश्रण का कुछ है - एक मॉड्यूल क्या करता है इसका सटीक दायरा। एक मॉड्यूल का भी नियंत्रण होता है कि कौन से फ़ंक्शंस और प्रकार के निर्माणकर्ता निर्यात करने के लिए, और कौन से छिपाने के लिए; इस के समान है privateऔर publicजावा में।

अपने स्वयं के कार्यक्रमों में, मुझे मॉड्यूल एक काम करना पसंद है, शब्दार्थ; यह उन्हें एक जावा वर्ग की तरह बनाता है सिवाय इसके कि वे कई डेटा प्रकारों को परिभाषित कर सकते हैं। मानक पुस्तकालय से मैं जिन मॉड्यूल का उपयोग करता हूं, जैसे Data.List, वे पैकेज की तरह अधिक होते हैं - वे समान उपयोगिता कार्यों का एक सेट प्रदान करते हैं। यह भी स्थिर जावा कक्षाओं की तरह ही है java.util.Arrays

मॉड्यूल जावा पैकेज की तरह भी होते हैं, ताकि उन्हें स्पष्टता के लिए नस्ट किया जा सके (मुझे नहीं लगता कि इसका कोड पर कोई प्रभाव पड़ता है)। सामान्य तौर पर, एक ही परियोजना के लिए, मैं इसे एक नाम (कहता हूं Project) देता हूं और मेरे सभी मॉड्यूल इस (जैसे Project.Parseऔर Project.Run) का हिस्सा हैं । यदि मैं कोड लिख रहा था जो कि एक आवेदन की तुलना में पुस्तकालय की तरह अधिक था, तो मैं इसे इस आधार पर व्यवस्थित करूंगा कि यह क्या कर रहा है, जैसे Data.Listया Control.Monad। अन्य भाषाओं से एक बड़ा अंतर यह है कि हास्केल आईओ को सीमित करने और सभी को एक ही स्थान पर रखने के लिए प्रोत्साहित करता है। बड़ी संख्या में मॉड्यूल बिल्कुल भी IO नहीं करते हैं, और किसी भी परियोजना के लिए, मुझे यथासंभव अधिक शुद्ध होने के लिए पसंद है।

एक उदाहरण के रूप में, मैं एक साधारण प्रोग्रामिंग भाषा पर काम कर रहा हूं जिसे मैं टीपीएल कह रहा हूं (बिना किसी अच्छे कारण के)। इसके लिए मैंने दो सरल मॉड्यूल बनाए हैं: TPL.Parseजो भाषा के आंतरिक प्रतिनिधित्व को परिभाषित करता है और इसे कैसे पार्स किया जाता है, और TPL.Runजो दुभाषिया को चलाता है और चर और IO से संबंधित है। वास्तव में कोड को संकलित करने और चलाने के लिए, आमतौर पर एक Mainमॉड्यूल होता है जो कार्यक्रम के प्रवेश बिंदु होने पर समाप्त होता है।

फ़ाइल के भीतर फ़ंक्शन को व्यवस्थित करने में महत्वपूर्ण स्वतंत्रता है; यह वही है जो मुझे करना पसंद है। मैं अपने डेटा प्रकारों को शीर्ष की ओर परिभाषित करता हूं, इससे पहले कि वे कहीं और उपयोग किए जाएं। डेटा प्रकारों को परिभाषित करने के ठीक बाद, मैं उन्हें अपने उपयुक्त टाइपकास्ट का हिस्सा बनाने के लिए जो कुछ भी आवश्यक है उसे लागू करता हूं - यह एक इंटरफ़ेस को लागू करने की तरह है। फिर मैं तर्क और विभिन्न सहायक कार्यों के साथ उपयुक्त के रूप में पालन करता हूं। अंत में, मुझे अपने सभी IO फ़ंक्शंस बहुत ही निचले स्तर पर समाप्त करना पसंद है main। इससे यह स्पष्ट होता है कि कोई भी IO क्या कर रहा है और कहां से कार्यक्रम शुरू होता है।

तो, संक्षेप में: फ़ंक्शन मॉड्यूल में निहित हैं, जिनमें से प्रत्येक एक फ़ाइल से बना है। कई मॉड्यूल एक प्रोग्राम या लाइब्रेरी बना सकते हैं; पूर्व में आम तौर पर एक Mainमॉड्यूल शामिल होता है जो इसका प्रवेश बिंदु होता है। एक फ़ाइल के भीतर, संगठन के लिए अलग-अलग विकल्प हैं, लेकिन मैं शीर्ष के पास डेटा प्रकार, नीचे के पास आईओ और बीच में तर्क देना पसंद करता हूं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.