कार्यात्मक प्रोग्रामिंग में क्यों (या क्यों नहीं) अस्तित्वगत प्रकार को बुरा अभ्यास माना जाता है?


43

क्या कुछ तकनीकें हैं जिनका मैं अस्तित्व के प्रकारों पर निर्भरता को दूर करने के लिए लगातार रिफ्लेक्टर कोड का उपयोग कर सकता हूं? आमतौर पर ये आपके प्रकार के अवांछित निर्माणों को अयोग्य घोषित करने के साथ-साथ दिए गए प्रकार के बारे में कम से कम ज्ञान के साथ खपत की अनुमति देने के लिए उपयोग किया जाता है (या तो मेरी समझ है)।

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

आप यहां अस्तित्वगत प्रकारों के बारे में अधिक पढ़ सकते हैं ("यदि आप की हिम्मत है ..")।


8
@RobertHarvey मुझे वह ब्लॉग पोस्ट मिली जिसने मुझे पहली बार इस प्रश्न के बारे में सोचने पर मजबूर किया: हास्केल एंटीपैटर्न: अस्तित्ववादी टाइपकास्ट । इसके अलावा, पेपर जॉय एडम्स में धारा 3.1 में मौजूद कुछ कविताओं का वर्णन किया गया है। यदि आपके पास विपरीत तर्क हैं, तो कृपया उन्हें साझा करें।
पेट्र पुडलक

5
@ पेट्रूडलैक: ध्यान रखें कि एंटीपैटर्न सामान्य रूप से अस्तित्व में नहीं होते हैं, लेकिन उनका एक विशेष उपयोग जब कुछ सरल और आसान (और हास्केल में बेहतर समर्थित) एक ही काम करेंगे।
सीए मैककैन

10
यदि आप यह जानना चाहते हैं कि किसी विशेष ब्लॉग पोस्ट के लेखक ने एक राय क्यों व्यक्त की तो आपको जिस व्यक्ति से पूछना चाहिए वह लेखक है।
एरिक लिपर्ट

6
@Ptolemy यह राय का विषय है। सालों के लिए हास्केल का उपयोग करना, मैं एक कार्यात्मक भाषा का उपयोग करने की कल्पना नहीं कर सकता, जिसमें एक मजबूत प्रकार की प्रणाली नहीं है।
पेट्र पुडल्क

4
@Ptolemy: हास्केल का मंत्र "अगर यह काम करता है", Erlangs मंत्र है "इसे दुर्घटना दें"। गतिशील टाइपिंग गोंद के रूप में अच्छी है, लेकिन मैं व्यक्तिगत रूप से सिर्फ गोंद का उपयोग करके चीजों का निर्माण नहीं करूंगा।
डेन

जवाबों:


8

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

इस पैटर्न को अक्सर इस सवाल के जवाब के रूप में समझा जाता है कि विषम टाइप किए गए तत्वों की सूची कैसे होती है जो सभी एक ही टाइपकास्ट को लागू करते हैं। उदाहरण के लिए, हो सकता है कि आपके पास उन मूल्यों की सूची हो, जिनमें Showउदाहरण हैं:

{-# LANGUAGE ExistentialTypes #-}

class Shape s where
   area :: s -> Double

newtype Circle = Circle { radius :: Double }
instance Shape Circle where
   area (Circle r) = pi * r^2

newtype Square = Square { side :: Double }
    area (Square s) = s^2

data AnyShape = forall x. Shape x => AnyShape x
instance Shape AnyShape where
    area (AnyShape x) = area x

example :: [AnyShape]
example = [AnyShape (Circle 1.0), AnyShape (Square 1.0)]

इस तरह कोड के साथ समस्या यह है:

  1. एकमात्र उपयोगी ऑपरेशन आप AnyShapeअपने क्षेत्र को प्राप्त करने के लिए एक पर प्रदर्शन कर सकते हैं ।
  2. आपको अभी भी AnyShapeएक प्रकार के आकार को लाने के लिए कंस्ट्रक्टर का उपयोग करने की आवश्यकता है AnyShape

जैसा कि यह पता चला है, कोड का टुकड़ा वास्तव में आपको कुछ भी नहीं मिलता है जो यह छोटा नहीं है:

class Shape s where
   area :: s -> Double

newtype Circle = Circle { radius :: Double }
instance Shape Circle where
   area (Circle r) = pi * r^2

newtype Square = Square { side :: Double }
    area (Square s) = s^2

example :: [Double]
example = [area (Circle 1.0), area (Square 1.0)]

बहु विधि वर्गों के मामले में, एक ही प्रभाव आम तौर पर एक "तरीकों में से रिकॉर्ड" का उपयोग कर की तरह एक typeclass उपयोग करने के बजाय एन्कोडिंग-की से अधिक बस पूरा किया जा सकता Shapeहै, तो आप एक रिकॉर्ड प्रकार जिसका क्षेत्रों में "तरीकों" कर रहे हैं परिभाषित Shapeप्रकार , और आप अपने हलकों और चौकों को Shapeएस में बदलने के लिए कार्य लिखते हैं ।


लेकिन इसका मतलब यह नहीं है कि अस्तित्वगत प्रकार एक समस्या है! उदाहरण के लिए, रस्ट में उनके पास विशेषता ऑब्जेक्ट्स नामक एक विशेषता होती है जिसे लोग अक्सर एक विशेषता पर एक अस्तित्वगत प्रकार के रूप में वर्णित करते हैं (रस्ट के प्रकार वर्ग के संस्करण)। यदि हस्केल में अस्तित्ववादी टाइपकास्टेस एक एंटीपार्टर्न हैं, तो क्या इसका मतलब यह है कि रस्ट ने एक बुरा समाधान चुना है? नहीं! हास्केल दुनिया में प्रेरणा वाक्यविन्यास और सुविधा के बारे में है, सिद्धांत के बारे में नहीं।

इस डालने का एक और अधिक गणितीय रास्ता ओर इशारा करते हुए किया जाता है कि AnyShapeइसके बाद के संस्करण और से प्रकार Doubleहैं isomorphic , वहाँ उन दोनों के बीच एक "दोषरहित रूपांतरण" (अच्छी तरह से, बिंदु परिशुद्धता चल बचाने के लिए) है:

forward :: AnyShape -> Double
forward = area

backward :: Double -> AnyShape
backward x = AnyShape (Square (sqrt x))

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


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

तो सामान्य उत्तर यह है कि कोई सामान्य उत्तर नहीं है। अस्तित्वगत प्रकारों के उपयोगों को केवल संदर्भ में ही आंका जा सकता है - और उत्तर अलग-अलग भाषाओं द्वारा प्रदान की जाने वाली सुविधाओं और वाक्यविन्यास के आधार पर भिन्न हो सकते हैं।


यह एक समरूपता नहीं है।
रयान रीच

2

मैं हास्केल से बहुत परिचित नहीं हूं, इसलिए मैं गैर-शैक्षणिक कार्यात्मक C # डेवलपर के रूप में प्रश्न के सामान्य भाग का उत्तर देने का प्रयास करूंगा।

कुछ पढ़ने के बाद, यह पता चला है कि:

  1. जावा वाइल्डकार्ड अस्तित्व के प्रकार के समान हैं:

    उदाहरण के लिए स्काला के अस्तित्वगत प्रकार और जावा के वाइल्डकार्ड के बीच अंतर

  2. वाइल्डकार्ड्स को C # पूरी तरह से लागू नहीं किया जाता है: जेनेरिक विचरण का समर्थन किया जाता है, लेकिन कॉल साइट विचरण नहीं है:

    सी # जेनरिक: वाइल्डकार्ड्स

  3. आपको हर रोज इस सुविधा की आवश्यकता नहीं हो सकती है, लेकिन जब आप करते हैं तो आपको यह महसूस होगा (जैसे चीजों को काम करने के लिए एक अतिरिक्त प्रकार पेश करना):

    सी # सामान्य बाधाओं में वाइल्डकार्ड

इस जानकारी के आधार पर अस्तित्वगत प्रकार / वाइल्डकार्ड तब लागू होते हैं जब उन्हें ठीक से लागू किया जाता है और उनके साथ कुछ भी गलत नहीं होता है, लेकिन उनका शायद अन्य भाषा सुविधाओं की तरह ही दुरुपयोग किया जा सकता है।

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