2009-11-30 8 views
13

मैं एरलांग सीख रहा हूं और मैं एक बहुत ही नमूना ब्लॉग प्रोग्राम बनाने की कोशिश कर रहा हूं। हालांकि वर्तमान में मेरा दिमाग ओओ दुनिया में फंस गया (var p = new post(); p.Title = ""; p.Save();)। मैं Erlang में कुछ बुनियादी सोचों को समझना चाहता हूँ। पोस्ट ऑब्जेक्ट बनाने के बजाय मुझे डेटा संरचना के संदर्भ में क्या करना चाहिए (p.Title, p.DateCreated, p.Body)? क्या मुझे ट्यूपल का उपयोग करना चाहिए? मैं ऐसी चीजों को करने में अनुशंसित तरीका समझना चाहता हूं (एर्लांग विशिष्ट और कार्यात्मक प्रोग्रामिंग विशिष्ट दोनों में)। या क्या मैं एरलांग या एफपी में मौलिक रूप से गलत कर रहा हूं?एर्लंग (कार्यात्मक प्रोग्रामिंग) बनाम ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग सोचने के मामले में

आवश्यकता (OO मामले में, कैसे एफपी मामले में अभी तक समझाने के लिए नहीं सुनिश्चित करें^_ ^):

  1. पोस्ट वस्तु (आईडी, शीर्षक, date_created, शरीर, IList)
  2. बनाने टिप्पणी वस्तु बनाने (आईडी, post_id, created_by (स्ट्रिंग के रूप में नाम), date_created)
  3. एक पोस्ट अनेक टिप्पणियाँ हो सकता है
  4. post.AddComment (टिप्पणी)

धन्यवाद।

अपडेटेडः मैं एर्लांग में ओओपी करने का विशिष्ट तरीका नहीं ढूंढ रहा हूं जब तक यह अनुशंसित तरीका न हो। मैं प्रश्न में वर्णित करने के मानक/अनुशंसित तरीके की तलाश में हूं, हालांकि मैं एर्लांग में ओओपी को दोहराने की कोशिश नहीं कर रहा हूं।

+0

आप ऑब्जेक्ट के स्थान पर एक टुपल का उपयोग कर सकते हैं लेकिन रिकॉर्ड्स का उपयोग शायद स्पष्ट है। (रिकॉर्ड्स Erlang में वैसे भी tuples में अनुवाद।) –

+0

@Nate इसके लिए धन्यवाद क्योंकि मुझे पहले कीवर्ड नहीं पता था। संदर्भ के लिए यहां एक शीर्ष Google खोज परिणाम दिया गया है। http://20bits.com/articles/erlang-an-introduction-to-records/ – Jeff

+0

@Nate रिकॉर्ड का उपयोग करके निजी राज्य और विधियों का प्रतिनिधित्व कैसे किया जाता है? क्या आप कृपया बता सकते हैं कि कक्षाओं, इंटरफेस इत्यादि के प्रतिस्थापन के रूप में रिकॉर्ड का प्रभावी ढंग से उपयोग कैसे किया जा सकता है? –

उत्तर

5

मैं रिकॉर्ड का प्रयोग करेंगे:

Post = #post{title = "", body = "", date_created = erlang:universaltime()}, 
mnesia:transaction(fun() -> mnesia:write(Post) end). 

एक टिप्पणी जोड़ने के लिए::

Comment = #comment{created_by = "", content = "", date_created = erlang:universaltime()}, 
mnesia:transaction(fun() -> 
    [Post] = mnesia:read(post, Title), 
    PostWithNewComment = Post#post{comments = [Comment | Post#post.comments]}, 
    mnesia:write(PostWithNewComment) 
end). 

मैं परीक्षण नहीं किया

-record(post, {title, date_created, body, comments = []}). 
-record(comment, {created_by, date_created, content}). 

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

+0

विधियों, निजी राज्य आदि के बारे में क्या? –

+1

शायद एक मॉड्यूल बनाएं और इन कार्यों को निर्यात करें: पोस्ट: सहेजें (शीर्षक, बॉडी) -> ठीक है | {त्रुटि, कारण}। पोस्ट: save_comment (पोस्टटाइटल, टिप्पणी बॉडी, बनाया गया) -> ठीक है | {त्रुटि, कारण}? मुझे यकीन नहीं है कि निजी राज्य –

+0

@TP द्वारा आपका क्या मतलब है, प्रश्न Erlang में ओओपी करने के बारे में है। वस्तु के उपयोगकर्ता से विवरण छिपाने के दौरान, राज्य और विधियों के साथ वस्तुओं को अनुकरण करने के लिए Erlang का उपयोग कैसे किया जा सकता है? (बेशक, एरलांग में कोई परिवर्तनीय स्थिति नहीं है, लेकिन ऑब्जेक्ट के उपयोगकर्ता को यह पता नहीं होना चाहिए कि इसे आंतरिक रूप से कैसे संभाला जाता है) मुझे लगता है कि वास्तविक वस्तुओं को अनुकरण करने में रिकॉर्ड से प्रक्रिया बेहतर होती है। –

6

एरलांग ऑब्जेक्ट ओरिएंटेड भाषा है। यह कथन अधिक शक्ति है अगर आप OOP पर जिस तरह से एलन Kay यह वर्णित देखो: मेरे लिए

OOP केवल संदेश, स्थानीय प्रतिधारण और संरक्षण और राज्य प्रक्रिया के छिपने की, और चरम के देर से बाध्यकारी का मतलब सारी चीजें।

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

ऐसी छोटी जगह में एरलांग में ओओपी के बारे में पूर्ण विवरण नहीं दे सकता है। मेरा सुझाव है कि आप Programming Erlang: Software for a Concurrent World पुस्तक पढ़ें।

+1

मैंने सोचा कि जो आर्मस्ट्रांग ने कभी स्वीकार नहीं किया है Erlang एक ओओ भाषा है। – Jeff

+2

@ जेफरी मुझे नहीं पता कि जो आर्मस्ट्रांग ओर्ल के रूप में एर्ल के रूप में स्वीकार करता है या नहीं, लेकिन यदि आप ओओपी की सख्त परिभाषा से जाते हैं, तो एरलांग दुर्लभ भाषाओं में से एक है जो आपको उस प्रतिमान में प्रोग्राम करने देता है। –

+0

जो इसे सख्त एलन के अर्थ में स्वीकार करता है, लेकिन निश्चित रूप से अधिक सामान्य वर्गों/वस्तुओं/पदानुक्रमों में नहीं, यानी ओओपी शब्द का सामान्य अर्थ क्या है। स्वीकार करें कि ओओपी बुराइयों को दूर करने के लिए यहां एक क्रॉस है! :-) – rvirding

0

आपका उदाहरण वास्तव में अच्छा OO शैली का प्रतिनिधित्व नहीं करता:

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

ओओ प्रोग्रामिंग के लिए यह किसी प्रकार की BlogDb ऑब्जेक्ट को और अधिक समझ में आता है कि कोई पोस्ट और टिप्पणी ऑब्जेक्ट्स भेजता है। एक टिप्पणी ऑब्जेक्ट को यह जानने की ज़रूरत है कि कौन सी पोस्ट आईडी यह एक टिप्पणी है। आपको 'नया' ऑपरेटर का उपयोग करके पोस्ट और टिप्पणी ऑब्जेक्ट्स नहीं बनाना चाहिए, इसके बजाय BlogDb इंटरफ़ेस में ऐसे तरीकों हैं जो उन के नए उदाहरण लौटाते हैं।

अचानक आपके पास एरलांग में एक ही चीज़ को लागू करने का एक व्यवहार्य तरीका है। एक gen_server शुरू करें जो blog_db है। क्या

Post = myblog:post(Title, Body), 
{ok, Result} = myblog:add_post(BlogDb, Post), 
... 

आप पोस्ट मूल्य के विवरण पता करने की जरूरत नहीं है, इसलिए है कि यह कैसे निर्माण किया है इसके लिए एक "निर्माता" एक और मॉड्यूल में में छिपा हुआ है जैसी चीजों।

+1

लोग हमेशा इस बात पर टिप्पणी क्यों करेंगे कि प्रश्न में उदाहरण कितने खराब हैं? यह उदाहरण के लिए, केवल त्वरित संदर्भ के लिए, किसी भी व्यक्ति को बेहतर तरीके से समझने में मदद करने के लिए, कुछ प्रकार के "अच्छी तरह से डिज़ाइन किए गए, पैटर्न वाले उदाहरण" के लिए नहीं है! – Jeff

+0

क्योंकि अच्छी तरह से डिजाइन ओओ "सीओ" के समान है। – Christian

0

OOP केवल संदेश, स्थानीय प्रतिधारण और संरक्षण और राज्य प्रक्रिया के छिपने, और चरम सब बातों के देर से बाध्यकारी होता है।

एलन केन डैन इंगल्स के साथ स्मॉलटाक के निर्माता हैं। यदि आप स्मॉलटाक को देखते हैं तो यह स्पष्ट हो जाता है कि उसका संदेश मैसेजिंग के साथ क्या है: कुछ रिसीवर ऑब्जेक्ट को एक संदेश भेजा जाता है जैसे कि Bumblebee.fly()। मैंने स्मॉलटाक के साथ लगभग 10 वर्षों का विकास किया है। मुझे पता है कि यह कैसे डिजाइन किया गया है। लेकिन एरलांग में क्या किया जाता है फ्लाई (ए बम्बलबी) जहां एंबल्बी भी कक्षा का उदाहरण नहीं है।

मुझे इस बारे में निश्चित नहीं है, लेकिन जब आप एर्लांग में अभिनेताओं को देखते हैं तो वे संदेश का आदान-प्रदान नहीं करते हैं। जैसा कि मैं अब तक एर्लांग को समझता हूं, यह {case {...}} निर्माण प्राप्त होता है क्योंकि संदेशों को कुछ सूची से पुनर्प्राप्त करना होता है। प्राप्तकर्ता अभिनेता को भेजने का कोई और तरीका नहीं है।

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

संबंधित मुद्दे