Как вы обрабатываете пользовательские настройки?

Как и большинство программ, пользователи могут указать, как они хотели бы обрабатывать определенные вещи. В моем случае пользователи могут указать, какое форматирование они предпочитают. Есть 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;
    }
}

Сам метод на самом деле не кажется неуклюжим. Это то, как это называется. Постоянная необходимость передавать пользовательские настройки каждый раз, когда я хочу получить отформатированный текст, кажется не лучшим способом. Было бы лучше сделать обычный класс и передать объект настроек приложения через конструктор?

Спасибо.

7 голосов | спросил Mike 11 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSat, 11 Sep 2010 23:11:22 +0400 2010, 23:11:22

1 ответ


0

Один из вариантов - создать некоторый класс фабрики, затем вы можете создать экземпляр фабричного класса с помощью экземпляра класса, содержащего настройки, или из него.

Используя фабричный класс, вы можете получить TextFormatter, экземпляр возвращаемого форматера будет зависеть от предпочтений.

Вот очень простой пример, чтобы прояснить мой ответ с помощью некоторого кода. Это не супер фантазия и потенциально может использовать более изощренные шаблоны, но, надеюсь, это правильная отправная точка.

Определите интерфейс и некоторые средства форматирования

  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");
ответил Chris Taylor 11 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSat, 11 Sep 2010 23:14:31 +0400 2010, 23:14:31

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132