التعداد مقابل جدول البحث مقابل التعداد انعكاس مقابل نمط الدولة

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

سؤال

والبرنامج سوف يكون بناء ستشمل "تطبيق" التبديل بين الوضع مختلف كثيرا. بعض المهام يمكن القيام به يعتمد على وضع أحد التطبيقات في. كنت أفكر في استخدام التعداد كما وضع

public class Application
{
  public int Id {get;set;}
  public Status {get;set;}
}
public enum Status
{
  [Description("New")]New = 1, [Description("Closed")]Closed = 2
}

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

table status (id int pk, desc string, sort_order int)
table application (id int pk, status_id int fk)

في حالتي أنا بحاجة إلى أن تفعل أشياء مثل

if (application.Status == Status.New)
{ //do something }
else if (application.Status == Status.Closed)
{ //do other things }

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

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

ما رأيك؟ ويرجع الفضل في ذلك مسبقا!

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

المحلول

وكنت إنشاء فئة الحالة التي تحتوي على الخلافات، واستدعاء هؤلاء. لذلك (في بايثون):

class StatusZero(object):
    def call_me(self, app):
       print 'Hello, from ' + app.name
       return db.prepare_specific_status_zero_request()


class StatusOne(object):
    def call_me(self, app):
        print 'Hi, from ' + app.name
        return db.prepare_specific_status_one_request()

states = { 'status_zero' : StatusZero(), 'status_one' : StatusOne() }

class Application(object):
    name = 'My App'
    status = states['status_zero']

    def change_state(self, state):
        status = state

    def call_me(self):
        state_key = self.status.call_me(self)
        self.change_state(states[state_key])

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

نصائح أخرى

ويجب عدم رش التعليمات البرمجية الخاصة بك مع هذا الاختيار في كل مكان

if (application.Status == Status.New)
{ //do something }
else if (application.Status == Status.Closed)
{ //do other things }

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

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

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

public AbstractApplication convert_db_application_to_object(obj db_application)
{
   AbstractApplication app;
   if (db_application.Status == (int)Status.New)
      app = application_factory.create(application_state_new);
   else if(db_application.Status == (int)Status.Closed)
      app = application_factory.create(application_state_closed);

   return app;
}

وأنا لا نرى في ذلك حلا رائعا وأنا لا تزال بحاجة إما جدول التعداد أو بحث لإنقاذ حالة الطلب في قاعدة البيانات

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