वास्तविक दुनिया में "मजबूत" प्रकार की प्रणाली का उपयोग करते हुए, बड़े पैमाने पर वेब-ऐप्स के लिए कहें?


29

मुझे पता है कि यह एक बहुत व्यापक, अस्पष्ट और संभवतः दार्शनिक सवाल है। एक हद तक, कि प्रश्न में सबसे महत्वपूर्ण कीवर्ड - "मजबूत" प्रकार की प्रणाली - स्वयं, बीमार-परिभाषित है । तो, मुझे समझाने की कोशिश करें कि मेरा क्या मतलब है।

प्रश्न के लिए समग्र संदर्भ

हम रूबी ऑन रेल्स में एक बहुत बड़े पैमाने पर वेब-ऐप बना रहे हैं और हम आम तौर पर अपने स्टैक के बारे में खुश हैं। जब हम चाहते हैं, हम सामान को वास्तव में तेजी से जहाज कर सकते हैं - कुछ ऐसा जो "व्यापार" मामले के 90% के लिए काम करता है, बिना 10% किनारे के मामलों के बारे में बहुत अधिक चिंता किए बिना। दूसरी ओर, कोड-समीक्षाओं और परीक्षण-कवरेज की मदद से, हम धीमी और जानबूझकर हो सकते हैं और सुनिश्चित कर सकते हैं कि हम सभी आधारों को कवर करते हैं - फिर से, केवल ऐसी स्थितियों में जो इस तरह के करीबी जांच और सुरक्षा का गुण रखते हैं।

हालांकि, जैसे-जैसे टीम बढ़ती है, मुझे हमारे स्टैक में सही "बेकिंग नेट" की कमी से असुविधा होने लगी है।

हमने हाल ही में जावा पर कुछ देशी एंड्रॉयड विकास करना शुरू किया है। और मैं (सुखद) एक संकलित / स्थिर / दृढ़ता से टाइप की गई भाषा द्वारा प्रदान की गई सुरक्षा की याद दिलाता था।

  • मिस-स्पेल किए गए चर, गलत डेटा प्रकार, गलत फ़ंक्शन इनवोकेशन और तुच्छ त्रुटियों के एक मेजबान को आपके आईडीई द्वारा ही पकड़ा जाता है। सभी क्योंकि IDE संकलक में हुक कर सकता है और कार्यक्रम "शुद्धता" के कुछ पहलुओं को सत्यापित कर सकता है।
  • फ़ंक्शन हस्ताक्षर को बदलने की आवश्यकता है? आसान। कंपाइलर + IDE आपको सभी कॉल साइट्स को स्पॉट करने में मदद कर सकता है।
  • यह सुनिश्चित करने की आवश्यकता है कि कुछ अपवाद हमेशा संभाले जाते हैं? अपने बचाव के लिए अपवादों की जाँच की।

अब, जबकि इन सुरक्षा सुविधाओं के अपने फायदे हैं, मुझे उनके नुकसानों के बारे में भी अच्छी तरह से पता है। और अधिक, "बॉयलर भारी" जावा की दुनिया में। इसलिए, मैंने जावा के बजाय, आधुनिक, "दृढ़ता से टाइप की हुई" भाषाओं को देखना शुरू कर दिया है जो इन दिनों लोगों ने काम करना शुरू कर दिया है। उदाहरण के लिए: स्काला, रस्ट, हास्केल, आदि जो मुझे सबसे अधिक रुचि देते हैं, उनके प्रकार के सिस्टम और स्टेटिक / कंपाइल-टाइम चेक की शक्ति है।

अब, सवाल

मैं बड़े अनुप्रयोगों में इन शक्तिशाली प्रकार प्रणालियों और स्थिर / संकलन-समय सुविधाओं का उपयोग कैसे करूं?

उदाहरण के लिए, मैं इन शक्तिशाली विशेषताओं के लिए मानक "हैलो वर्ल्ड" के प्रकार से आगे कैसे बढ़ूंगा? व्यवसाय-डोमेन समस्या का मॉडल बनाने के लिए एक समृद्ध प्रकार की प्रणाली का उपयोग करता है? जब आप 30,000 LOC + ज़ोन में होते हैं, तो क्या टाइप सिस्टम मदद करता है, या बाधा डालता है? इन प्रकार के सिस्टम (और संकलन-समय जांच) द्वारा प्रदान किए गए सुरक्षा जाल का क्या होता है जब आपका सिस्टम दुनिया के बाहर कमजोर टाइप के साथ बातचीत करता है, जैसे। JSON या XML API के माध्यम से, विभिन्न डेटा स्टोर, उपयोगकर्ता इनपुट, आदि।


12
यह विषय नहीं है क्योंकि कोई वास्तविक उत्तर नहीं है। इस सवाल का उद्देश्य जनमत चर्चा को उत्तेजित करना है ("मुझे स्थैतिक / नापसंद है क्योंकि ..."), तथ्यात्मक विवरण नहीं । मेरी सलाह आपके प्रश्न के एक और विशिष्ट हिस्से को लेने की होगी जैसे कि "इन प्रकार के सिस्टम द्वारा प्रदान की गई सुरक्षा नेट का क्या होता है जब आपका सिस्टम बाहरी दुनिया के कमजोर टाइप के साथ इंटरैक्ट करता है?" और उस बारे में होने वाले प्रश्न को फिर से लिखें । आपको निश्चित उत्तर मिलेंगे जो भविष्य के पाठकों के लिए उपयोगी होंगे।
बेंजामिन हॉजसन

5
संसाधन सिफारिशें यहां भी विषय-आधारित हैं (क्योंकि ऐसे उत्तर जल्दी से निकल जाते हैं और हम वास्तव में Google से बेहतर नहीं हैं)। जैसा कि बेंजामिन ने कहा, आपके पोस्ट में कुछ जवाबदेह प्रश्न दफन हैं, लेकिन इसकी वर्तमान स्थिति में पूरी पोस्ट अनिवार्य रूप से लोगों से इन भाषाओं का उपयोग करने के लिए अपने अनुभवों का वर्णन करने के लिए कह रही है, जो कि Quora या Reddit के लिए कहीं अधिक उपयुक्त है, क्योंकि यह एक StackExchange है साइट। मैं नीच नहीं हूं, क्योंकि यह सवाल अच्छी तरह से पूछा गया है, लेकिन यह सिर्फ एक StackExchange सवाल नहीं है।
Ixrec

4
एक प्रकार की प्रणाली एक उपकरण है, और किसी भी अन्य उपकरण की तरह, यह प्रभावकारिता काफी हद तक उपकरण पर ही नहीं बल्कि क्षेत्ररक्षक पर निर्भर करती है। आप अपने व्यापार तर्क के बारे में आक्रमणकारियों को सांकेतिक शब्दों में बदलना करने के लिए हास्केल जैसी भाषा की प्रकार प्रणाली का लाभ उठा सकते हैं और संकलक समय पर एक मशीन (संकलक) द्वारा जांच की गई उन आवेषणों की है, लेकिन ऐसा करने के लिए आपको शब्दार्थ की समझ की आवश्यकता है प्रकार प्रणाली और प्रकार की जाँच। सही सवाल यह नहीं है "यह वेब सामग्री के लिए एक अच्छा उपकरण है", यह "यहां कुछ विशिष्ट समस्याएं हैं जिनका मैं सामना कर रहा हूं? उन्हें कैसे संबोधित करने के लिए एक मजबूत प्रकार की प्रणाली का उपयोग किया जा सकता है?"
user2407038

5
आपके द्वारा वर्णित अधिकांश चीजों का प्रकार प्रणाली से कोई लेना-देना नहीं है। वे विशुद्ध रूप से आईडीई सुविधाएँ हैं। चेक किए गए अपवादों के अपवाद (कोई उद्देश्य नहीं) के साथ, आपके द्वारा उल्लिखित सभी विशेषताएं स्मालटाक आईडीई में लंबे समय से पहले मौजूद हैं, क्योंकि वे आईडीई में सांख्यिकीय रूप से टाइप की गई भाषाओं में दिखाई देते हैं। वास्तव में, सबसे व्यापक रूप से उपयोग किए जाने वाले जावा आईडीई में से एक वास्तव में संशोधित स्मालटाक आईडीई (आईबीएम विजुअलएज स्मॉलटॉक) के रूप में शुरू किया गया था, जिसे जावा कोड को समझने के लिए संशोधित किया गया था लेकिन अभी भी स्मॉलटाक में लिखा गया था और विजुअलएज जावा के रूप में जारी किया गया था, जिसे तब जावा में पोर्ट किया गया था और के रूप में जारी ...
Jörg W Mittag

4
… विजुअलएज जावा माइक्रो एडिशन, जिसे तब री-यूजेबल घटकों में तोड़ दिया गया और एक्लिप्स नाम से ओपन सोर्स के रूप में जारी किया गया)। इस प्रश्न के संदर्भ में कुछ विडंबना यह है कि यह स्मालटाक सिस्टम की गतिशील प्रकृति के कारण ठीक है कि स्मॉलटाक आईडीई इतना शक्तिशाली है। उदाहरण के लिए, स्मॉलटाकल में स्वचालित रिफैक्टरिंग का आविष्कार किया गया था और इसे पहले लागू किया गया था। आपके तर्क से, हास्केल के पास सबसे अच्छा आईडीई होना चाहिए क्योंकि इसमें आपके द्वारा उल्लिखित सभी भाषाओं की सबसे मजबूत, सबसे सख्त स्थिर प्रकार की प्रणाली है। लेकिन यह नहीं है। आपने "संकलक में हुकिंग" का भी उल्लेख किया। यह है ...
Jörg W Mittag

जवाबों:


34

मैं इस समय मेरे समय की कमी के कारण एक छोटा सा जवाब दूंगा, लेकिन मैं वर्तमान में दो बड़ी परियोजनाओं पर काम कर रहा हूं (> हास्केल में 100.000 LOC) - flowbox.io और luna-lang.org। हम अपनी प्रोग्रामिंग भाषा के बैकएंड, कंपाइलर और यहां तक ​​कि वेबजीएल आधारित जीयूआई सहित सभी हिस्सों के लिए हास्केल का उपयोग करते हैं। मुझे स्वीकार करना होगा कि मजबूत प्रकार की प्रणाली और "आश्रित प्रकार" जैसी मशीनरी आपको मार्गदर्शन कर सकती है और अन्य भाषाओं के लिए जाने वाले बोझ और परेशानी से बचा सकती है। हम बहुत व्यापक रूप से प्रकारों का उपयोग करते हैं और सब कुछ जो संकलन समय में जांचा जा सकता है, ऐसा किया जाता है। वास्तव में, पिछले 3 वर्षों के विकास के दौरान, हमने कभी भी, किसी भी रनटाइम त्रुटि या स्टैक ओवरफ़्लो का सामना नहीं किया (और यह वास्तव में अविश्वसनीय है)। केवल त्रुटियाँ स्पष्ट तर्क त्रुटियाँ हैं जो प्रोग्रामर द्वारा की जाती हैं। बहुत सारे लोग बताते हैं, कि अगर हास्केल में कोई चीज संकलित होती है, तो यह सिर्फ काम करता है और आपको पूरा यकीन होना चाहिए कि यह किसी दिन आपके चेहरे पर नहीं फूटेगा।

प्रश्न के पहले भाग का उत्तर देना: आप कुछ महान ब्लॉगों को पढ़ने की इन शक्तिशाली प्रकार प्रणाली विशेषताओं के बारे में जान सकते हैं, जैसे:

वास्तव में, वहाँ बहुत से अन्य अच्छे ब्लॉग हैं (जैसे ग्रह हास्केल )। वैसे भी, उन्नत प्रकार की प्रणालियों को समझने के लिए सबसे अच्छी विधि एक उपयोगी ओपन सोर्स लाइब्रेरी विकसित करना है। हम (फ़्लोबॉक्स और न्यू बाइट ऑर्डर पर) बहुत सारी लाइब्रेरी रिलीज़ कर रहे हैं (आप उन्हें हैकेज में पा सकते हैं), इसलिए यदि आपको अंदाजा नहीं है कि क्या विकसित करना है, तो आप हमेशा हमारी परियोजनाओं में शामिल हो सकते हैं - बस मुझे ईमेल करें जब भी आप चाहते हैं ( luna-lang.org पर मेल उपलब्ध है )।


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

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

गैब्रियल गोंजालेस का ब्लॉग शुरू करने के लिए सबसे अच्छा है।
सैम बोसालिस

@ danilo2 ने आपकी कंपनी की वेबसाइट पर संपर्क @ पते पर एक ईमेल भेजा है। आपसे अनुरोध है कि प्रतिक्रिया दें। धन्यवाद!
सौरभ नंदा

@ सौरभ नंदा: मैंने हमारे इनबॉक्स को दोबारा चेक किया और मुझे आपसे कोई संदेश नहीं मिला। क्या आपने इसे <l> luna-lang.org पर संपर्क करने के लिए भेजा है? कृपया मुझे सीधे मेरे wojciech <dot> danilo <at> gmail <dot> com पर लिखने के लिए संपर्क करें और हम जांच करेंगे कि इस समस्या का कारण क्या था :)
danilo2

17

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

इसलिए मुझे परिभाषा पसंद है:

  • कमजोर टाइप की गई प्रणालियाँ आपको कुछ चीज़ें करने से रोकने के लिए प्रकारों का उपयोग करती हैं (जैसे गलतियाँ)
  • मजबूत टाइप किए गए सिस्टम आपके लिए चीजों को करने के लिए प्रकारों का उपयोग करते हैं

मुझे आपके लिए क्या करना चाहिए? ठीक है, चलो एक छवि रूपांतरण एपीआई को सर्वेंट फ्रेमवर्क में लिखने की जांच करें (हास्केल में, लेकिन आपको वास्तव में इसे अनुसरण करने के लिए जानने की आवश्यकता नहीं है, आप देखेंगे ...)

{-# LANGUAGE
    TypeOperators,
    DataKinds
    #-}

import Codec.Picture
import Data.Proxy
import Network.Wai.Handler.Warp (run)
import Servant
import Servant.JuicyPixels

main :: IO ()
main = run 8001 conversion

यह कह रहा है कि हम सर्वेंट पैकेज और सर्वेंट के लिए JuicyPixels प्लगइन सहित कुछ मॉड्यूल चाहते हैं, और प्रोग्राम का मुख्य प्रविष्टि वारप बैकएंड का उपयोग करके सर्वर के रूप में पोर्ट 8001 पर 'रूपांतरण' फ़ंक्शन को चलाना है। भाषा को थोड़ा नजरअंदाज करें।

conversion :: Application
conversion = serve (Proxy :: Proxy ConversionApi) handler

यह कह रहा है कि रूपांतरण फ़ंक्शन एक सर्वर है जहां एपीआई को 'कनवर्ज़नएपीआई' प्रकार से मेल खाना चाहिए और अनुरोध फ़ंक्शन द्वारा नियंत्रित किए जाते हैं handler

type ConversionApi
     = ReqBody '[BMP, GIF, JPEG 50, PNG, TIFF, RADIANCE] DynamicImage
    :> Post '[BMP, GIF, JPEG 50, PNG, TIFF, RADIANCE] DynamicImage

यह ConvesionApiप्रकार निर्दिष्ट कर रहा है । यह कहता है कि हमें '' बीएमपी, GIF, JPEG 50, PNG, TIFF, RADIANCE] सूची द्वारा निर्दिष्ट आवक प्रकारों को स्वीकार करना चाहिए और उन्हें एक डायनेमिकइमेज के रूप में संभालना चाहिए, और यह कि हमें डायनेमिकइमेज को उसी श्रेणी की सामग्री में परिवर्तित करके वापस करना चाहिए। प्रकार के। चिंता मत करो कि वास्तव में क्या है:> इसका मतलब है, इसे अभी के लिए खुश जादू के रूप में सोचें।

इसलिए, मेरी पसंदीदा परिभाषा को देखते हुए, एक कमजोर टाइप सिस्टम अब चीजों को सुनिश्चित कर सकता है:

  • आप गलत आउटगोइंग सामग्री प्रकार वापस नहीं करते हैं
  • आप गलत सामग्री प्रकार के रूप में आने वाले अनुरोध को पार्स नहीं करते हैं
  • यदि हमारा सर्वर अधिक जटिल था, तो यह हमें विकृत URI बनाने से रोकेगा, लेकिन हम वास्तव में लिंक को शामिल करने के लिए कोई HTML पृष्ठ नहीं लौटा रहे हैं (और प्रकार सुनिश्चित करता है कि हम नहीं कर सकते!)
  • वास्तव में महत्वाकांक्षी कमजोर टाइपिंग सिस्टम यह सुनिश्चित करने के लिए भी जांच कर सकता है कि हम सभी आवक और आउटगोइंग सामग्री प्रकारों को आसानी से संभाल रहे हैं, इस प्रकार से केवल एक बाधा के बजाय विनिर्देश दस्तावेज के रूप में कार्य करने की अनुमति मिलती है।

सभी बुलंद लक्ष्य, लेकिन वास्तव में एक पर्याप्त रूप से टाइप की गई प्रणाली के रूप में अर्हता प्राप्त करने के लिए पर्याप्त नहीं है, उपरोक्त परिभाषा। और अब हमें वास्तव में राइटिंग कोड का कठिन हिस्सा प्राप्त करना होगा जो इस विनिर्देश का अनुसरण करता है। वास्तव में मजबूत प्रकार की प्रणाली में, हम लिखते हैं:

handler = return

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

तो, आप प्रमुख एप्लिकेशन स्केल पर ऐसा करना कैसे सीखते हैं? ठीक है, यह वास्तव में छोटे पैमाने के अनुप्रयोगों में उनका उपयोग करने से बहुत अलग नहीं है। जो प्रकार निरपेक्ष होते हैं, उन्हें इससे संबंधित कोड कितना लिखा जाता है, इसकी परवाह नहीं है।

रन टाइम टाइप इंस्पेक्शन एक ऐसी चीज है जिससे आप शायद बचना चाहते हैं, क्योंकि यह बहुत बड़ी मात्रा में फायदा पहुंचाता है और टाइप करने के बजाय आपके प्रोजेक्ट को काम करने के लिए और जटिल बना देता है, बजाय इसके कि आप चीजों को सरल बना सकें।

जैसे, यह ज्यादातर प्रकार के साथ चीजों को मॉडलिंग करने का अभ्यास है। मॉडलिंग की चीजों के दो मुख्य तरीके (या सामान्य रूप से चीजें बनाना) नीचे और ऊपर नीचे हैं। शीर्ष नीचे संचालन के उच्चतम स्तर के साथ शुरू होता है, और जैसा कि आप मॉडल का निर्माण करते हैं आपके पास ऐसे हिस्से हैं जहां आप बाद में मॉडलिंग को समाप्त कर रहे हैं। बॉटम अप मॉडलिंग का मतलब है कि आप बेस ऑपरेशंस से शुरू करते हैं, जैसे आप बेस फंक्शंस से शुरू करते हैं, फिर बड़े और बड़े मॉडल बनाते हैं जब तक कि आपने प्रोजेक्ट के संचालन पर पूरी तरह से कब्जा नहीं कर लिया। नीचे का निर्माण अधिक ठोस और तेजी से होने की संभावना है, लेकिन टॉप डाउन आपके निचले स्तर के मॉडल को बेहतर तरीके से सूचित कर सकता है कि उन्हें वास्तव में कैसे व्यवहार करने की आवश्यकता है।

प्रकार वे हैं जो प्रोग्राम गणित से संबंधित हैं, शाब्दिक रूप से, इसलिए वास्तव में ऊपरी तौर पर इस बात पर कोई बाध्यता नहीं है कि वे कितने जटिल हो सकते हैं, या एक बिंदु जहां आप उनके बारे में सीख सकते हैं। वस्तुतः उच्च स्तर के विश्वविद्यालय के पाठ्यक्रमों के बाहर के सभी संसाधन सभी किसी विशेष भाषा में कैसे काम करते हैं, इसलिए आपको यह भी तय करना होगा।

जैसा कि सबसे अच्छा मैं पेशकश कर सकता हूं, प्रकारों को स्तरीकृत किया जा सकता है जैसे:

  • बहुत कमजोर प्रकार से, जावास्क्रिप्ट जैसी चीजें जहां [] + {} को परिभाषित किया गया है
  • चुपके से पाइथन की तरह टाइप किया जाता है, जहाँ आप [] + {} नहीं कर सकते, लेकिन जब तक आप कोशिश नहीं करते, तब तक जाँच नहीं की जाती है
  • कमजोर सी या जावा की तरह टाइप किया जाता है, जहां आप [] + {} नहीं कर सकते हैं, लेकिन यह संकलन समय पर जांचा जाता है, हालांकि आपके पास अधिक उन्नत प्रकार की सुविधाएँ नहीं हैं
  • सी + + टेम्पलेट मेटाप्रोग्रामिंग, और सरल हास्केल कोड जैसे कमजोर और जोरदार टाइप के बीच की सीमा को स्ट्रैडलिंग करना जहां केवल प्रॉपर्टीज लागू होती हैं।
  • पूरी तरह से मजबूत टाइप में, और अधिक जटिल हास्केल कार्यक्रमों की तरह जहां चीजें करते हैं, जैसा कि ऊपर दिखाया गया है
  • बहुत दृढ़ता से टाइप किया गया, जैसे अगड़ा या इदरीस, जहां प्रकार और मूल्य आपस में बातचीत करते हैं और एक-दूसरे को विवश कर सकते हैं। यह उतना ही मजबूत है जितना कि टाइप सिस्टम मिलते हैं, और उनमें प्रोग्रामिंग वही होती है जो आपके प्रोग्राम के बारे में गणितीय प्रमाण लिखते हैं। नोट: अगाडा में कोडिंग यह शाब्दिक रूप से गणितीय प्रमाण नहीं लिख रहा है, प्रकार गणितीय सिद्धांत हैं, और उन प्रकारों के साथ कार्य रचनात्मक उदाहरण हैं जो उन सिद्धांतों को साबित करते हैं।

आम तौर पर, आप इस सूची में और नीचे जाते हैं, जो आपके लिए और अधिक कर सकते हैं, लेकिन बहुत नीचे तक, आप समताप मंडल में चढ़ रहे हैं और हवा थोड़ी पतली हो रही है - पैकेज पारिस्थितिकी तंत्र बहुत छोटा है और आप ' अपने आप को अधिक चीजें लिखना होगा बनाम एक प्रासंगिक पुस्तकालय मिला है। प्रवेश करने की बाधा भी अधिक हो जाती है क्योंकि आप नीचे जाते हैं, क्योंकि आपको वास्तव में बड़े पैमाने पर प्रोग्राम लिखने के लिए पर्याप्त प्रकार के सिस्टम को समझना होगा।


ध्यान दें कि सूची में तत्व से अधिक होने पर आपको एपोस्ट्रोफ के साथ टाइप-स्तरीय सूची को उपसर्ग करने की आवश्यकता नहीं है। Apostrophe केवल 0- या 1-तत्व प्रकार-स्तरीय सूचियों के लिए आवश्यक है क्योंकि वे अस्पष्ट हैं (वे सामान्य सूची प्रकार निर्माता का जिक्र कर सकते हैं)
गेब्रियल गोंजालेज

1
मुझे पता है, लेकिन मैं इस धारणा के तहत था कि एपोस्ट्रोफ सामान्य रूप से पदोन्नत डेटा प्रकारों के लिए अच्छा रूप था। ईजी जो Proxy :: Proxy Trueकाम करता है, लेकिन इसे लिखना बेहतर है Proxy :: Proxy 'True
स्टीवन आर्मस्ट्रांग

1
विभिन्न कुल्हाड़ियों को न गिराना बेहतर लगता है जिसके अनुसार प्रकार के सिस्टम को वर्गीकृत किया जा सकता है। Barendregt के लैम्ब्डा क्यूब में पहले से ही तीन शामिल हैं, और इसके अलावा एकल कमजोर-मजबूत धुरी के साथ-साथ आप स्थिर बनाम गतिशील भी हैं, और पैरामीट्रिक बनाम एड हॉक पॉलीमॉर्फिज्म (बाद वाला वह है जो नौकर तकनीक को कई प्रकार के 'काम' करने की अनुमति देता है) ')।
user2141650

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

क्या आप संक्षेप में '[xs]वाक्य रचना की व्याख्या कर सकते हैं ? यह स्पष्ट रूप से एक नहीं है Char, लेकिन मैं देख रहा हूँ कि कैसे या तो नहीं है TypeOperatorsया DataKindsएक वैकल्पिक वाक्य रचना सक्षम बनाता है। क्या यह किसी प्रकार की क्वाटिकोटिंग है?
व्रचिनि

10

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

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

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

हम उपयोगकर्ताओं के लिए चीजों को आसान भी बना सकते हैं। अक्सर उनके लिए वे केवल नियमित संग्रह या केस क्लासेस के साथ काम कर रहे हैं, और हम इसे JSON या नेटवर्क ट्रांसपोर्ट के लिए स्वचालित रूप से आवश्यकतानुसार परिवर्तित कर रहे हैं।

मजबूत टाइपिंग से असमान और स्वच्छता इनपुट जैसी चीजों के बीच अंतर करने में मदद मिलती है, जिससे सुरक्षा में मदद मिल सकती है।

मजबूत टाइपिंग भी आपके परीक्षणों को आपके वास्तविक परीक्षण पर अधिक ध्यान केंद्रित करने में मदद करती है , बजाय इसके कि आप अपने प्रकारों का परीक्षण करें। यह परीक्षण को अधिक सुखद, अधिक केंद्रित और इसलिए अधिक प्रभावी बनाता है।

मुख्य नुकसान भाषा और भाषा के प्रतिमान के साथ अपरिचित है, और यह समय के साथ सही है। अन्य कि, हमने इसे अच्छी तरह से प्रयास के लायक पाया है।


8

हालांकि सीधा जवाब नहीं है (क्योंकि मैंने अभी तक हैस्केल में +30.000 LOC कोड के ठिकानों पर काम नहीं किया है :( ..), मैंने आपको https://www.fpcomplete.com/business/resources/case-studies की जाँच करने के लिए निहित किया है / जो वास्तविक उद्योग सेटिंग्स में हैस्केल के बहुत सारे केस-स्टडीज की सुविधा देता है।

एक और अच्छा लेख IMVU है, जो हैक्सेल में बदलने के उनके अनुभव का वर्णन करता है - http://engineering.imvu.com/2014/03/24/what-its-like-to-use-haskell/

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

मैं आपके द्वारा सुझाए गए संसाधनों के कुछ लिंक दूंगा, क्योंकि आप एक ही बार में बहुत सारे सवाल पूछ रहे हैं:

एक बंद टिप्पणी के रूप में, बाहरी दुनिया से निपटने के बारे में कई तरीकों से किया जाता है। यह सुनिश्चित करने के लिए पुस्तकालय हैं कि आपके छोर पर चीज़ें सुरक्षित हैं, जैसे Aeson for JSON, Esqueleto for SQL और कई और।


1
उत्तर के लिए धन्यवाद, हालांकि, fpcomplete.com/business/resources/case-studies पर केस अध्ययन अब उपलब्ध नहीं हैं।
सौरभ नंदा

लगता है जैसे केस स्टडी fpcomplete.com/case-study पर
स्टीवन शॉ

3

मैंने जो देखा है:

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

मुझे जो लगता है

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

प्रश्न करने के लिए अन्वेषक

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

श्रेणी का सिद्धांत

यदि आप हास्केल चुनते हैं तो आप बड़ी मात्रा में साहित्य में श्रेणी सिद्धांत पर चर्चा करेंगे। IMHO श्रेणी सिद्धांत उपयोगी है लेकिन आवश्यक नहीं है। हास्केल समुदाय में इसकी व्यापकता को देखते हुए श्रेणी सिद्धांत की व्यावहारिकता के बारे में भावनाओं के साथ समर्थक के प्रकार और विपक्ष को भ्रमित करना आसान है। यह याद रखने में मददगार है कि वे दो अलग-अलग चीजें हैं, यह कहना है कि श्रेणी के सिद्धांत द्वारा निर्देशित कार्यान्वयन गतिशील रूप से टाइप की गई भाषाओं में किया जा सकता है और साथ ही स्थिर (modulo लाभ जो टाइप सिस्टम प्रदान करता है)। सामान्य रूप से उन्नत प्रकार के सिस्टम श्रेणी के सिद्धांत के लिए बाध्य नहीं हैं और श्रेणी के सिद्धांत प्रकार के सिस्टम से बाध्य नहीं हैं।

प्रकारों पर अधिक

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


2

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

एक मजबूत प्रकार की प्रणाली एक प्रकार की प्रणाली है जिसमें एक संकलन-समय प्रतिबंध या रन-टाइम सुविधा है जो आपको आकर्षक लगती है।

एक कमजोर प्रकार की प्रणाली एक प्रकार की प्रणाली है जिसमें उस प्रतिबंध या विशेषता का अभाव है।

उदाहरण के लिए, C, C ++ और Java वैधानिक रूप से टाइप किए जाते हैं क्योंकि संकलन समय पर चर टाइप किए जाते हैं। फिर भी, C और C ++ को कमजोर रूप से टाइप किया जा सकता है क्योंकि भाषा void *बिंदु और कलाकारों का उपयोग करके प्रतिबंधों को बायपास करने की अनुमति देती है । इस विषय पर अधिक।

इस भेद पर, मजबूत टाइपिंग ही बेहतर हो सकती है। पहले जितना असफल रहा, उतना अच्छा।

हालांकि, बड़े कार्यक्रमों को लिखने पर, मुझे नहीं लगता कि टाइप सिस्टम एक महत्वपूर्ण भूमिका निभाता है। लिनक्स कर्नेल दस लाख LOC है जो C और असेंबली में लिखी जाती है और इसे एक बहुत ही स्थिर प्रोग्राम माना जाता है, यह मेरी 200 जावा लाइनों से मीलों दूर है जो शायद सुरक्षा छेदों से भरा है। इसी तरह, हालांकि गतिशील रूप से टाइप की गई "स्क्रिप्ट भाषाओं" को एक खराब प्रतिष्ठा का सामना करना पड़ता है जब बड़े कार्यक्रमों को लिखने की बात आती है, तो कभी-कभार इसका प्रमाण अवांछनीय होता है (जैसे कि पायथन Django, 70k LOC से अधिक)

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


-1

बड़े अनुप्रयोगों में इन शक्तिशाली प्रकार प्रणालियों और स्थिर / संकलन-समय सुविधाओं का उपयोग करने के बारे में कोई कहां पढ़ सकता है?

पिछले उत्तर से https://www.fpcomplete.com/business/resources/case-studies/

मानक "हैलो वर्ल्ड" से परे कोई व्यक्ति इन शक्तिशाली विशेषताओं के लिए किस तरह का परिचय देता है?

यह वास्तव में ताकत बनाने के लिए किसी भी अन्य भाषा की तरह है

व्यवसाय-डोमेन समस्या को मॉडल करने के लिए एक समृद्ध प्रकार की प्रणाली का उपयोग कैसे किया जा सकता है?

सार डेटा प्रकार, या अधिक सामान्यतः बहुरूपता का उपयोग करके

जब आप 30,000 LOC + ज़ोन में होते हैं, तो क्या टाइप सिस्टम मदद करता है, या बाधा डालता है?

यह सभी तरह से मदद करता है। टाइप सिस्टम आपको कोड लिखने में मदद करता है क्योंकि यह आपको उस परिणाम का आकार बताता है जो आप चाहते हैं। दरअसल एजडा आपके लिए कोड लिखता है।

पुनश्च: एक प्रकार की प्रणाली होने और स्वयं प्रकार लिखने की गलती न करें, जो कि मूर्खतापूर्ण है: कंप्यूटर आपके लिए कर सकता है।

इन प्रकार के सिस्टम (और संकलन-समय जांच) द्वारा प्रदान किए गए सुरक्षा जाल का क्या होता है जब आपका सिस्टम दुनिया के बाहर कमजोर टाइप के साथ बातचीत करता है, जैसे। JSON या XML API के माध्यम से, विभिन्न डेटा स्टोर, उपयोगकर्ता इनपुट, आदि।

यह बहुत अच्छा है, क्योंकि प्रकारों के माध्यम से मूल्यों की संरचना को जानने का मतलब है कि कंप्यूटर आपके लिए धारावाहिक (डी) लिखने का तरीका खोज सकता है।

यदि आप वास्तव में प्रकार और अमूर्तता के बारे में जानना चाहते हैं, तो सबसे अच्छा परिचय अंडरस्टैंडिंग टाइप्स, डेटा एब्सट्रैक्शन, और पोल्यूरोरिज़्म पर है।

यह एक पेपर है, सुंदर चित्रों के साथ केस स्टडी नहीं है, लेकिन यह ज्ञानवर्धक है


-2

एक .net प्रोग्रामर के रूप में, जो वेब अनुप्रयोगों पर बहुत काम करता है, मैं दोनों टाइप किए गए C # और अनकवर्ड जावास्क्रिप्ट चीज़ों को देखता हूं।

मुझे यकीन नहीं है कि मैंने आपके द्वारा पूछे गए सवालों के बारे में कोई साहित्य देखा है। एक टाइप की गई भाषा के साथ आप इन सभी चीजों को अपना लेते हैं। एक अप्राप्त के साथ आप अनावश्यक ओवरहेड के रूप में प्रकारों को परिभाषित करते हुए देखते हैं।

व्यक्तिगत रूप से, मुझे नहीं लगता कि आप इस बात से इनकार कर सकते हैं कि एक दृढ़ता से टाइप की गई भाषा आपको बहुत कम लागत पर वर्णित लाभ प्रदान करती है (समकक्ष इकाई परीक्षण लिखने की तुलना में)। कमजोर टाइप की गई प्रणालियों के साथ बातचीत में आमतौर पर जेनेरिक प्रकार शामिल होते हैं, जैसे ऑब्जेक्ट्स के Arrays या शब्दकोश, जैसे DataReader, या स्ट्रिंग का रचनात्मक उपयोग या नए गतिशील वर्ग। अनिवार्य रूप से यह सब काम करता है, आपको बस संकलन समय के बजाय एक रनटाइम त्रुटि मिलती है।

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


क्या आपका मतलब टाइप्ड / अनपेड या स्टैटिकली टाइप्ड / डायनामिक टाइप है? जावास्क्रिप्ट अछूता नहीं है लेकिन गतिशील रूप से टाइप किया गया है।
जियोर्जियो

2
आपको न तो प्रकारों को परिभाषित करना है। कोई भी सभ्य भाषा आपके लिए प्रकारों का अनुमान नहीं लगाएगी: haskell, ocaml, sml, F # ...
nicolas

1
जब आप एक दृढ़ता से टाइप की गई भाषा के लिए उपयोग किए जाते हैं तो बाकी सब कुछ अप्राप्त होता है, जब मैं कहता हूं कि मेरे द्वारा टाइप किए जाने वाले प्रकारों को परिभाषित करें 'सुनिश्चित करें कि आप var या जो भी उपयोग कर सकते हैं, लेकिन इसकी सिर्फ एक संकलक चाल है
Ewan
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.