विशुद्ध रूप से कार्यात्मक भाषा में दृढ़ता कैसे फिट होती है?


18

दृढ़ता से निपटने के लिए कमांड हैंडलर का उपयोग करने का पैटर्न कैसे शुद्ध रूप से कार्यात्मक भाषा में फिट होता है, जहां हम संभव के रूप में पतली से IO-संबंधित कोड बनाना चाहते हैं?


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

C # में एक स्केच:

public class DiscardDraftDocumentCommandHandler : CommandHandler<DiscardDraftDocument>
{
    IDraftDocumentRepository _repo;
    IEventPublisher _publisher;

    public DiscardDraftCommandHandler(IDraftDocumentRepository repo, IEventPublisher publisher)
    {
        _repo = repo;
        _publisher = publisher;
    }

    public override void Handle(DiscardDraftDocument command)
    {
        var document = _repo.Get(command.DocumentId);
        document.Discard(command.UserId);
        _publisher.Publish(document.NewEvents);
    }
}

documentडोमेन वस्तु व्यापार के नियम (जैसे या "आप एक दस्तावेज है कि पहले से ही खारिज कर दिया गया है त्यागने नहीं कर सकते" "उपयोगकर्ता दस्तावेज़ त्यागने के लिए अनुमति होनी चाहिए") लागू करने के लिए और डोमेन घटनाओं हम प्रकाशित करने की जरूरत पैदा करने के लिए जिम्मेदार है ( document.NewEventsहोगा हो सकता है ( IEnumerable<Event>और शायद एक DocumentDiscardedघटना होगी)।

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


हास्केल जैसी विशुद्ध रूप से कार्यात्मक भाषा में, आप कमांड हैंडलर को मोटे तौर पर इस तरह से मॉडल कर सकते हैं:

newtype CommandHandler = CommandHandler {handleCommand :: Command -> IO Result)
data Result a = Success a | Failure Reason
type Reason = String

discardDraftDocumentCommandHandler = CommandHandler handle
    where handle (DiscardDraftDocument documentID userID) = do
              document <- loadDocument documentID
              let result = discard document userID :: Result [Event]
              case result of
                   Success events -> publishEvents events >> return result
                   -- in an event-sourced model, there's no extra step to save the document
                   Failure _ -> return result
          handle _ = return $ Failure "I expected a DiscardDraftDocument command"

यहाँ मैं समझने के लिए संघर्ष कर रहा हूँ। आमतौर पर, कुछ प्रकार के 'प्रेजेंटेशन' कोड होंगे जो कमांड हैंडलर में कॉल करते हैं, जैसे कि GUI या REST API। तो अब हमारे कार्यक्रम में दो परतें हैं जिन्हें IO - कमांड हैंडलर और व्यू - जो कि हास्केल में एक बड़ी संख्या में नहीं है - करने की आवश्यकता है।

जहां तक ​​मैं बाहर कर सकता हूं, यहां दो विरोधी ताकतें हैं: एक मॉडल / दृश्य अलगाव है और दूसरा मॉडल को बनाए रखने की आवश्यकता है। कहीं न कहीं मॉडल को बनाए रखने के लिए IO कोड की आवश्यकता होती है , लेकिन मॉडल / दृश्य पृथक्करण कहता है कि हम इसे अन्य सभी IO कोड के साथ प्रस्तुति परत में नहीं डाल सकते।

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

तो: हम कार्यक्रम के बहुत किनारे तक IO कोड को पुश करने की इच्छा के साथ मॉडल / दृश्य पृथक्करण कैसे करते हैं, जब मॉडल को बनाए रखने की आवश्यकता होती है? हम दो अलग-अलग प्रकार के IO को कैसे अलग रखते हैं , लेकिन फिर भी सभी शुद्ध कोड से दूर रहते हैं?


अद्यतन : इनाम 24 घंटे से कम समय में समाप्त हो रहा है। मुझे नहीं लगता है कि वर्तमान उत्तरों में से किसी ने भी मेरे प्रश्न को संबोधित किया है। @ Ptharien की लौ के बारे में टिप्पणी acid-stateआशाजनक लगती है, लेकिन यह एक जवाब नहीं है और इसकी विस्तार से कमी है। मुझे बर्बाद करने के लिए इन बिंदुओं से नफरत होगी!


1
शायद हास्केल में विभिन्न दृढ़ता पुस्तकालयों के डिजाइन को देखना उपयोगी होगा; विशेष रूप से, acid-stateआप जो वर्णन कर रहे हैं, उसके करीब लगता है
1940 में Ptharien की लौ

1
acid-stateबहुत अच्छा लग रहा है, उस लिंक के लिए धन्यवाद। एपीआई डिजाइन के संदर्भ में यह अभी भी बाध्य है IO; मेरा प्रश्न यह है कि कैसे एक दृढ़ता का ढांचा एक बड़ी वास्तुकला में फिट बैठता है। क्या आप किसी भी ओपन-सोर्स एप्लिकेशन के बारे में जानते हैं acid-stateजो एक प्रेजेंटेशन लेयर के साथ उपयोग करते हैं, और दो को अलग रखने में सफल होते हैं?
बेंजामिन हॉजसन

Queryऔर Updatemonads बहुत दूर से निकाल दिए जातेIO हैं, वास्तव में। मैं एक उत्तर में एक सरल उदाहरण देने की कोशिश करूंगा।
पथरियन की लौ

ऑफ-टॉपिक होने के जोखिम पर, इस तरह से कमांड / हैंडलर पैटर्न का उपयोग करने वाले किसी भी पाठक के लिए, मैं वास्तव में अक्का.नेट की जांच करने की सलाह देता हूं। अभिनेता मॉडल को यहां एक अच्छा फिट महसूस होता है। Pluralsight पर इसके लिए एक बढ़िया पाठ्यक्रम है। (मैं कसम खाता हूं कि मैं सिर्फ एक फैनबॉय हूं, प्रमोशनल बॉट नहीं।)
आरजेबी

जवाबों:


6

हास्केल में घटकों को अलग करने का सामान्य तरीका मोनाड ट्रांसफार्मर स्टैक है। मैं इसे नीचे और अधिक विस्तार से समझाता हूं।

कल्पना करें कि हम एक प्रणाली बना रहे हैं जिसमें कई बड़े पैमाने पर घटक हैं:

  • एक घटक जो डिस्क या डेटाबेस (सबमॉडल) के साथ बात करता है
  • एक घटक जो हमारे डोमेन (मॉडल) पर रूपांतरण करता है
  • एक घटक जो उपयोगकर्ता के साथ सहभागिता करता है (देखें)
  • एक घटक जो दृश्य, मॉडल और सबमॉडल (नियंत्रक) के बीच संबंध का वर्णन करता है
  • एक घटक जो पूरे सिस्टम (चालक) को किकस्टार्ट करता है

हम तय करते हैं कि हमें अच्छे कोड शैली को बनाए रखने के लिए इन घटकों को शिथिल रखने की आवश्यकता है।

इसलिए हम अपने प्रत्येक घटक को पॉलिमॉर्फिक रूप से कोड करते हैं, हमें मार्गदर्शन करने के लिए विभिन्न एमटीएल कक्षाओं का उपयोग करते हैं:

  • सबमॉडल में हर फंक्शन टाइप का होता है MonadState DataState m => Foo -> Bar -> ... -> m Baz
    • DataState हमारे डेटाबेस या भंडारण की स्थिति का एक स्नैपशॉट का शुद्ध प्रतिनिधित्व है
  • मॉडल में हर फ़ंक्शन शुद्ध है
  • दृश्य में प्रत्येक फ़ंक्शन प्रकार का होता है MonadState UIState m => Foo -> Bar -> ... -> m Baz
    • UIState हमारे उपयोगकर्ता इंटरफ़ेस की स्थिति का एक स्नैपशॉट का शुद्ध प्रतिनिधित्व है
  • कंट्रोलर में हर फंक्शन टाइप का होता है MonadState (DataState, UIState) m => Foo -> Bar -> ... -> m Baz
    • ध्यान दें कि नियंत्रक के पास दृश्य की स्थिति और सबमॉडल की स्थिति दोनों तक पहुंच है
  • ड्राइवर की केवल एक परिभाषा है, main :: IO ()जो अन्य घटकों को एक प्रणाली में संयोजित करने का निकट-तुच्छ कार्य करता है
    • व्यू और सबमॉडल को उसी राज्य प्रकार में उपयोग करने की आवश्यकता होगी जैसे नियंत्रक zoomया एक समान कॉम्बिनेटर का उपयोग कर
    • मॉडल शुद्ध है, और इसलिए प्रतिबंध के बिना उपयोग किया जा सकता है
    • अंत में, सब कुछ (एक प्रकार के साथ संगत) में रहता है StateT (DataState, UIState) IO, जो तब डेटाबेस या भंडारण की वास्तविक सामग्री के साथ चलाया जाता है IO

1
यह उत्कृष्ट सलाह है, और वास्तव में मैं क्या देख रहा था। धन्यवाद!
बेंजामिन हॉजसन

2
मैं इसका जवाब पचा रहा हूं। क्या आप इस वास्तुकला में 'सबमॉडल' की भूमिका स्पष्ट कर सकते हैं? IO के प्रदर्शन के बिना यह "डिस्क या डेटाबेस के साथ कैसे बात करता है"? मैं विशेष रूप से इस बारे में उलझन में हूँ कि आपके द्वारा " DataStateहमारे डेटाबेस या भंडारण की स्थिति के स्नैपशॉट का शुद्ध प्रतिनिधित्व" क्या है। संभवतः आप पूरे डेटाबेस को मेमोरी में लोड करने का मतलब नहीं रखते हैं!
बेंजामिन हॉजसन

1
मैं इस तर्क के C # क्रियान्वयन पर आपके विचारों को देखना पसंद करूंगा। मुझे लगता है कि मैं तुम्हें एक उभार के साथ रिश्वत नहीं दे सकता? ;-)
RJB

1
@RJB दुर्भाग्य से, आपको भाषा में उच्च प्रकार की अनुमति देने के लिए C # विकास टीम को रिश्वत देनी होगी, क्योंकि उनके बिना यह वास्तुकला थोड़ा सपाट हो जाती है।
पंथरेन की लौ

4

तो: हम कार्यक्रम के बहुत किनारे तक IO कोड को पुश करने की इच्छा के साथ मॉडल / दृश्य पृथक्करण कैसे करते हैं, जब मॉडल को बनाए रखने की आवश्यकता होती है?

क्या मॉडल को बनाए रखने की आवश्यकता है? कई कार्यक्रमों में, मॉडल को सहेजना आवश्यक है क्योंकि राज्य अप्रत्याशित है, कोई भी ऑपरेशन किसी भी तरह से मॉडल को म्यूट कर सकता है, इसलिए मॉडल की स्थिति को जानने का एकमात्र तरीका इसे सीधे एक्सेस करना है।

यदि, आपके परिदृश्य में, घटनाओं का क्रम (जो मान्य और स्वीकृत हो चुका है) हमेशा राज्य उत्पन्न कर सकता है, तो यह ऐसी घटनाएं हैं जिन्हें लगातार बनाए रखने की आवश्यकता है, न कि राज्य की। घटनाओं को फिर से दोहराकर राज्य को हमेशा उत्पन्न किया जा सकता है।

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

तो अब हमारे कार्यक्रम में दो परतें हैं जिन्हें IO - कमांड हैंडलर और व्यू - जो कि हास्केल में एक बड़ी संख्या में नहीं है - करने की आवश्यकता है।

आदेश को स्वीकार किए जाने के बाद, घटना को दो गंतव्यों (घटना भंडारण, और रिपोर्टिंग प्रणाली) के लिए सूचित किया जाता है, लेकिन कार्यक्रम की एक ही परत पर।

इसके अलावा
इवेंट सोर्सिंग
ईगर पढ़ें पढ़ें व्युत्पत्ति


2
मैं इवेंट-सोर्सिंग से परिचित हूं (मैं अपने उदाहरण में इसका उपयोग कर रहा हूं!), और फूटने वाले बालों से बचने के लिए मैं अभी भी कहूंगा कि इवेंट-सोर्सिंग दृढ़ता की समस्या के लिए एक दृष्टिकोण है। किसी भी स्थिति में, ईवेंट सोर्सिंग आपके डोमेन ऑब्जेक्ट्स को कमांड हैंडलर में लोड करने की आवश्यकता को कम नहीं करती है । कमांड हैंडलर को यह नहीं पता है कि ऑब्जेक्ट एक इवेंट स्ट्रीम, एक ORM, या एक संग्रहीत प्रक्रिया से आया है - यह सिर्फ रिपॉजिटरी से प्राप्त करता है।
बेंजामिन हॉजसन

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

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

2

आप सभी गैर-IO गतिविधियों के लिए अपने IO के गहन अनुप्रयोग में जगह बनाने की कोशिश कर रहे हैं; दुर्भाग्य से टिपिकल CRUD एप्स जैसे कि आप IO के अलावा कुछ और करते हैं।

मुझे लगता है कि आप प्रासंगिक पृथक्करण को ठीक समझते हैं, लेकिन जहां आप प्रिसेंटेशन कोड से कुछ लेयर्स पर कुछ संख्या में दृढ़ता आईओ कोड डालने की कोशिश कर रहे हैं, इस मामले का सामान्य तथ्य आपके कंट्रोलर में है, जिसे आप अपने पास बुला रहे हैं। दृढ़ता की परत, जो आपको अपनी प्रस्तुति के बहुत करीब महसूस कर सकती है - लेकिन यह उस प्रकार के ऐप में सिर्फ एक संयोग है कि इसके पास बहुत कम है।

प्रस्तुति और दृढ़ता मूल रूप से आपके द्वारा यहां बताए जा रहे ऐप के प्रकार की संपूर्णता बनाती है।

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


1
आप कह रहे हैं कि कुछ दृढ़ता और प्रस्तुति के लिए CRUD सिस्टम के लिए यह ठीक है। यह मुझे उचित लगता है; हालाँकि मैंने CRUD का उल्लेख नहीं किया। मैं विशेष रूप से डीडीडी के बारे में पूछ रहा हूं, जहां आपके पास व्यावसायिक वस्तुएं हैं जटिल बातचीत, एक दृढ़ता परत (कमांड हैंडलर) और उसके ऊपर एक प्रस्तुति परत। पतले IO आवरण को बनाए रखते हुए आप दो IO परतों को कैसे अलग रखते हैं ?
बेंजामिन हॉजसन

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

2
@BenjaminHodgson मैं आपके सिर में इस स्थिति में DDD या अन्य अंतर्निहित OO डिजाइन के तरीकों के मिश्रण के खिलाफ दृढ़ता से सलाह दूंगा, यह केवल भ्रमित करने वाला है। जबकि हां, आप शुद्ध एफपी में बिट्स और बॉबल्स जैसी वस्तु बना सकते हैं, उनके आधार पर डिजाइन दृष्टिकोण आवश्यक रूप से आपकी पहली पहुंच नहीं होना चाहिए। आपके द्वारा वर्णित परिदृश्य में, जैसा कि मैं ऊपर उल्लेख करता हूं, मैं कल्पना करूंगा, एक नियंत्रक जो दो IO और शुद्ध कोड के बीच संचार करता है: प्रस्तुति IO में जाता है और नियंत्रक से अनुरोध किया जाता है, नियंत्रक चीजों को शुद्ध खंडों, और दृढ़ता खंडों तक पहुंचाता है।
जिमी हॉफ

1
@BenjaminHodgson आप एक बुलबुले की कल्पना कर सकते हैं जहाँ आपके सभी शुद्ध कोड रहते हैं, सभी परतों और काल्पनिकता के साथ आप जिस भी डिज़ाइन की सराहना करते हैं उसमें चाहें। इस बुलबुले के लिए प्रवेश बिंदु एक छोटा टुकड़ा होने जा रहा है जिसे मैं एक "नियंत्रक" (शायद गलत तरीके से) कह रहा हूं जो प्रस्तुति, दृढ़ता और शुद्ध टुकड़ों के बीच संचार करता है। इस तरह आपकी दृढ़ता प्रस्तुति या शुद्ध और इसके विपरीत कुछ भी नहीं जानती है - और यह आपके IO सामान को आपकी शुद्ध प्रणाली के बुलबुले के ऊपर इस पतली परत में रखता है।
जिमी हॉफ

2
@BenjaminHodgson यह "स्मार्ट ऑब्जेक्ट्स" जिस दृष्टिकोण से आप बात करते हैं वह स्वाभाविक रूप से एफपी के लिए एक बुरा दृष्टिकोण है, एफपी में स्मार्ट ऑब्जेक्ट्स के साथ समस्या यह है कि वे बहुत दूर हैं और सामान्य रूप से बहुत कम हैं। आप उस डेटा और कार्यक्षमता के साथ समाप्त हो जाते हैं, जो उसमें बंधा होता है, जिसमें FP यह पसंद करता है कि आपके डेटा में कार्यक्षमता के लिए ढीली युग्मन हो, ताकि आप अपने कार्यों को सामान्यीकृत कर सकें और फिर वे कई प्रकार के डेटा में काम करेंगे। यहाँ मेरे उत्तर को पढ़ें: programmers.stackexchange.com/questions/203077/203082#203082
जिम्मी हॉफ

1

पास के रूप में मैं आपके प्रश्न को समझ सकता हूं (जो कि मैं नहीं कर सकता, लेकिन सोचा था कि मैं अपने 2 सेंट में फेंक दूंगा), क्योंकि आपके पास स्वयं वस्तुओं तक पहुंच नहीं है, आपको अपने स्वयं के ऑब्जेक्ट डेटाबेस की आवश्यकता है जो स्वयं- समय के साथ समाप्त हो रहा है)।

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

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

फ़ाइल सर्वर के क्षेत्र में सांबा के पास एक्सेस लिस्ट और वैकल्पिक डेटा स्ट्रीम जैसी चीजों को संग्रहीत करने के अलग-अलग तरीके होते हैं, जो कि होस्ट ओएस द्वारा प्रदान किए जाने पर निर्भर करता है। आदर्श रूप में, सांबा को एक फाइल सिस्टम पर होस्ट किया जा रहा है जो फाइलों पर विस्तारित विशेषता प्रदान करता है। उदाहरण 'xux' पर 'linux' - अधिक कमांड एक फ़ाइल के साथ विस्तारित विशेषताओं की नकल कर रहे हैं (डिफ़ॉल्ट रूप से, linux पर अधिकांश बर्तन "w / o विस्तारित विशेषताओं की तरह सोचते हैं" बड़े हुए हैं)।

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

यह आपके लिए उपयोगी नहीं हो सकता है यदि आपको उस कार्यान्वयन के लिए विशेष जानकारी की आवश्यकता है जिसके साथ आप काम कर रहे हैं, लेकिन वैचारिक रूप से, एक ही सिद्धांत को दोनों समस्या सेटों पर लागू किया जा सकता है। इसलिए यदि आप एल्गोरिदम और तरीकों की तलाश में थे जो आप चाहते हैं, वह मदद कर सकता है। यदि आपको कुछ विशिष्ट ढांचे में अधिक विशिष्ट ज्ञान की आवश्यकता है, तो शायद इतना उपयोगी नहीं है ... ;-)

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

यदि आप जानते हैं कि कब वस्तुओं की समय सीमा समाप्त हो जाती है / हटा दी जाती है, तो आप खेल से आगे हैं, और इसे उसी समय अपने मेटाबेड से बाहर निकाल सकते हैं, लेकिन यह स्पष्ट नहीं था कि आपके पास यह विकल्प है या नहीं।

चीयर्स!


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

आप विशुद्ध रूप से कार्यात्मक प्रोग्रामिंग प्रतिमान में डेटा दृढ़ता के बारे में पूछ रहे हैं। विकिपीडिया का हवाला देते हुए: "विशुद्ध रूप से कार्यात्मक कंप्यूटिंग में एक शब्द है जिसका उपयोग एल्गोरिदम, डेटा संरचनाओं, या प्रोग्रामिंग भाषाओं का वर्णन करने के लिए किया जाता है जो प्रोग्राम के चलने वाले वातावरण में संस्थाओं के विनाशकारी संशोधनों (अपडेट) को बाहर करता है।" ==== परिभाषा के अनुसार, डेटा दृढ़ता अप्रासंगिक है और इसका ऐसा कोई उपयोग नहीं है जो कोई डेटा संशोधित करता है। कड़ाई से बोलने पर आपके सवाल का कोई जवाब नहीं है। आपने जो लिखा है, मैं उसकी अधिक ढीली व्याख्या करने का प्रयास कर रहा था।
अस्तारा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.