2010-10-23 21 views
6

मैं हास्केल में एक सांप गेम लिख रहा हूं। ये बातें में से कुछ हैं मेरे पास है:हास्केल में मॉड्यूल बनाने के लिए मुझे कितना छोटा बनाना चाहिए?

  • एक Coord डेटा प्रकार
  • एक Line डेटा प्रकार
  • एक Rect डेटा प्रकार
  • एक Polygon प्रकार वर्ग है, जो मुझे एक Rect एक के रूप में प्राप्त करने के लिए अनुमति देता है लाइनों की श्रृंखला ([Line])।
  • एक Impassable टाइप क्लास जो मुझे Line को कॉर्ड ([Coord]) की श्रृंखला के रूप में प्राप्त करने की अनुमति देता है ताकि मैं अन्य Impassable एस के बीच टकराव का पता लगा सकूं।
  • Draw किसी भी चीज़ के लिए टाइप क्लास जिसे मैं स्क्रीन पर आकर्षित करना चाहता हूं (HSCurses)।
  • अंततः मैं क्विक चेक का उपयोग कर रहा हूं इसलिए मैं इन चीजों में से कई के लिए Arbitrary उदाहरण घोषित करना चाहता हूं।

वर्तमान में मैं अलग मॉड्यूल में इन का एक बहुत तो मैं छोटे मॉड्यूल के पास बहुत है। मैंने देखा है कि मुझे एक दूसरे के लिए बहुत से आयात करना है, इसलिए मैं सोच रहा हूं कि बिंदु क्या था।

मैं विशेष रूप से Arbitrary उदाहरणों के बारे में उलझन में हूं। -Wall का उपयोग करते समय मुझे अनाथ उदाहरणों के बारे में चेतावनियां मिलती हैं जब मैं एक परीक्षण फ़ाइल में उन उदाहरणों को एक साथ जोड़ता हूं, मेरी समझ यह है कि मैं उन उदाहरणों को उसी मॉड्यूल में डालकर उस चेतावनी से बच सकता हूं जहां डेटा प्रकार परिभाषित किया गया है लेकिन फिर मुझे इसकी आवश्यकता होगी उन सभी मॉड्यूल के लिए import Test.QuickCheck पर जो मूर्खतापूर्ण प्रतीत होता है क्योंकि परीक्षण निष्पादन योग्य होने पर क्विक चेक की आवश्यकता होनी चाहिए।

क्विक चेक के साथ विशिष्ट समस्या पर कोई सलाह की सराहना की जाएगी क्योंकि कार्यक्रमों को मॉड्यूल में कैसे/कहाँ विभाजित किया जाना चाहिए, इसकी सामान्य समस्या पर मार्गदर्शन होगा।

उत्तर

1

मैं आम तौर पर मॉड्यूल इंटरफ़ेस पर अधिक जोर देता हूं जैसा कि यह प्रकट होने वाले कार्यों के बजाय प्रकट किए गए कार्यों द्वारा परिभाषित किया गया है। क्या आपके कुछ प्रकार फ़ंक्शंस का एक सामान्य सेट साझा करते हैं? तब मैं उन्हें एक ही मॉड्यूल में रखूंगा।

लेकिन मेरा अभ्यास शायद सबसे अच्छा नहीं है क्योंकि मैं आमतौर पर छोटे कार्यक्रम लिखता हूं। मैं पैकेज पैरामीटर क्या करता है यह देखने के लिए Hackage से कुछ कोड देखने की सलाह दूंगा।

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

+0

यहां डाउनलोड की संख्या और रिवर्स निर्भरताओं की संख्या के आधार पर रैंकिंग के लिए लिंक हैं: http://stackoverflow.com/questions/3663550/which-haskell-package-for-json/3663601#3663601 –

4

आप अपना केक ले सकते हैं और इसे भी खा सकते हैं। आप मॉड्यूल पुनः निर्यात कर सकते हैं।

module Geometry 
    (module Coord, module Line, module Rect, module Polygon, module Impassable) 
where 

मैं आमतौर पर एक मॉड्यूल का उपयोग जब भी मैं एक पूरा अमूर्त है - जब एक डेटा प्रकार का अर्थ इसके कार्यान्वयन से अलग है अर्थात। अपने कोड के बारे में बहुत कुछ जानना, मैं संभवतः Polygon और Impassable समूह को समूहित कर सकता हूं, शायद वे Collision डेटा प्रकार को वापस लौटने के लिए प्रस्तुत करते हैं। लेकिन Coord, Line, और Rect अच्छे abstractions की तरह लगते हैं और वे शायद अपने मॉड्यूल के लायक हैं।

+0

कोई सुझाव क्या करना है क्विक चेक समस्या के बारे में? –

+1

यह एक कठिन समस्या है, जिसे मैं वास्तव में काम कर रहा हूं। मुझे लगता है कि जॉन का सुझाव है कि अनाथों से निपटने के लिए अभी आपका सबसे अच्छा विकल्प है। मुझे लगता है कि ऐसा करने का सही तरीका "वितरण संयोजक" होना है, इसलिए 'उदाहरण मनमानी कोऑर्ड' के बजाय, आपके पास एक कार्य 'arbitraryCoord :: वितरण समन्वय' है। परीक्षणों में उपयोग करने के लिए यह थोड़ा अधिक बोझिल है, लेकिन यह अधिक लचीला और मॉड्यूलर है, क्योंकि आपके पास एक ही प्रकार के लिए कई वितरण हो सकते हैं (विशेष रूप से, यदि दो अलग-अलग वितरण परिभाषित किए जाते हैं, तो दुनिया विस्फोट नहीं करती है)। – luqui

2

परीक्षण उद्देश्यों के लिए, मैं Arbitrary उदाहरणों के लिए अलग मॉड्यूल का उपयोग करता हूं। हालांकि मैं आम तौर पर अनाथ उदाहरणों से बचता हूं, लेकिन इन मॉड्यूल केवल परीक्षण निष्पादन योग्य बनाते समय बनाए जाते हैं, इसलिए मुझे अनाथों को कोई फर्क नहीं पड़ता है या यह -Wall साफ़ नहीं है। आप केवल इस चेतावनी संदेश को अक्षम करने के लिए -fno-warn-orphans का उपयोग भी कर सकते हैं।

+0

आपके पास _all_ 'मनमानी' उदाहरणों के लिए एक अलग मॉड्यूल है? –

+0

@ ओली सॉंडर्स - यह परियोजना के आकार पर निर्भर करता है। छोटी परियोजनाओं के लिए, मैं परीक्षण के लिए दो मॉड्यूल का उपयोग करता हूं: यदि आवश्यक हो तो किसी के पास 'मनमानी' उदाहरण और अन्य अतिरिक्त कोड होता है, और अन्य मॉड्यूल में क्विक चेक गुण होते हैं। बड़ी परियोजनाओं के लिए, मुझे स्नैप ढांचे में उपयोग किए गए लेआउट पसंद हैं। उनके पास प्रत्येक नियमित मॉड्यूल के लिए एक परीक्षण मॉड्यूल है जिसमें अनियंत्रित उदाहरण और संपत्ति परीक्षण शामिल हैं। –

0

क्विक चेक के साथ एक समाधान सी प्रीप्रोसेसर का उपयोग करना है जब आप परीक्षण कर रहे हैं तो मनमाने ढंग से उदाहरणों को चुनिंदा रूप से सक्षम करने के लिए। आपने अनियंत्रित उदाहरण सीधे अपने मुख्य मॉड्यूल में डाल दिए हैं लेकिन उन्हें प्रीप्रोसेसर मैक्रोज़ के साथ लपेटें, फिर अपनी कैबल फ़ाइल में "परीक्षण" ध्वज डालें।