你如何处理用户偏好?

Mik*_*ike 7 c# user-preferences

与大多数软件一样,用户可以指定他们如何处理某些事情.在我的例子中,用户可以指定他们喜欢哪种格式.有3个选项,保留未格式化,驼峰式或适当的情况.我目前有它的工作,但它感觉非常笨重和重复.这是班上的一把小说.

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

该方法本身并不十分笨重.这就是被调用的方式.每次我想获取格式化文本时,总是必须传递用户首选项似乎不是最好的方法.我是否会更好地制作常规类并通过构造函数传递应用程序首选项对象?

谢谢.

Chr*_*lor 6

一种选择是创建某种工厂类,然后可以使用包含首选项的类的实例来实例化工厂类.

使用工厂类可以获得TextFormatter,返回的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;
    }
  }
Run Code Online (Sandbox Code Playgroud)

现在是一个示例首选项类

  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.");
      }      
    }
  }
Run Code Online (Sandbox Code Playgroud)

使用代码

// 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");
Run Code Online (Sandbox Code Playgroud)