/ / जावा के चेक अपवादों से एल्म का संकलन अलग कैसे होता है? - जावा, एल्म, चेक-अपवाद

जावा के चेक अपवादों से एल्म का संकलन कैसे भिन्न होता है? - जावा, एल्म, चेक-अपवाद

elmका दावा शून्य क्रम-अपवादों इसकी प्रमुख बिक्री बिंदु में से एक है (देखें सरकारी वेबसाइट),

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

क्या elm संकलक मूल रूप से करता है, आपको सभी संभावित पथों को कवर करने के लिए मजबूर कर रहा है जो अपवाद का कारण बन सकते हैं।

उदाहरण के लिए:

import String exposing (toInt)
toIntOrZero s = case toInt s of
Err e -> 0
Ok val -> val

लेकिन यह कैसे अलग है बदनाम "चेक-अपवाद" सुविधा में java ?

public static Integer toIntOrZero(String s) {
try { return Integer.valueOf(s); }
catch (NumberFormatException e) { return 0; }
}

मैंने कभी भी कोई दावा नहीं सुना है java शून्य-रनटाइम-अपवाद भाषा है।

उत्तर:

जवाब के लिए 5 № 1

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

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

एल्म कुछ तरीकों से अपवादों की संभावना को कम कर देता है।

  1. अलग-अलग भाषा में एक फेंकने योग्य अपवाद की कोई धारणा नहीं है Debug.crash, जो, जैसा कि इसके नाम का तात्पर्य है, वास्तव में केवल अपूर्ण तर्क पथों को डिबगिंग और स्टबिंग के लिए उपयोग किया जाना चाहिए।

चूंकि कोई फेंकने योग्य अपवाद नहीं हैं, इसलिए समस्याएं संभालने की तरह अक्सर प्रकारों के माध्यम से किया जाता है Result तथा Maybe.

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

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

  1. गैर-संपूर्ण पैटर्न मिलान संकलन विफलता का कारण बनता है

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

  1. अचल स्थिति

अपरिवर्तनीयता संभावित प्रकार की त्रुटियों के भार से बचाती है, यहां आने के लिए बहुत कुछ

  1. एल्म आर्किटेक्चर जावास्क्रिप्ट और एल्म के बीच एक साफ अलगाव प्रदान करता है

एल्म जावास्क्रिप्ट को संकलित करता है, लेकिन एल्मआर्किटेक्चर जावास्क्रिप्ट के सभी गंदे बिट्स को एल्म द्वारा लिखे गए शुद्ध कोड से दूर रखने के लिए एक अच्छा साफ बाधा प्रदान करता है। जावास्क्रिप्ट में होने वाले किसी भी अपवाद को उस बाधा से संभाला जाना चाहिए, जैसे I / O त्रुटियों का हमेशा एल्म-फ्रेंडली, अपरिहार्य प्रकार में अनुवाद किया जाएगा।

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


जवाब के लिए 4 № 2

जैसा कि एक टिप्पणीकर्ता ने बताया, जावा में अनचेक अपवाद हैं, इसलिए रनटाइम त्रुटियां कर पाए जाते हैं। एल्म में शून्य से विभाजन जैसी चीज़ों के लिए अनचेक अपवाद भी हैं, लेकिन आमतौर पर अभ्यास में देखे जाने वाले लोगों से छुटकारा पाता है। और चाड के जवाब का उल्लेख है, एल्म "एस Maybe/Result प्रकार जावा के चेक अपवादों की तुलना में अभ्यास में काफी अलग तरीके से काम करते हैं। एक अनुभवी एल्म प्रोग्रामर एक समारोह नहीं लिखता है toIntOrZero (और यदि उन्होंने किया, तो वे शायद उपयोग नहीं करेंगे case ... of, इसके बजाय कुछ पसंद करते हैं toIntOrZero = String.toInt >> Result.withDefault 0)।

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

lookupUser : Int -> Result String User
lookupUser intId = ...

userInGoodStanding : User -> Bool
userInGoodStanding user = ...

isValidId : String -> Bool
isValidId id =
String.toInt id
|> Result.andThen lookupUser
|> Result.map userInGoodStanding
|> Result.withDefault False

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