سؤال

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

public static class Extensions
{
    public static string GetPreferenceFormattedText(this string text, ApplicationPreferences applicationPreferences, bool pluralize)
    {
        if (applicationPreferences.FieldNamingConvention.Equals(FieldNamingConvention.SameAsDatabase))
            return text;
        string formattedText = text.Replace('_', ' ');
        formattedText = formattedText.MakeTitleCase();
        formattedText = formattedText.Replace(" ", "");

        if (applicationPreferences.FieldNamingConvention.Equals(FieldNamingConvention.Prefixed))
            return applicationPreferences.Prefix + formattedText;

        return applicationPreferences.FieldNamingConvention.Equals(FieldNamingConvention.CamelCase)
                   ? formattedText.MakeFirstCharLowerCase()
                   : formattedText;
    }
}

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

شكرًا لك.

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

المحلول

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

باستخدام فئة المصنع ، يمكنك الحصول على textorformatter ، يعتمد مثيل Formatter الذي تم إرجاعه على التفضيلات.

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

تحديد واجهة وبعض التنسيقات

  public interface IIdentifierFormatter
  {
    string FormatText(string text);
  }

  public class UnformattedIdenifierFormatter : IIdentifierFormatter
  {
    public string FormatText(string text)
    {
      return text;
    }
  }

  public class CamelCaseIdenifierFormatter : IIdentifierFormatter
  {
    public string FormatText(string text)
    {
      // Camel case formatting here
      return text;
    }
  }

  public class ProperCaseIdenifierFormatter : IIdentifierFormatter
  {
    public string FormatText(string text)
    {
      // Proper case formatting here
      return text;
    }
  }

الآن فئة تفضيلات العينة

  enum NamingConvention 
  {
    Unformatted,
    CamelCase,
    ProperCase
  }

  public class Preferences
  {
    public NamingConvention FieldNamingConvention { get; set; }
    // .. Other settings


    // Function to get the formatter depending on the FieldNamingConvention
    public IIdentifierFormatter GetFieldNameFormatter()
    {
      switch (FieldNamingConvention)
      {
        case NamingConvention.Unformatted:
          return new ProperCaseIdenifierFormatter();
        case NamingConvention.CamelCase:
          return new ProperCaseIdenifierFormatter();
        case NamingConvention.ProperCase:
          return new ProperCaseIdenifierFormatter();          
        default:
          throw new Exception("Invalid or unsupported field naming convention.");
      }      
    }
  }

باستخدام الكود

// Preferences loaded from some source,
// for the example I just initialized it here.      
  Preferences pref = new Preferences();
  pref.FieldNamingConvention = NamingConvention.CamelCase;

  // Get the formatter
  IIdentifierFormatter formatter = pref.GetFieldNameFormatter();

  string formatted = formatter.FormatText("the_name_to_format");
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top