مكتبة الفصل مع دعم للعديد من استراتيجيات الثبات

StackOverflow https://stackoverflow.com/questions/113818

سؤال

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

أعرف نمط كائن الوصول إلى البيانات الذي يبدو أنه يعمل مع Java، لكنني لست متأكدًا تمامًا من كيفية تطبيقه على C++.هل هناك حلول أخرى؟

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

المحلول

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

وبدلاً من ذلك، يمكنك القيام بشيء مماثل ولكن استخدام البيانات التعريفية لتشغيل منشئ التعليمات البرمجية الذي يملأ "Getters" و"Setters" لطبقة الثبات.

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

أعتقد أنه بمجرد توفير الوصول إلى البيانات التعريفية للفصل وعمليات الاسترجاعات، تصبح آلية الاستمرارية واضحة نسبيًا.انظر إلى مكونات البيانات التعريفية لأي إطار عمل مناسب لرسم الخرائط O/R لـ C++ وافهم كيفية عملها.قم بتغليف هذا باستخدام واجهة برمجة التطبيقات (API) في إحدى الفئات الأساسية لفئات المجال الخاص بك وقم بتوفير واجهة برمجة تطبيقات getter/setter العامة لإنشاء مثيل أو الاستمرار.الباقي متروك للشخص الذي ينفذ طبقة الثبات.

يحرر: لا أستطيع التفكير في مكتبة C++ بنوع آلية الثبات القابلة للتوصيل التي تصفها، لكنني فعلت شيئًا في Python كان من الممكن إضافة هذا النوع من المرافق إليه.استخدم التنفيذ المعين مرافق في لغة Python ليس لها مكافئ مباشر لـ C++، على الرغم من إمكانية تكييف المبدأ الأساسي للعمل مع C++.

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

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

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

نصائح أخرى

تعزيز التسلسل يوفر بعض الأشياء المفيدة جدًا للعمل مع تسلسل أنواع C++، ولكن لا أعرف مدى ملاءمتها للواجهة التي تريدها.وهو يدعم كلاً من التصميمات المتطفلة وغير المتطفلة، لذا فهو مرن جدًا.

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

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

يتم تلخيص قراءة الملف وكتابته من تعيين البيانات إلى الكائنات، ويمكننا الآن تبديل تنسيقات الملفات وإضافة المستوردين/المصدرين دون تعديل على كائنات أعمالنا الأساسية.

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

بالإضافة إلى ذلك، فإن استخدام تنسيق بيانات قياسي، مع بعض المفاتيح الخاصة، يعني أنه من الأسهل كثيرًا العمل مع أطراف ثالثة.

قد ترغب في إلقاء نظرة على تعزيز التسلسل.نظرًا لعدم استخدامه، لا أستطيع أن أقول ما إذا كنت أوصي به أم لا.عادةً ما تكون مكتبات Boost ذات جودة عالية.

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