কীভাবে দৃistence়তা নিখুঁত কার্যকরী ভাষায় ফিট করে?


18

অধ্যবসায়ের মোকাবেলায় কমান্ড হ্যান্ডলারগুলি ব্যবহার করার ধরণটি কীভাবে খাঁটি কার্যকরী ভাষায় ফিট করে, যেখানে আমরা আইও-সম্পর্কিত কোডটিকে যতটা সম্ভব পাতলা করতে চাই?


কোনও বস্তু-ভিত্তিক ভাষায় ডোমেন-চালিত ডিজাইন প্রয়োগ করার সময়, রাষ্ট্রীয় পরিবর্তনগুলি কার্যকর করতে কমান্ড / হ্যান্ডলার প্যাটার্নটি ব্যবহার করা সাধারণ । এই নকশায়, কমান্ড হ্যান্ডলারগুলি আপনার ডোমেন অবজেক্টগুলির শীর্ষে বসে থাকে এবং বিরক্তিকর দৃ pers়তা সম্পর্কিত যুক্তির জন্য যেমন रिपোজিটরিগুলি ব্যবহার এবং ডোমেন ইভেন্টগুলি প্রকাশ করার জন্য দায়বদ্ধ। হ্যান্ডলারগুলি আপনার ডোমেন মডেলের সর্বজনীন মুখ; ইউআই এর মতো অ্যাপ্লিকেশন কোড হ্যান্ডলারের কল করে যখন এটি ডোমেন অবজেক্টের অবস্থা পরিবর্তন করতে পারে।

সি # তে একটি স্কেচ:

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.NewEventswould একটি হতে পারে IEnumerable<Event>এবং সম্ভবত একটি DocumentDiscardedইভেন্ট থাকবে)।

এটি একটি দুর্দান্ত নকশা - এটি প্রসারিত করা সহজ (আপনি আপনার ডোমেন মডেলটি পরিবর্তন না করে নতুন কমান্ড হ্যান্ডলার যোগ করে নতুন ব্যবহারের কেস যুক্ত করতে পারেন) এবং কীভাবে অবজেক্টগুলি বজায় রাখা যায় তা সম্পর্কে অজ্ঞতাবাদী (আপনি সহজেই কোনও মঙ্গোর জন্য এনএইচবারনেট সংগ্রহস্থল সরিয়ে নিতে পারবেন) সংগ্রহস্থল, বা একটি ইভেন্টস্টোর প্রকাশকের জন্য একটি রেবিট এমকিউ প্রকাশককে স্যুপ করুন) যা জাল এবং মক ব্যবহার করে পরীক্ষা করা সহজ করে তোলে। এটি মডেল / ভিউ বিভাজনও মেনে চলেন - কমান্ড হ্যান্ডলারের কোনও ব্যাচ কাজ, জিইউআই, বা কোনও আরএসটি এপিআই দ্বারা ব্যবহৃত হচ্ছে কিনা সে সম্পর্কে কোনও ধারণা নেই।


খাঁটি-কার্যকরী ভাষায় হাস্কেলের মতো আপনি কমান্ড হ্যান্ডলারটিকে মোটামুটি এভাবে মডেল করতে পারেন:

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"

আমি যে অংশটি বুঝতে চেষ্টা করছি তা এখানে। সাধারণত, কিছু প্রকারের 'প্রেজেন্টেশন' কোড আসবে যা জিইউআই বা একটি রেস্ট এপিআইয়ের মতো কমান্ড হ্যান্ডলারে কল করে। সুতরাং এখন আমাদের প্রোগ্রামে দুটি স্তর রয়েছে যার জন্য আইও করা দরকার - কমান্ড হ্যান্ডলার এবং ভিউ - যা হাস্কেলের একটি বড় সংখ্যা নয়।

আমি যতদূর পেরে উঠতে পারি, এখানে দুটি বিরোধী শক্তি রয়েছে: একটি হ'ল মডেল / ভিউ বিচ্ছেদ এবং অন্যটি হ'ল মডেলটি ধরে রাখা দরকার। মডেলটি কোথাও ধরে রাখতে আইও কোড থাকা দরকার , তবে মডেল / ভিউ বিভাজনটি বলে যে আমরা অন্য সমস্ত আইও কোড সহ উপস্থাপনা স্তরটিতে রাখতে পারি না।

অবশ্যই, একটি "সাধারণ" ভাষায়, আইও কোথাও ঘটতে পারে (এবং করবে)। ভাল ডিজাইন নির্দেশ দেয় যে বিভিন্ন ধরণের আইও আলাদা রাখতে হবে, তবে সংকলক এটি প্রয়োগ করে না।

সুতরাং: আমরা মডেলটির ক্রমাগত যখন আইও কোডটি প্রান্তের প্রান্তে ধাক্কা দেওয়ার আকাঙ্ক্ষার সাথে মডেল / ভিউ বিচ্ছিন্নতার সাথে কীভাবে মিলিত করব? আমরা কীভাবে দুটি ভিন্ন ধরণের আইও আলাদা রাখব , তবে সমস্ত খাঁটি কোড থেকে এখনও দূরে রেখেছি?


আপডেট : অনুগ্রহটির মেয়াদ 24 ঘন্টােরও কম সময়ের মধ্যে শেষ হয়। আমার মনে হয় না যে বর্তমানের উত্তরগুলির মধ্যে কোনওটিই আমার প্রশ্নের সমাধান করেছে। @ পাথারিয়ানের শিখার মন্তব্য সম্পর্কে মন্তব্য আশাপ্রদজনক acid-stateবলে মনে হচ্ছে, তবে এটি কোনও উত্তর নয় এবং এটির বিশদর অভাব রয়েছে। আমি এই পয়েন্টগুলি নষ্ট করতে যেতে ঘৃণা করব!


1
সম্ভবত এটি হাস্কেলের বিভিন্ন অধ্যবসায় গ্রন্থাগারের নকশাটি দেখতে সহায়ক হবে; বিশেষত, acid-stateআপনি যা বর্ণনা করছেন তার কাছাকাছি মনে হচ্ছে
পাথারিয়ানদের শিখা

1
acid-stateদেখতে দুর্দান্ত লাগছে, এই লিঙ্কটির জন্য ধন্যবাদ। এপিআই ডিজাইনের ক্ষেত্রে এটি এখনও আবদ্ধ বলে মনে হচ্ছে IO; আমার প্রশ্নটি কীভাবে একটি অধ্যবসায় কাঠামোটি একটি বৃহত স্থাপত্যের সাথে ফিট করে into আপনি কি এমন কোনও ওপেন-সোর্স অ্যাপ্লিকেশন সম্পর্কে জানেন যা acid-stateউপস্থাপনা স্তরের পাশাপাশি ব্যবহার করে এবং দুটি পৃথক রাখতে সফল হয়?
বেঞ্জামিন হজসন

Queryএবং Updatemonads বেশ দূরে থেকে সরিয়ে ফেলা হয় IO, আসলে। আমি একটি উত্তরের একটি সহজ উদাহরণ দেওয়ার চেষ্টা করব।
পাথারিনের শিখা

অফ-টপিক হওয়ার ঝুঁকিতে, যে কোনও পাঠক এইভাবে কমান্ড / হ্যান্ডলার প্যাটার্নটি ব্যবহার করছেন, আমি সত্যিই আক্কা.এনইটি চেক করার পরামর্শ দিই। অভিনেতার মডেলটি এখানে বেশ ভাল ফিট লাগছে। বহুবর্ষে এটির জন্য একটি দুর্দান্ত কোর্স রয়েছে। (আমি দিব্যি আমি কেবল একজন অনুরাগী, প্রচারমূলক বট নই।)
আরজেবি

উত্তর:


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
আমি এই উত্তর হজম করছি। আপনি কি এই স্থাপত্যে 'সাব মডেল' এর ভূমিকা স্পষ্ট করে বলতে পারেন? এটি আইও সম্পাদন না করে কীভাবে "ডিস্ক বা ডাটাবেসের সাথে কথা বলবে"? "আপনি DataStateআমাদের ডেটাবেস বা সঞ্চয়স্থানের রাজ্যের স্ন্যাপশটের খাঁটি উপস্থাপনা " বলতে কী বোঝাতে চেয়েছি সে সম্পর্কে আমি বিশেষত বিভ্রান্ত । সম্ভবত আপনি পুরো ডাটাবেসটিকে মেমরিতে লোড করবেন না!
বেনিয়ামিন হজসন

1
আমি এই যুক্তিটির সি # বাস্তবায়নে আপনার চিন্তাভাবনাগুলি দেখতে সম্পূর্ণ পছন্দ করব। মনে করবেন না যে আমি আপনাকে উত্সাহ দিয়ে ঘুষ দিতে পারি? ;-)
আরজেবি

1
@ আরজেবি দুর্ভাগ্যক্রমে, ভাষার উচ্চতর ধরণের সুযোগ দিতে আপনাকে সি # উন্নয়ন দলকে ঘুষ দিতে হবে, কারণ এগুলি ছাড়া এই স্থাপত্যটি কিছুটা সমতল হয়ে পড়ে falls
পথারিনের শিখা Fla

4

সুতরাং: আমরা মডেলটির ক্রমাগত যখন আইও কোডটি প্রান্তের প্রান্তে ধাক্কা দেবার আকাঙ্ক্ষার সাথে মডেল / দেখার বিচ্ছেদকে কীভাবে মিলিত করব?

মডেল চালিয়ে যাওয়া উচিত? অনেক প্রোগ্রামে, মডেলটি সংরক্ষণ করা আবশ্যক কারণ রাজ্যটি অনির্দেশ্য, যে কোনও অপারেশন মডেলকে যে কোনও উপায়ে রূপান্তর করতে পারে, সুতরাং মডেলের অবস্থা জানার একমাত্র উপায় হ'ল সরাসরি এটি অ্যাক্সেস করা।

যদি, আপনার দৃশ্যে, ইভেন্টগুলির ক্রম (বৈধতা স্বীকৃত এবং স্বীকৃত আদেশগুলি) সর্বদা রাষ্ট্র উত্পন্ন করতে পারে, তবে এটি এমন ঘটনা যা স্থির রাখার প্রয়োজন, অগত্যা রাষ্ট্র নয়। ঘটনা সর্বদা পুনরায় চালনার মাধ্যমে রাজ্য উত্পন্ন করা যেতে পারে।

এই বলে যে, প্রায়শই সময় রাজ্য সংরক্ষণ করা হয় তবে কমান্ডগুলি পুনরায় খেলতে না দেওয়ার জন্য স্ন্যাপশট / ক্যাশে হিসাবে প্রয়োজনীয় প্রোগ্রামের ডেটা হিসাবে নয়।

সুতরাং এখন আমাদের প্রোগ্রামে দুটি স্তর রয়েছে যার জন্য আইও করা দরকার - কমান্ড হ্যান্ডলার এবং ভিউ - যা হাস্কেলের একটি বড় সংখ্যা নয়।

কমান্ডটি স্বীকৃত হওয়ার পরে, ইভেন্টটি দুটি গন্তব্যে (ইভেন্ট স্টোরেজ, এবং প্রতিবেদনের ব্যবস্থা) তবে প্রোগ্রামের একই স্তরে যোগাযোগ করা হয়।

এছাড়াও
ইভেন্ট সোর্সিং
আগ্রহী পড়ুন ডেরিভেশন দেখুন


2
আমি ইভেন্ট-সোর্সিংয়ের সাথে পরিচিত (আমি এটি আমার উপরের উদাহরণে ব্যবহার করছি!) এবং কেশ বিভক্ত হওয়া এড়াতে আমি এখনও বলব যে ইভেন্ট-সোর্সিং অধ্যবসায়ের সমস্যার একটি উপায়। যাইহোক, ইভেন্ট সোর্সিং কমান্ড হ্যান্ডলারে আপনার ডোমেন অবজেক্টগুলি লোড করার প্রয়োজনকে বাধা দেয় না । কমান্ড হ্যান্ডলার জানেন না যে কোনও ইভেন্ট স্ট্রিম, একটি ওআরএম, বা কোনও সঞ্চিত প্রক্রিয়া থেকে বস্তুগুলি এসেছিল কিনা - এটি কেবল এটি সংগ্রহস্থল থেকে পাওয়া যায়।
বেনিয়ামিন হজসন

1
আপনার বোঝাপড়া দেখে মনে হচ্ছে দম্পতি এবং কমান্ড হ্যান্ডলার একসাথে একাধিক আইও তৈরি করে। আমার বোধগম্যতা হ্যান্ডলারটি ইভেন্টটি উত্পন্ন করে এবং এর কোনও আগ্রহ নেই। এই উদাহরণের দর্শনটি পৃথক মডিউল হিসাবে দেখায় (প্রযুক্তিগতভাবে একই প্রয়োগে থাকলেও), এবং কমান্ড হ্যান্ডলারের সাথে মিলিত হয় না।
এফএমজাগুয়ার

1
আমি মনে করি আমরা হয়তো ক্রস উদ্দেশ্যতে কথা বলছি। আমি যখন 'ভিউ' বলি তখন আমি পুরো উপস্থাপনা স্তরটি নিয়ে কথা বলি যা কোনও REST এপিআই, বা একটি মডেল-ভিউ-কন্ট্রোলার সিস্টেম হতে পারে। (আমি সম্মত হই না যে ভিভিটি এমভিসি প্যাটার্নে মডেল থেকে ডিকোপল করা উচিত)) আমি মূলত "কমান্ড হ্যান্ডলারের কাছে যা কিছু ডাকি" বোঝায়।
বেনিয়ামিন হজসন

2

আপনি সমস্ত অ-আইও ক্রিয়াকলাপের জন্য আপনার আইও নিবিড় অ্যাপ্লিকেশনটিতে স্থান দেওয়ার চেষ্টা করছেন; দুর্ভাগ্যক্রমে আপনার মতো সাধারণ সিআরইউডি অ্যাপ্লিকেশনগুলি আইও ছাড়া অন্য কিছু করে।

আমি মনে করি আপনি প্রাসঙ্গিক বিচ্ছেদটি সূক্ষ্মভাবে বুঝতে পেরেছেন, তবে আপনি যেখানে উপস্থাপনা কোড থেকে কিছু স্তরের স্থিরতা আইও কোড রাখার চেষ্টা করছেন সেখানে বিষয়টির সাধারণ ঘটনাটি আপনার নিয়ামকের মধ্যে রয়েছে যে কোনও জায়গায় আপনাকে ফোন করতে হবে অধ্যবসায় স্তর, যা আপনার কাছে আপনার উপস্থাপনাটির খুব কাছাকাছি অনুভূত হতে পারে - তবে এ ধরণের অ্যাপটিতে এটি কেবল একটি কাকতালীয় বিষয়।

উপস্থাপনা এবং অধ্যবসায় মূলত আমার মনে হয় আপনি যে অ্যাপটির বর্ণনা দিচ্ছেন তার সম্পূর্ণতা রয়েছে।

যদি আপনি এই জাতীয় অ্যাপ্লিকেশনটিতে অনেক জটিল ব্যবসায়িক যুক্তি এবং ডেটা প্রসেসিংয়ের বিষয়ে আপনার মাথায় চিন্তা করেন, তবে আমি মনে করি আপনি নিজেকে কল্পনা করতে সক্ষম হবেন যে কীভাবে উপস্থাপনা আইও এবং অধ্যবসায় IO স্টাফ থেকে সুন্দরভাবে আলাদা হয়ে গেছে that এটি উভয় সম্পর্কে কিছুই জানা প্রয়োজন। এই মুহুর্তে আপনার সমস্যাটি হ'ল এক ধরণের অ্যাপ্লিকেশনটিতে এমন সমস্যার সমাধান শুরু করার চেষ্টা করার কারণে ঘটেছিল যার সাথে সমস্যাটি শুরু হয় না।


1
আপনি বলছেন যে সিআরইউডি সিস্টেমগুলির জন্য দম্পতি অধ্যবসায় এবং উপস্থাপনা ঠিক আছে। এটা আমার কাছে যুক্তিসঙ্গত মনে হয়; তবে আমি সিআরইউডি উল্লেখ করিনি। আমি বিশেষত ডিডিডি সম্পর্কে জিজ্ঞাসা করছি, যেখানে আপনার ব্যবসায়িক বিষয়গুলি জাদুকরী মিথস্ক্রিয়া, একটি অধ্যবসায় স্তর (কমান্ড হ্যান্ডলার) এবং তার উপরে একটি উপস্থাপনা স্তর রয়েছে। পাতলা আইও র‍্যাপারটি বজায় রেখে আপনি দুটি আইও স্তরগুলি কীভাবে পৃথক রাখবেন ?
বেনিয়ামিন হজসন

1
এনবি, আমি যে ডোমেনটি প্রশ্নের মধ্যে বর্ণনা করেছি তা খুব জটিল হতে পারে। সম্ভবত একটি খসড়া নথি খণ্ডন করা কিছু জড়িত অনুমতি যাচাইয়ের সাপেক্ষে, বা একই খসড়ার একাধিক সংস্করণ মোকাবেলা করার প্রয়োজন হতে পারে, বা বিজ্ঞপ্তিগুলি প্রেরণ করা প্রয়োজন হবে, বা ক্রিয়াটি অন্য কোনও ব্যবহারকারীর অনুমোদনের প্রয়োজন হবে, বা খসড়াগুলি কয়েকটি সংখ্যক মধ্য দিয়ে যেতে হবে চূড়ান্তকরণের আগে জীবদ্দশার পর্যায় ...
বেনিয়ামিন হজসন

2
@ বেঞ্জামিনহডসন আমি আপনার মাথায় এই পরিস্থিতিতে ডিডিডি বা অন্য সহজাতভাবে ওও ডিজাইন পদ্ধতিগুলি মিশ্রনের বিরুদ্ধে দৃ against়ভাবে পরামর্শ দেব, এটি কেবল বিভ্রান্ত হতে চলেছে। হ্যাঁ আপনি খাঁটি এফপিতে বিট এবং বুবলির মতো অবজেক্ট তৈরি করতে পারেন, তাদের উপর ভিত্তি করে নকশার পন্থা অগত্যা আপনার প্রথম পৌঁছানো উচিত নয়। আপনি যে দৃশ্যের বর্ণনা দিয়েছিলেন আমি উপরে বর্ণিত হিসাবে কল্পনা করব, একটি নিয়ামক যা দুটি আইও এবং খাঁটি কোডের মধ্যে যোগাযোগ করে: উপস্থাপনা আইও controlুকে যায় এবং নিয়ামকের কাছ থেকে অনুরোধ করা হয়, নিয়ামক জিনিসগুলিকে খাঁটি বিভাগগুলিতে এবং দৃ pers়তা বিভাগগুলিতে প্রেরণ করেন।
জিমি হোফা

1
@ বেঞ্জামিনহডসন আপনি এমন একটি বুদবুদ কল্পনা করতে পারেন যেখানে আপনার সমস্ত খাঁটি কোড বেঁচে থাকে, সমস্ত স্তর এবং সান্নিধ্যের সাথে আপনি যে নকশার প্রশংসা করেন তাতে আপনি চান। এই বুদ্বুদ জন্য প্রবেশ বিন্দু একটি ছোট টুকরা হতে চলেছে আমি একটি "নিয়ামক" (সম্ভবত ভুলভাবে) বলছি যা উপস্থাপনা, অধ্যবসায় এবং খাঁটি টুকরোগুলির মধ্যে যোগাযোগ করে। এইভাবে আপনার অধ্যবসায় উপস্থাপনা বা খাঁটি এবং তদ্বিপরীত কিছুই জানে না - এবং এটি আপনার খাঁটি সিস্টেমের বুদ্বুদের উপরে এই পাতলা স্তরটিতে আপনার আইও স্টাফ রাখে।
জিমি হোফা

2
@ বেনজামিনহডসন এই "স্মার্ট অবজেক্টস" পদ্ধতির কথা বলছেন যা এফপির পক্ষে অন্তর্নিহিত একটি খারাপ দৃষ্টিভঙ্গি, এফপিতে স্মার্ট অবজেক্টগুলির সমস্যা হ'ল তারা বেশ কয়েকগুণ বেশি এবং খুব সামান্যই সাধারণীকরণ করে। আপনি এটিতে আবদ্ধ ডেটা এবং কার্যকারিতা সমাপ্ত করেন, যেখানে এফপি পছন্দ করে যে আপনার ডেটা ফাংশনটির সাথে আলগা সংযুক্তি রয়েছে যাতে আপনি আপনার ফাংশনগুলি সাধারণীকরণের জন্য প্রয়োগ করতে পারেন এবং সেগুলি একাধিক ধরণের ডেটা জুড়ে কাজ করবে। আমার উত্তরটি এখানে পড়ুন: প্রোগ্রামার্স.সটাকেক্সচেঞ্জ
203077/203082#203082

1

আমি আপনার প্রশ্নটি যতটা কাছেই বুঝতে পারি (যা আমি নাও পারব, তবে ভেবেছিলাম যে আমি আমার 2 সেন্ট নিক্ষেপ করব), যেহেতু অগত্যা আপনার নিজের অবজেক্টগুলিতে অ্যাক্সেসের প্রয়োজন নেই, তাই আপনার নিজের অবজেক্টের ডাটাবেস থাকা দরকার যা স্ব- সময়ের সাথে সাথে মেয়াদ শেষ হয়)।

আদর্শভাবে বস্তুগুলিকে তাদের স্টেট সংরক্ষণ করার জন্য উন্নত করা যেতে পারে সুতরাং যখন তারা "প্রায় কাছাকাছি" চলে আসবে, তখন বিভিন্ন কমান্ড প্রসেসররা জানতে পারবে তারা কী নিয়ে কাজ করছে।

যদি এটি সম্ভব না হয়, (আইকি আইকি), একমাত্র উপায় হ'ল কিছু সাধারণ ডিবি-জাতীয় কী রয়েছে, যা আপনি কোনও স্টোরে তথ্য সংরক্ষণ করতে ব্যবহার করতে পারেন যা বিভিন্ন কমান্ডের মধ্যে ভাগ করে নেওয়া যায় - এবং আশা করি, ইন্টারফেস এবং / অথবা কোডটিকে "ওপেন আপ" করুন যাতে অন্য কোনও কমান্ড লেখকও মেটা-তথ্য সংরক্ষণ এবং প্রক্রিয়াজাতকরণের ক্ষেত্রে আপনার ইন্টারফেসটিকে গ্রহণ করবে।

হোস্ট ওএস কী সরবরাহ করে তার উপর নির্ভর করে ফাইল সার্ভারের ক্ষেত্রে সাম্বার অ্যাক্সেস তালিকা এবং বিকল্প ডেটা স্ট্রিমের মতো জিনিস সংরক্ষণের বিভিন্ন উপায় রয়েছে। আদর্শভাবে, সাম্বা একটি ফাইল সিস্টেমে হোস্ট করা হচ্ছে ফাইলগুলিতে বর্ধিত বৈশিষ্ট্য সরবরাহ করে। 'লিনাক্স'-এর' এক্সএফএস 'উদাহরণ - আরও কমান্ডগুলি একটি ফাইলের সাথে বর্ধিত বৈশিষ্ট্যগুলি অনুলিপি করছে (ডিফল্টরূপে, লিনাক্সের বেশিরভাগ ব্যবহারগুলি "বড় হয়েছে" w / o বর্ধিত বৈশিষ্ট্যের মতো মনে করে)।

একটি বিকল্প সমাধান - যা সাধারণ ফাইল (অবজেক্ট )গুলিতে অপারেটিং করা বিভিন্ন ব্যবহারকারীদের একাধিক সাম্বা প্রক্রিয়াগুলির জন্য কাজ করে, তা হ'ল যদি ফাইল সিস্টেম বর্ধিত বৈশিষ্ট্য হিসাবে সরাসরি ফাইলটিতে সংস্থান সংযুক্তি সমর্থন করে না, তবে একটি মডিউল ব্যবহার করে যা কার্যকর করে সাম্বা প্রক্রিয়াগুলির জন্য বর্ধিত বৈশিষ্ট্যগুলি অনুকরণ করার জন্য একটি ভার্চুয়াল ফাইল-সিস্টেম স্তর। কেবল সাম্বা এটি সম্পর্কে জানে, তবে যখন অবজেক্ট ফর্ম্যাটটি সমর্থন করে না তখন এটির কাজ করার সুবিধা রয়েছে তবে বিভিন্ন সাম্বা ব্যবহারকারী (সিএফ। কমান্ড প্রসেসর) যারা তার পূর্ববর্তী অবস্থার ভিত্তিতে ফাইলটিতে কিছু কাজ করেন তাদের সাথে কাজ করে। এটি ফাইল সিস্টেমের জন্য একটি সাধারণ ডাটাবেসে মেটা তথ্য সংরক্ষণ করবে যা ডাটাবেসের আকার নিয়ন্ত্রণ করতে সহায়তা করে (এবং না '

আপনি কাজ করছেন এমন বাস্তবায়ন সম্পর্কিত নির্দিষ্ট তথ্যের প্রয়োজন হলে এটি আপনার পক্ষে কার্যকর নাও হতে পারে, তবে ধারণাগতভাবে একই তত্ত্ব উভয় সমস্যার সেটগুলিতে প্রয়োগ করা যেতে পারে। সুতরাং আপনি যদি চান যা করতে অ্যালগরিদম এবং পদ্ধতিগুলি সন্ধান করছিলেন, এটি সাহায্য করতে পারে। আপনার যদি কিছু নির্দিষ্ট কাঠামোর মধ্যে আরও নির্দিষ্ট জ্ঞানের প্রয়োজন হয়, তবে সম্ভবত এত সহায়ক না ... ;-)

বিটিডব্লিউ - যে কারণে আমি 'স্ব-মেয়াদোত্তীর্ণ' উল্লেখ করছি - তা হ'ল এটি কী পরিষ্কার হয় না যদি আপনি জানেন কী কী জিনিসগুলি সেখানে রয়েছে এবং তারা কতক্ষণ অব্যাহত থাকে। যদি কোনও বিষয় মুছে ফেলা হয় তখন আপনার যদি জানার প্রত্যক্ষ উপায় না থাকে তবে এটি আপনার নিজের মেটাডিবি ট্রিম করতে হবে যাতে এটি পুরানো বা প্রাচীন মেটা তথ্যের সাথে ভরাট করা রোধ করতে পারে যা ব্যবহারকারীরা দীর্ঘকাল ধরে বস্তুগুলি মুছে ফেলেছে।

আপনি যদি জানেন যে কখন অবজেক্টসটির মেয়াদ শেষ / মোছা হয়ে যায়, তবে আপনি গেমের চেয়ে এগিয়ে রয়েছেন এবং একই সাথে এটি আপনার মেটাডিবি থেকেও শেষ করতে পারেন, তবে আপনার কাছে সেই বিকল্পটি ছিল কিনা তা পরিষ্কার নয়।

চিয়ার্স!


1
আমার কাছে এটি সম্পূর্ণ আলাদা প্রশ্নের উত্তরের মতো বলে মনে হচ্ছে। আমি ডোমেন-চালিত ডিজাইনের প্রসঙ্গে খাঁটি-কার্যকরী প্রোগ্রামিংয়ের আর্কিটেকচার সম্পর্কিত পরামর্শ খুঁজছিলাম। আপনি কি আপনার বক্তব্য স্পষ্ট করতে পারেন?
বেনিয়ামিন হডসন

আপনি খাঁটি-কার্যকরী প্রোগ্রামিং দৃষ্টান্তে ডেটা অধ্যবসায়ের বিষয়ে জিজ্ঞাসা করছেন। উইকিপিডিয়াকে উদ্ধৃত করে: "প্রোগ্রামিং চলমান পরিবেশে সত্ত্বার ধ্বংসাত্মক পরিবর্তন (আপডেট) বাদ দেয় এমন অ্যালগরিদম, ডেটা স্ট্রাকচার বা প্রোগ্রামিং ল্যাঙ্গুয়েজ বর্ণনা করতে ব্যবহৃত কম্পিউটারে বিশুদ্ধভাবে কার্যকরী একটি শব্দ is" ==== সংজ্ঞা অনুসারে, ডেটা অধ্যবসায় অপ্রাসঙ্গিক এবং এমন কোনও কিছুর কোনও ব্যবহার নেই যা কোনও ডেটা পরিবর্তন করে না। দৃrict়ভাবে বলতে গেলে আপনার প্রশ্নের কোনও উত্তর নেই। আপনি যা লিখেছেন তার আমি আরও looseিলে .ালা ব্যাখ্যা দেওয়ার চেষ্টা করছিলাম।
আস্তারা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.