পূর্বাবস্থায় ইঞ্জিনের জন্য নকশার প্যাটার্ন


117

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

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

আমি কল্পনা করতে পারি যে আপনি কীভাবে সরল কমান্ডগুলি সম্পাদন করবেন যা বস্তুর বৈশিষ্ট্য ইত্যাদি পরিবর্তন করে? তবে জটিল কমান্ডগুলি কীভাবে? মডেলে নতুন নোড অবজেক্টগুলি সন্নিবেশ করা এবং এমন কিছু লাইন অবজেক্ট যুক্ত করা যা নতুন নোডগুলিতে রেফারেন্স রাখে।

কীভাবে কেউ তা বাস্তবায়ন করতে পারেন?


যদি আমি মন্তব্যটি "Undo Algorthim" যোগ করি তবে তা কি এটি তৈরি করবে যাতে আমি "পূর্বাবস্থায় ফেরাতে পারি" এবং এটি খুঁজে পেতে পারি? এটিই আমি অনুসন্ধান করেছি এবং আমি নকল হিসাবে কিছু বন্ধ পেয়েছি।
পিটার টার্নার

হাই, আমরা যে অ্যাপ্লিকেশনটি বিকাশ করছি তাতে আমি পূর্বাবস্থায় / পূর্বাবস্থার বিকাশও করতে চাই e আমরা কিউটি 4 কাঠামো ব্যবহার করি এবং অনেকগুলি জটিল পূর্বাবস্থায় ফিরানো / পুনরায় কাজ করা প্রয়োজন..আমি ভাবছিলাম, আপনি কি কমান্ড-প্যাটার্ন ব্যবহার করে সফল হয়েছেন?
আশিকা উমঙ্গা উমগিলিয়া

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

এটি কাজ করার জন্য একটি মজাদার সমস্যা, কীভাবে উত্স কোড রেপো এটি করে তা ভেবে দেখুন, এসএনএন (তারা কমিটের মধ্যে পার্থক্য রাখে)।
অ্যালেক্স

উত্তর:


88

বেশিরভাগ উদাহরণ আমি এর জন্য কমান্ড-প্যাটার্নের বৈকল্পিক ব্যবহার করেছি । পূর্বাবস্থায় ফিরে আসার মতো প্রতিটি ব্যবহারকারীর ক্রিয়াকলাপটি কার্যকর করতে এবং এটিকে আবার রোল করতে সমস্ত তথ্যের সাথে নিজস্ব কমান্ড উদাহরণ পেয়ে যায়। তারপরে আপনি কার্যকর করা সমস্ত কমান্ডের একটি তালিকা বজায় রাখতে পারেন এবং আপনি সেগুলি একে একে পিছিয়ে রাখতে পারেন।


4
এনএসইউন্ডো ম্যানেজার, কোকোতে ফিরে আসা ইঞ্জিনটি মূলত এটি কাজ করে।
amrox

33

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

এই ধরণের সমস্যার জন্য, আমি মনে করি মডেলটির সাথে জড়িত প্রতিটি বস্তুর জন্য ডিফারেনশিয়াল চেকপয়েন্টগুলিকে সমর্থন করার জন্য আপনাকে আপনার ডেটা মডেলটির পক্ষে সমর্থন তৈরি করতে হবে । আমি এটি একবার করেছি এবং এটি খুব চতুর কাজ করেছে। মডেলটিতে পয়েন্টার বা রেফারেন্সের সরাসরি ব্যবহার এড়াতে আপনাকে সবচেয়ে বড় কাজটি করতে হবে।

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

পূর্বাবস্থায় ফেরানো / পুনরায় বাস্তবায়ন সহজ: আপনার ক্রিয়াটি করুন এবং একটি নতুন চেকপয়েন্ট স্থাপন করুন; পূর্ববর্তী চেকপয়েন্টে সমস্ত অবজেক্ট সংস্করণ রোলব্যাক করুন।

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


1
আপনি যদি নিজের ফাইল ফর্ম্যাট হিসাবে একটি ডাটাবেস (উদাহরণস্বরূপ স্ক্লাইট) ব্যবহার করেন তবে এটি প্রায় স্বয়ংক্রিয় হতে পারে
মার্টিন বেকেট

4
আপনি যদি মডেলটির পরিবর্তনের মাধ্যমে প্রবর্তিত নির্ভরতাগুলি ট্র্যাক করে এটি বাড়িয়ে তোলেন তবে আপনার সম্ভাব্যভাবে একটি পূর্বাবস্থায় ট্রি সিস্টেম থাকতে পারে (যেমন আমি যদি গার্ডারের প্রস্থ পরিবর্তন করি, তবে আলাদা আলাদা উপাদান নিয়ে কিছু কাজ করতে পারি, আমি ফিরে এসে পূর্বাবস্থায় ফিরে আসতে পারি) অন্যান্য জিনিস না হারিয়ে গার্ডার পরিবর্তন হয়)। এর জন্য ইউআইটি কিছুটা অপ্রয়োজনীয় হতে পারে তবে এটি একটি traditionalতিহ্যবাহী লিনিয়ার পূর্বাবস্থায় ফিরে যাওয়ার চেয়ে অনেক বেশি শক্তিশালী হবে।
সুমুডু ফার্নান্দো

আপনি কি এই আইডি এর বনাম পয়েন্টার ধারণা আরও ব্যাখ্যা করতে পারেন? অবশ্যই একটি পয়েন্টার / মেমরি ঠিকানা ঠিক আইডি পাশাপাশি কাজ করে?
পলম

@ পলম: মূলত আসল ডেটাগুলি (আইডি, সংস্করণ) দ্বারা সূচিযুক্ত হয়। পয়েন্টারগুলি কোনও অবজেক্টের একটি নির্দিষ্ট সংস্করণ উল্লেখ করে তবে আপনি কোনও অবজেক্টের বর্তমান অবস্থা উল্লেখ করতে চাইছেন, যা কিছু হোক না কেন, আপনি এটি আইডি দ্বারা সম্বোধন করতে চান, (আইডি, সংস্করণ) দ্বারা নয়। আপনি পারে পুনর্বিন্যাস এটা যাতে আপনি (সংস্করণ => তথ্য) টেবিল একটি পয়েন্টার সংরক্ষণ এবং শুধুমাত্র সাম্প্রতিক প্রতিটি সময় বাছাই, কিন্তু যে যখন আপনি ডেটা, muddies উদ্বেগ একটু অনিশ্চিত করছি ক্ষতি এলাকায় থাকে, এবং এটা কঠিন তোলে কিছু ধরণের সাধারণ জিজ্ঞাস্য করুন, সুতরাং এটি সাধারণত যেভাবে হয় তা এটি নয়।
ক্রিস মরগান 16

17

আপনি যদি GoF এর সাথে কথা বলছেন তবে মেমেন্টো প্যাটার্নটি বিশেষভাবে পূর্বাবস্থাকে সম্বোধন করে।


7
আসলেই নয়, এটি তাঁর প্রাথমিক পদ্ধতির দিকে নজর দেয়। তিনি বিকল্প পদ্ধতির জন্য জিজ্ঞাসা করছেন। প্রাথমিক প্রতিটি পদক্ষেপের জন্য পুরো রাজ্য সংরক্ষণ করছে যখন পরেরটি কেবল "ডিফস" সংরক্ষণ করে।
আন্দ্রে রিনিয়া

15

অন্যরা যেমন বলেছে, কমান্ড প্যাটার্নটি Undo / Redo বাস্তবায়নের একটি খুব শক্তিশালী পদ্ধতি। তবে কমান্ড প্যাটার্নটি উল্লেখ করার জন্য আমি এখানে গুরুত্বপূর্ণ সুবিধাটি বলতে চাই।

কমান্ড প্যাটার্নটি ব্যবহার করে Undo / redo প্রয়োগ করার সময়, আপনি ডেটাতে সঞ্চালিত ক্রিয়াকলাপগুলি (একটি ডিগ্রি পর্যন্ত) বিস্তৃত করে ডিফল্ট কোডের বৃহত পরিমাণে এড়াতে পারবেন এবং পূর্বাবস্থায় / পুনরায় সিস্টেমটিতে এই অপারেশনগুলি ব্যবহার করতে পারেন। উদাহরণস্বরূপ কোনও পাঠ্য সম্পাদকের মধ্যে কাটা এবং পেস্ট করুন পরিপূরক কমান্ড (ক্লিপবোর্ডের পরিচালনা বাদে)। অন্য কথায়, একটি কাটা জন্য পূর্বাবস্থায় ফেরা অপশন পেস্ট হয় এবং একটি পেস্ট জন্য পূর্বাবস্থায় অপারেশন কাটা হয়। এটি পাঠ্যকে টাইপ করা এবং মুছে ফেলার মতো সহজ ক্রিয়াকলাপগুলিতে প্রযোজ্য।

এখানে মূল কীটি হ'ল আপনি আপনার সম্পাদকের পূর্ববর্তী কমান্ড সিস্টেম হিসাবে আপনার পূর্ববর্তী / পুনরায় সিস্টেমটি ব্যবহার করতে পারেন। সিস্টেমটি যেমন "পূর্বাবস্থায় তৈরি করা অবজেক্ট তৈরি করুন, দস্তাবেজটি সংশোধন করুন" আপনি "পূর্বাবস্থায় অবজেক্ট তৈরি করতে পারবেন, নথিটি সংশোধন করতে পূর্বাবস্থায় পুনরায় অপারেশন চালান" as

এখন, স্বীকারোক্তি হিসাবে, অনেক লোক নিজেদেরকে ভাবছেন "ভাল ডু, কমান্ড প্যাটার্নের অংশ নয়?" হ্যাঁ, তবে আমি অনেকগুলি কমান্ড সিস্টেম দেখেছি যার দুটি কমান্ডের দুটি সেট রয়েছে, একটি তাত্ক্ষণিক ক্রিয়াকলাপের জন্য এবং অন্যটি পূর্বাবস্থায় ফেরানোর জন্য o আমি বলছি না যে এমন কমান্ড থাকবে না যা তাত্ক্ষণিক ক্রিয়াকলাপগুলির সাথে সুনির্দিষ্ট এবং পূর্বে / পূর্বাবস্থায় ফিরবে না, তবে সদৃশ হ্রাসকরণ কোডটি আরও রক্ষণাবেক্ষণযোগ্য করে তুলবে।


1
আমি কখনই ^ -1 pasteহিসাবে ভেবে দেখিনি cut
লেনার হোয়েট

8

আপনি তাদের পূর্বাবস্থায় ফিরিয়ে আনার জন্য পেইন্ট.নেট কোডটি উল্লেখ করতে চাইতে পারেন - তারা একটি দুর্দান্ত সুন্দর পূর্বাবস্থা সিস্টেম পেয়েছে। আপনার যা প্রয়োজন হবে তার চেয়ে এটি সম্ভবত খানিকটা সহজ, তবে এটি আপনাকে কিছু ধারণা এবং গাইডলাইন দেয় give

-Adam


4
প্রকৃতপক্ষে, পেইন্ট.এনইটি কোডটি আর উপলভ্য নয় তবে আপনি কাঁটাচামড়া কোড. google.com/p/paint-mono
ইগোর

7

এটি এমন একটি ক্ষেত্রে হতে পারে যেখানে সিএসএলএ প্রযোজ্য। এটি উইন্ডোজ ফর্ম অ্যাপ্লিকেশনগুলির অবজেক্টগুলিকে জটিল পূর্বাবস্থায় সহায়তা সরবরাহ করার জন্য ডিজাইন করা হয়েছিল।


6

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

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

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

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

অনেকগুলি পূর্ববর্তী সিস্টেম কেবল মেমরির মধ্যে থাকে তবে আপনি যদি ইচ্ছা করেন তবে আপনি পূর্বাবস্থার স্ট্যাকটি চালিয়ে যেতে পারেন, আমার ধারণা।


5

আমার চৌকস বিকাশের বইটিতে সবেমাত্র কমান্ডের প্যাটার্নটি পড়েছি - সম্ভবত এটির সম্ভাবনা রয়েছে?

আপনি প্রতিটি কমান্ড কমান্ড ইন্টারফেস (যার একটি এক্সিকিউট () পদ্ধতি আছে) প্রয়োগ করতে পারেন। আপনি যদি পূর্বাবস্থায় ফিরে চান তবে আপনি একটি পূর্বাবস্থায় ফেলা পদ্ধতি যুক্ত করতে পারেন।

আরও তথ্য এখানে


4

আপনার কমান্ড প্যাটার্নটি ব্যবহার করা উচিত এই বিষয়ে আমি মেন্ডেল্ট সিবেঙ্গার সাথে আছি । আপনি যে প্যাটার্নটি ব্যবহার করেছেন সেটি হ'ল মেমোন্টো প্যাটার্ন, যা সময়ের সাথে সাথে খুব অপচয় হয়ে যাবে।

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

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


3

কোডপ্লেক্স প্রকল্প :

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


2

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


আপনি কি dequest রাখা হবে?

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

2
আপনি যা বর্ণনা করেন তা হ'ল একটি নকশার ধরণ :)। এই পদ্ধতির সমস্যাটি যখন তখন হয় যখন আপনার রাজ্য প্রচুর স্মৃতি গ্রহণ করে - কয়েক ডজন রাষ্ট্রীয় সংস্করণ রাখলে তা অবাস্তব বা এমনকি অসম্ভব হয়ে যায়।
ইগোর ব্রেজক

অথবা আপনি বন্ধের জুড়ি সাধারণ এবং অপারেশন অপারেশনকে উপস্থাপন করে সঞ্চয় করতে পারেন।
আকাংকা

2

পূর্বে হ্যান্ডেল করার একটি চতুর উপায়, যা আপনার সফ্টওয়্যারটিকে একাধিক ব্যবহারকারীর সহযোগিতার জন্য উপযুক্ত করে তুলবে, ডেটা কাঠামোর অপারেশনাল রূপান্তর বাস্তবায়ন করছে formation

এই ধারণাটি খুব জনপ্রিয় নয় তবে ভাল সংজ্ঞায়িত এবং দরকারী। সংজ্ঞাটি যদি আপনার কাছে খুব বিমূর্ত লাগে, তবে JSON অবজেক্টের অপারেশনাল রূপান্তরটি জাভাস্ক্রিপ্টে কীভাবে সংজ্ঞায়িত ও প্রয়োগ করা হয়েছে তার একটি সফল উদাহরণ এই প্রকল্পটি is



1

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

আপনি কিছু বিজোড় পূর্বাবস্থায় ফেরত সিকোয়েন্সগুলি সম্পাদন করে (বস্তুগুলি নিরাপদে পূর্বাবস্থায় ফিরে আসা "শনাক্তকারীদের" হিসাবে আপডেট করা হয়নি) অবজেক্টগুলিতে পয়েন্টারগুলির (সি ++) কারণে অনেকগুলি বাগ হয়েছে those এই অঞ্চলে বাগগুলি প্রায়শই ... উম্মম ... আকর্ষণীয়।

কিছু অপারেশন গতি / সংস্থান ব্যবহারের জন্য বিশেষ ক্ষেত্রে হতে পারে - যেমন জিনিসকে আকার দেওয়া, জিনিসগুলিকে ঘোরানো।

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


আপনার মডেলের আকার বাড়ার সাথে সাথে এটি ক্রমবর্ধমান অকার্যকর শোনায়।
ওয়ারেন পি

কোন পথে? প্রতিটি পদার্থে নতুন "জিনিস" যুক্ত হওয়ায় এই পদ্ধতি পরিবর্তন ছাড়াই কাজ করে চলেছে। বস্তুগুলির ক্রমিক আকারটি আকারে বৃদ্ধি পাওয়ায় পারফরম্যান্স একটি সমস্যা হতে পারে - তবে এটি কোনও বড় সমস্যা হয়নি। সিস্টেমটি 20+ বছর ধরে অবিচ্ছিন্নভাবে বিকাশাধীন এবং ব্যবহারকারীর সংখ্যা দ্বারা ব্যবহৃত হয়।
আর্ডওয়ার্ক

1

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


1

আপনি পোস্টশার্পে পূর্বাবস্থায় ফিরুন / রিডো প্যাটার্নটি তৈরির চেষ্টা করতে পারেন। https://www.postsharp.net/model/undo-redo

এটি আপনাকে নিজে প্যাটার্নটি প্রয়োগ না করে আপনার অ্যাপ্লিকেশনটিতে পূর্বাবস্থায় ফিরিয়ে আনুন / পুনরায় কার্যকারিতা যুক্ত করতে দেয়। এটি আপনার মডেলের পরিবর্তনগুলি ট্র্যাক করতে রেকর্ডযোগ্য প্যাটার্ন ব্যবহার করে এবং এটি INotifyPropertyChanged প্যাটার্নের সাথে কাজ করে যা পোস্টশার্পেও প্রয়োগ করা হয়।

আপনাকে ইউআই নিয়ন্ত্রণ সরবরাহ করা হয়েছে এবং আপনি প্রতিটি অপারেশনের নাম এবং গ্রানুলারিটি কী হবে তা সিদ্ধান্ত নিতে পারেন।


0

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


0

ডিজাইন প্যাটার্নসের প্রথম বিভাগে (জিওএফ, 1994) ডিজাইনের ধরণ হিসাবে পূর্বাবস্থায় ফেরানো / পুনরায় বাস্তবায়নের জন্য ব্যবহারের কেস রয়েছে।


0

আপনি আপনার প্রাথমিক ধারণাটি পারফরম্যান্ট করতে পারেন।

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


0

আমি কমান্ড প্যাটার্নটি এখানে খুব দরকারী বলে খুঁজে পেয়েছি। বেশ কয়েকটি বিপরীত কমান্ড প্রয়োগ করার পরিবর্তে, আমি আমার API এর দ্বিতীয় উদাহরণে বিলম্বিত প্রয়োগের সাথে রোলব্যাক ব্যবহার করছি।

আপনি যদি কম প্রয়োগের প্রচেষ্টা এবং সহজ রক্ষণাবেক্ষণ (এবং ২ য় উদাহরণের জন্য অতিরিক্ত মেমরি বহন করতে পারেন) চান তবে এই পদ্ধতিটি যুক্তিসঙ্গত বলে মনে হচ্ছে।

উদাহরণের জন্য এখানে দেখুন: https://github.com/thilo20/Undo/


-1

আমি জানি না এটি আপনার কোনও উপকারে আসবে কিনা তবে আমার প্রকল্পগুলির মধ্যে যখন আমাকে অনুরূপ কিছু করতে হয়েছিল, আমি http://www.undomadeeasy.com থেকে UndoEngine ডাউনলোড করে শেষ করেছি - একটি দুর্দান্ত ইঞ্জিন বোনেটের আওতায় যা ছিল তা সম্পর্কে আমি খুব বেশি যত্ন নিই নি - এটি সবেমাত্র কাজ করে।


আপনি সমাধান সরবরাহ করতে আত্মবিশ্বাসী হলেই দয়া করে আপনার মন্তব্যগুলিকে উত্তর হিসাবে পোস্ট করুন! অন্যথায় প্রশ্নের অধীনে মন্তব্য হিসাবে এটি পোস্ট করতে পছন্দ! (যদি এখন এটি না করার অনুমতি দেয়! দয়া করে ভাল সুনাম না পাওয়া পর্যন্ত অপেক্ষা করুন)
ইনফ্যান্টপ্রো'আরবিন্দ

-1

আমার মতে, ইউএনডিও / রেডো বিস্তৃতভাবে 2 উপায়ে প্রয়োগ করা যেতে পারে। 1. কমান্ড স্তর (কমান্ড স্তর পূর্বাবস্থায় / পুনরায় বলা) 2. ডকুমেন্ট স্তর (বিশ্বব্যাপী পূর্বাবস্থায় / পুনরায় বলা হয়)

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

সীমাবদ্ধতা: কমান্ডের ব্যাপ্তিটি শেষ হয়ে গেলে, পূর্বাবস্থায় ফেরানো অসম্ভব, যা নথির স্তরের দিকে নিয়ে যায় (বিশ্বব্যাপী) পূর্বাবস্থায় / পুনরায় করা

আমার ধারণা আপনার কেসটি বিশ্বব্যাপী পূর্বাবস্থায় ফিরিয়ে আনতে পারে - কারণ এটি এমন মডেলের পক্ষে উপযুক্ত যা এতে প্রচুর স্মৃতি স্থান জড়িত। এছাড়াও, এটি নির্বাচনীভাবে পূর্বাবস্থায় ফেরানো / আবারও করতে উপযুক্ত। দুটি আদিম ধরণের রয়েছে

  1. সমস্ত স্মৃতি পূর্বাবস্থায় ফেরানো / আবার করা
  2. বস্তুর স্তর পূর্বাবস্থায় ফেরান

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

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

1 এবং 2 উভয়ের ক্ষেত্রেই 1. যেমন 1. আগে ইউন্ডো () 2. আফটার ইউন্ডো () 3 এর আগে রেডো () 4. আফটার রেডো () থাকতে পারে। এই পদ্ধতিগুলিকে বেসিক Undo / redo কমান্ডে প্রকাশ করতে হবে (প্রাসঙ্গিক কমান্ড নয়) যাতে সমস্ত বস্তু সুনির্দিষ্ট ক্রিয়া পেতে এই পদ্ধতিগুলি প্রয়োগ করে।

1 এবং 2 এর একটি সংকর তৈরি করা একটি ভাল কৌশল হ'ল সৌন্দর্য হ'ল এই পদ্ধতিগুলি (1 এবং 2) নিজেরাই কমান্ডের নিদর্শনগুলি ব্যবহার করে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.