سؤال

أنا أكتب النمذجة الهيكلية أداة المدني enginering التطبيق.لدي واحدة ضخمة نموذج الطبقة تمثل المبنى بأكمله ، والتي تشمل مجموعات من العقد ، خط العناصر ، الأحمال ، إلخ.والتي هي أيضا فئات مخصصة.

لقد سبق مشفرة التراجع المحرك مما يوفر عميق نسخ بعد كل تعديل على نموذج.الآن بدأت أفكر إذا أنا يمكن أن يكون مشفرة بشكل مختلف.بدلا من حفظ العميقة نسخ, ربما يمكن حفظ قائمة من كل معدل العمل مع المقابلة عكس التعديل.بحيث لا يمكن أن تنطبق على عكس المعدلات إلى النموذج الحالي إلى التراجع ، أو معدلات الإعادة.

يمكنني تخيل كيف سيكون تنفيذ أوامر بسيطة أن تغير خصائص الكائن ، إلخ.ولكن ماذا عن مجمع الأوامر ؟ مثل إدراج عقدة جديدة الكائنات إلى نموذج وإضافة بعض الأشياء التي تبقى إشارات إلى عقد جديد.

كيف دفعة واحدة حول تنفيذ ذلك ؟

هل كانت مفيدة؟

المحلول

معظم الأمثلة التي رأيتها استخدام البديل من القيادة-نمط من أجل هذا.كل مستخدم-العمل الذي من المستحيل القيام يحصل الأوامر الخاصة به سبيل المثال مع جميع المعلومات اللازمة لتنفيذ عمل لفة مرة أخرى.ثم يمكنك الحفاظ على قائمة بجميع الأوامر التي تم تنفيذها و يمكنك لفة لهم مرة أخرى واحدا تلو الآخر.

نصائح أخرى

أعتقد أن كل من تذكار و الأمر غير عملي عند التعامل مع نموذج من حجم ونطاق أن OP يعني.العمل, ولكن سيكون هناك الكثير من العمل للحفاظ على وتوسيع.

لهذا النوع من المشكلة ، أعتقد أنك بحاجة إلى بناء في دعم البيانات الخاصة بك نموذج لدعم التفاضلية نقاط التفتيش كل كائن المشاركة في نموذج.لقد فعلت هذا مرة و عملت بقعة جدا.أهم شيء عليك القيام به هو تجنب الاستخدام المباشر من المؤشرات أو مراجع في النموذج.

كل مرجع إلى كائن آخر يستخدم بعض المعرف (مثل عدد صحيح).كلما كان الكائن هو مطلوب, يمكنك البحث الحالي تعريف كائن من الجدول.يحتوي الجدول على قائمة مرتبطة لكل كائن الذي يحتوي على جميع الإصدارات السابقة ، جنبا إلى جنب مع معلومات حول أي نقطة التفتيش التي كانت نشطة.

تنفيذ التراجع/إعادة بسيط:هل العمل الخاص بك و إنشاء نقطة التفتيش ؛ تراجع كل كائن الإصدارات السابقة من نقطة التفتيش.

فإنه يأخذ بعض الانضباط في المدونة, ولكن له العديد من المزايا:أنت لا تحتاج إلى عميق نسخة منذ كنت تفعل التفاضلية تخزين نموذج الدولة ؛ يمكنك نطاق مقدار الذاكرة التي تريد استخدامها (جدا المهم أشياء مثل نماذج CAD) إما عن طريق عدد من redos أو الذاكرة المستخدمة ؛ قابلة للغاية ومنخفضة الصيانة الوظائف التي تعمل على نموذج لأنها لا تحتاج إلى القيام بأي شيء من أجل تنفيذ التراجع/إعادة.

إذا كنت تتحدث جلوبل القناص ، تذكار نمط تتناول على وجه التحديد التراجع.

كما أن آخرين قد ورد الأمر نمط قوية جدا طريقة تنفيذ التراجع/إعادة.ولكن هناك ميزة هامة أود أن أشير إلى أمر النمط.

عند تنفيذ التراجع/إعادة استخدام نمط القيادة ، يمكنك تجنب كميات كبيرة من تكرار كود عن طريق التلخيص (إلى حد ما) العمليات التي تجرى على البيانات والاستفادة من تلك العمليات في التراجع/إعادة النظام.على سبيل المثال في محرر نص قص ولصق متكاملان الأوامر (جانبا من إدارة الحافظة).وبعبارة أخرى ، فإن التراجع عن عملية قص لصق و التراجع عن عملية لصق قطع.وهذا ينطبق على الكثير من أبسط عمليات الكتابة وحذف النص.

المفتاح هنا هو أنه يمكنك استخدام الخاص بك التراجع/إعادة النظام الأساسي نظام القيادة على المحرر الخاص بك.بدلا من كتابة النظام مثل "إنشاء التراجع عن كائن تعديل الوثيقة" يمكنك "إنشاء التراجع عن كائن تنفيذ إعادة العملية على التراجع عن كائن إلى تعديل الوثيقة".

الآن, ومن المسلم به كثير من الناس يفكرون بأنفسهم "حسنا دوه, اليس من وجهة الأوامر النمط؟" نعم, لقد رأيت الكثير من الأوامر الأنظمة التي تحتوي على مجموعتين من أوامر واحد الفوري لعمليات مجموعة أخرى على تراجع/الإعادة.أنا لا أقول أنه لن يكون هناك أوامر خاصة الفوري لعمليات تراجع/الإعادة ، ولكن الحد من الازدواجية سوف تجعل رمز أكثر للصيانة.

قد ترغب في الرجوع إلى Paint.NET رمز عن التراجع لديهم لطيفة حقا نظام التراجع.انها على الارجح أبسط قليلا من ما عليك ، ولكن قد تعطيك بعض الأفكار والمبادئ التوجيهية.

-آدم

قد تكون هذه القضية حيث CSLA هو الواجب التطبيق.وقد تم تصميمها لتوفير مجمع التراجع عن دعم الكائنات في نماذج Windows التطبيقات.

لقد نفذ مجمع التراجع عن نظم بنجاح باستخدام تذكار نمط سهلة جدا و منها بطبيعة الحال توفير إعادة الإطار أيضا.أكثر دهاء صالح هو أن مجموع الإجراءات التي يمكن الواردة في واحد التراجع أيضا.

باختصار, لديك اثنين من أكوام من تذكار الكائنات.واحد التراجع إلى الإعادة.كل عملية يخلق جديد تذكار ، من الناحية المثالية التي سوف يكون بعض من يدعو إلى تغيير الدولة من النموذج الخاص بك ، الوثيقة (أو أيا كان).هذا إضافة إلى التراجع المكدس.عندما تفعل عملية التراجع ، بالإضافة إلى تنفيذ العمل التراجع على تذكار كائن إلى تغيير النموذج مرة أخرى ، يمكنك أيضا البوب الكائن قبالة التراجع عن كومة ودفعها على إعادة المكدس.

كيف طريقة تغيير الدولة من المستند يتم تنفيذه يعتمد تماما على التنفيذ.إذا كنت يمكن أن تجعل مجرد استدعاء واجهة برمجة التطبيقات (على سبيل المثالChangeColour(r,g,b)) ، ثم تسبقه مع استعلام للحصول على حفظ المقابلة الدولة.ولكن نمط أيضا دعم صنع العميق نسخ الذاكرة لقطات, درجة الحرارة إنشاء ملف وما إلى ذلك - الأمر كله متروك لك كما هو ببساطة الظاهري طريقة التنفيذ.

القيام به مجموع الإجراءات (مثلالمستخدم التحول يختار حمولة من الكائنات إلى القيام بعملية على مثل حذف, إعادة تسمية, تغيير السمة) ، رمز يخلق الجديدة التراجع عن كومة واحدة تذكار, ويمر أن التشغيل الفعلي لإضافة الفردية العمليات.لذلك عمل طرق لا تحتاج إلى (أ) عالمية كومة للقلق و (ب) يمكن أن تكون مشفرة نفسه ما إذا كان يتم تنفيذها في عزلة أو كجزء من تجميع واحد العملية.

العديد من التراجع نظم في الذاكرة فقط ، ولكن هل يمكن أن يستمر التراجع كومة إذا كنت ترغب في ذلك ، أعتقد.

فقط كنت أقرأ عن نمط القيادة في تطوير رشيقة الكتاب - ربما أن لديه الإمكانات ؟

هل يمكن أن يكون كل أمر تنفيذ الأوامر واجهة (الذي يحتوي على تنفيذ (طريقة)).إذا كنت تريد التراجع ، يمكنك إضافة التراجع الأسلوب.

مزيد من المعلومات هنا

أنا مع Mendelt Siebenga على حقيقة أنه يجب استخدام الأمر النمط.نمط استخدمته كان تذكار نمط الذي سوف تصبح الإسراف جدا مع مرور الوقت.

منذ كنت تعمل على الذاكرة المكثفة التطبيق ، يجب أن تكون قادرا على تحديد أي مقدار الذاكرة التراجع المحرك يسمح وكيف العديد من مستويات التراجع عن حفظ أو تخزين بعض التي سوف تكون موجودة.يجب أن لا تفعل هذا ، سوف تواجه قريبا الأخطاء الناتجة من الجهاز يجري من الذاكرة.

أنصح لك التحقق من ما إذا كان هناك إطار إنشاؤها بالفعل نموذجا مكتب الإنمائي في لغة البرمجة / إطار من اختيارك.فمن الجميل أن يخترع أشياء جديدة ، ولكن من الأفضل أن تأخذ شيئا كتبت بالفعل ، تصحيحه اختبار في سيناريوهات حقيقية.سيكون من المفيد إذا قمت بإضافة ما كنت تكتب هذا في الناس حتى يمكن أن يوصي الأطر يعلمون.

Codeplex المشروع:

هو إطار بسيط لإضافة وظائف تراجع/الإعادة إلى التطبيقات الخاصة بك على أساس الكلاسيكية الأوامر تصميم نمط.وهو يدعم دمج إجراءات المعاملات المتداخلة ، وتأخر التنفيذ (التنفيذ على أعلى مستوى المعاملات لارتكاب) و ممكن غير الخطية تراجع التاريخ (حيث يمكنك الاختيار من بين عدة إجراءات الإعادة).

معظم الأمثلة قرأت تفعل ذلك إما باستخدام الأوامر أو تذكار نمط.ولكن يمكنك أن تفعل ذلك دون أنماط التصميم جدا بسيط deque-هيكل.

طريقة ذكية للتعامل مع التراجع ، والتي من شأنها أن تجعل البرنامج أيضا مناسبة المستخدم متعدد التعاون هو تنفيذ التحول التشغيلي من بنية البيانات.

هذا المفهوم ليست شعبية جدا ولكن واضحة المعالم و مفيدة.إذا كان تعريف تبدو مجردة جدا لك ، هذا المشروع مثال ناجح على كيفية التحول التشغيلي عن كائنات JSON هو وتنفيذه في جافا سكريبت

للإشارة هنا بسيط تنفيذ الأوامر نمط تراجع/الإعادة في C#: بسيطة التراجع/إعادة نظام C#.

نحن استخدامها في تحميل الملف و حفظ التسلسل رمز "الكائنات" على شكل مناسب لحفظ واستعادة الدولة بأكملها من كائن.ونحن دفع تلك تسلسل الكائنات على التراجع عن كومة – جنبا إلى جنب مع بعض المعلومات حول ما هي العملية التي أجريت وتلميحات على التراجع-ing أن العملية إذا لم يكن هناك ما يكفي من معلومات استقاها من تسلسل البيانات.التراجع الإعادة في كثير من الأحيان مجرد استبدال كائن واحد مع آخر (من الناحية النظرية).

كانت هناك العديد من العديد من الأخطاء بسبب مؤشرات (C++) إلى الكائنات التي لم تكن ثابتة-كما كنت أداء بعض الغريب التراجع عن إعادة تسلسل (تلك الأماكن لا يتم تحديث أكثر أمانا التراجع عن علم "معرفات").الخلل في هذا المجال في كثير من الأحيان ...يممم...مثيرة للاهتمام.

بعض العمليات يمكن أن تكون حالات خاصة للسرعة/استخدام الموارد مثل التحجيم الأشياء تتحرك الأشياء من حولك.

متعددة اختيار توفر بعض المضاعفات أيضا.أية لدينا بالفعل مجموعة المفهوم في القانون.كريستوفر جونسون تعليق حول البنود الفرعية جميلة قريبة من ما نقوم به.

كان علي أن أفعل هذا عند كتابة حلالا شماعة-القفز لعبة اللغز.أنا جعلت كل تحرك كائن الأوامر التي عقدت ما يكفي من المعلومات التي يمكن أن تكون إما القيام به أو التراجع عنه.في حالتي كانت بسيطة تخزين الانطلاق و اتجاه كل خطوة.ثم يتم تخزين كل هذه الأشياء في كومة وبالتالي فإن البرنامج يمكن بسهولة التراجع عن العديد من التحركات كما انها بحاجة الى حين التراجع.

يمكنك محاولة الجاهزة تنفيذ التراجع/إعادة نمط في PostSharp. https://www.postsharp.net/model/undo-redo

فإنه يتيح لك إضافة وظائف تراجع/الإعادة إلى التطبيق الخاص بك دون تنفيذ نمط نفسك.فإنه يستخدم للتسجيل نمط لتعقب التغييرات في النموذج الخاص بك ويعمل مع INotifyPropertyChanged النمط الذي يتم تنفيذه في PostSharp.

يتم توفير لكم مع الضوابط واجهة المستخدم و يمكنك أن تقرر ما اسم تحبب من كل العملية.

أنا مرة عملت على تطبيق جميع التغييرات التي قام بها الأمر إلى تطبيق نموذج (أيCDocument...كنا باستخدام MFC) كانت قائمة في نهاية الأمر عن طريق تحديث الحقول في قاعدة بيانات داخلية المحافظة ضمن نموذج.لذلك نحن لم يكن لديك لكتابة منفصلة التراجع/إعادة رمز لكل عمل.التراجع كومة ببساطة تذكرت المفاتيح الأساسية, أسماء الحقول القديمة القيم كل وقت قياسي تم تغيير (في نهاية كل أمر).

القسم الأول من أنماط التصميم (GoF, 1994) لديه حالة استخدام لتنفيذ التراجع/إعادة تصميم نمط.

يمكنك أن تجعل الخاصة بك فكرة أولية performant.

استخدام استمرار هياكل البيانات, و العصا مع الحفاظ على قائمة المراجع القديمة في جميع أنحاء الدولة.(ولكن هذا فقط يعمل حقا إذا كانت جميع البيانات في جهاز الدولة من الدرجة غير قابلة للتغيير ، جميع العمليات على العودة نسخة جديدة---ولكن النسخة الجديدة لا تحتاج إلى أن تكون نسخة عميق ، مجرد استبدال الأجزاء المتغيرة 'النسخ عند الكتابة'.)

لقد وجدت الأمر نمط أن تكون مفيدة جدا هنا.بدلا من تنفيذ العديد من عكس الأوامر, أنا باستخدام التراجع مع تأجيل التنفيذ على الدرجة الثانية من API.

هذا النهج يبدو من المعقول إذا كنت تريد تنفيذ منخفض الجهد و سهلة الصيانة (و يمكن أن تحمل ذاكرة إضافية عن 2nd سبيل المثال).

انظر هنا على سبيل المثال:https://github.com/thilo20/Undo/

أنا لا أعرف إذا كان هذا هو الذهاب إلى أن يكون من أي استخدام لكم ، ولكن عندما كان علي أن أفعل شيئا من هذا القبيل على واحدة من بلدي المشاريع ، انتهى تحميل UndoEngine من http://www.undomadeeasy.com - رائع المحرك و أنا حقا لا أهتم كثيرا عن ما هو تحت غطاء محرك السيارة - انها عملت فقط.

في رأيي تراجع/الإعادة يمكن تنفيذها في 2 طرق على نطاق واسع.1.مستوى القيادة (وتسمى الأوامر مستوى التراجع/إعادة) 2.الوثيقة مستوى (يسمى العالمية التراجع/إعادة)

مستوى القيادة:كما العديد من الإجابات نشير إلى أن هذا هو تحقيق كفاءة استخدام تذكار نمط.إذا كان الأمر كما يدعم journalizing العمل ، إعادة بسهولة معتمدة.

القيد:مرة واحدة نطاق الأمر ، تراجع/الإعادة من المستحيل ، مما يؤدي إلى مستوى الوثيقة(العالمية) تراجع/الإعادة

أعتقد أن حالتك سوف تناسب العالمية تراجع/الإعادة لأنه هو مناسبة النموذج الذي ينطوي على الكثير من مساحة الذاكرة.أيضا, هذه هي مناسبة بشكل انتقائي تراجع/الإعادة أيضا.هناك نوعان من أنواع بدائية

  1. جميع الذاكرة تراجع/الإعادة
  2. وجوه مستوى التراجع والإعادة

في "ذكرى التراجع/إعادة" كامل الذاكرة يتم التعامل مع بيانات متصلة (مثل شجرة ، أو قائمة أو رسم بياني) و الذاكرة تدار من قبل التطبيق بدلا من نظام التشغيل.لذا جديدة وحذف مشغلي إذا كان في C++ هي مثقلة أن تحتوي على أكثر الهياكل المحددة لتنفيذ عمليات مثل.إذا كان أي عقدة تعديل ب.عقد وتطهير البيانات وما إلى ذلك ، طريقة عمله هي الأساس لنسخ كامل الذاكرة(على افتراض أن تخصيص الذاكرة بالفعل الأمثل وتدار من قبل التطبيق باستخدام خوارزميات متقدمة) و تخزينها في المكدس.إذا كان نسخة من الذاكرة طلب هيكل الشجرة هو نسخها على أساس الحاجة إلى سطحي أو عميق نسخ.نسخة عميق مصنوع فقط من أجل أن المتغير الذي يتم تعديلها.لأن كل متغير ويتم تخصيص العرف تخصيص التطبيق لديه القول الفصل عند حذفها عند الحاجة.تصبح الأمور مثيرة جدا للاهتمام إذا كان لدينا لتقسيم تراجع/الإعادة عندما يحدث ذلك نحن بحاجة إلى برمجيا-انتقائي التراجع/إعادة مجموعة من العملية.في هذه الحالة فقط تلك المتغيرات الجديدة ، أو حذف المتغيرات أو تعديل المتغيرات يتم إعطاء العلم بحيث تراجع/الإعادة فقط يبطل/redoes تلك الذاكرة تصبح الأمور أكثر إثارة للاهتمام إذا نحن بحاجة إلى القيام الجزئي التراجع/إعادة داخل كائن.عند هذه هي الحالة, فكرة جديدة من "زائر نمط" يستخدم.ويسمى "الكائن على مستوى تراجع/الإعادة"

  1. وجوه مستوى تراجع/الإعادة:عندما الإخطار إلى التراجع/إعادة يسمى كل كائن تنفذ تدفق العملية حيث أن غاسل يحصل من وجوه البيانات القديمة/الجديدة البيانات المبرمجة.البيانات التي لا تكون منزعجة تبقى دون عائق.كل كائن يحصل على غاسل حجة و داخل التراجع/إعادة الاتصال تيارات/unstreams بيانات الكائن.

كل من 1 و 2 يمكن أن يكون أساليب مثل 1.BeforeUndo() 2.AfterUndo() 3.BeforeRedo() 4.AfterRedo().هذه الأساليب في نشر الأساسية التراجع/إعادة الأمر ( لا السياقية الأمر) حتى يتسنى لجميع الكائنات تنفيذ هذه الأساليب أيضا إلى الحصول على عمل محددة.

استراتيجية جيدة هو خلق مزيج من 1 و 2.الجمال هو أن هذه الأساليب(1&2) أنفسهم استخدام أنماط القيادة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top