سؤال

في التطبيق الذي أقيم فيه، أتواجه وضعا؛ أريد أن أعرف ما إذا كان هناك نمط تصميم لهذا. انها كما يلي

  1. يتم تقديم المستخدم على واجهة ويب مع خوارزميات مختلفة لعملية
  2. يتم تخزين اختيار المستخدم في قاعدة البيانات.
  3. الآن، يجب على التطبيق إجراء الحسابات بشكل مختلف اعتمادا على الخوارزمية المحددة.

ما هي استراتيجية جيدة لتنفيذ هذا؟ الآن ما نفعله هو -

  1. لديك جدول DB مرجع يحتوي على جميع أنواع الخوارزمية والأسماء الفئة المقابلة في التعليمات البرمجية (على سبيل المثال. إذا كانت الخوارزمية السريعة ثم نقوم بتخزين QuickSort). يجب أن يتم تحديث هذا يدويا في كل مرة يأتي allgo جديد
  2. في التعليمات البرمجية، احصل على نوع الخوارزمية واستخدام الانعكاس لإرساء نوع الخوارزمية المناسبة. في C # نستخدم الكود مماثل أدناه

    System.Reflection.Assembly أنواع = system.reflection.assembly.loadfile (system.reflection.assembly.getexecutingassembly (). Location.tostring ())؛
    foreach (النوع T في أنواع) إذا كان (t.name == classname) createinstanceOf (t) // classnames هو قائمة بجميع أنواع الفئة التي يتم تحميلها من جدول المرجع في DB.

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

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

المحلول

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

إنشاء واجهة ImySortingalgoritms كما،

public interface IMySortingAlgorithms
    {
        string Name { get; }
        string[] Sort(string[] input);
    }

الآن، اكتب مصنع يستخدم انعكاس للحصول على خوارزمية الفرز.

public static class MyAlgoFactory
{
    private static Dictionary<string, IMySortingAlgorithms> m_dict;

    /// <summary>
    /// For all the assmeblies in the current application domain,
    /// Get me the object of all the Types that implement IMySortingAlgorithms
    /// </summary>
    static MyAlgoFactory()
    {
        var type = typeof(IMySortingAlgorithms);
        m_dict = AppDomain.CurrentDomain.GetAssemblies().
            SelectMany(s => s.GetTypes()).
            Where(p => {return type.IsAssignableFrom(p) && p != type;}).
            Select(t=> Activator.CreateInstance(t) as IMySortingAlgorithms).
            ToDictionary(i=> i.Name);
    }

    public static IMySortingAlgorithms GetSortingAlgo(string name)
    {
        return m_dict[name];
    }
}

جميع خوارزميات الفرز الخاصة بك يمكن الآن تنفيذ هذه الواجهة.

 public class MySortingAlgo1 : IMySortingAlgorithms
    {
        #region IMySortingAlgorithms Members

        public string Name
        {
            get { return "MySortingAlgo1"; }
        }

        public string[] Sort(string[] input)
        {
            throw new NotImplementedException();
        }

        #endregion
    }

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

فيما يلي إصدار غير لينك من MyalgoFactory

    /// <summary>
    /// For all the assmeblies in the current application domain,
    /// Get me the object of all the Types that implement IMySortingAlgorithms
    /// </summary>
   static MyAlgoFactory()
        {
            m_dict = new Dictionary<string, IMySortingAlgorithms>();
            var type = typeof(IMySortingAlgorithms);
            foreach (Assembly asm in AppDomain.CurrentDomain.GetAssemblies())
            {
                foreach (Type p in asm.GetTypes())
                {
                    if (type.IsAssignableFrom(p) && p != type)
                    {
                        IMySortingAlgorithms algo = Activator.CreateInstance(p)
                              as IMySortingAlgorithms;
                        m_dict[algo.Name] = algo;
                    }
                }
            }
        }

نصائح أخرى

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

استخدم تصميم المصنع وتصميم الاستراتيجية على النحو التالي

public interface ISorter {
   // Prototype for your sort function goes here
}

public class QuickSorter implements ISorter {}

public class SorterFactory {
   public ISorter getSorter( string sortType ) {
      // Return the correct type of sorting algorithm
      if ( sortType.equals( "QuickSort" ) ) {
         return new QuickSorter();
      }
   }
}

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

ملاحظة إلى وزارة الدفاع: لا تحرير رمز Java إذا كنت لا تعرف بناء الجملة الصحيح، إلا إذا كنت تعتقد أن هذا كان C #، في كلتا الحالتين على ما يرام مني.

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