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

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

  •  02-10-2019
  •  | 
  •  

Вопрос

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

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

Спасибо.

Это было полезно?

Решение

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

Использование заводского класса вы можете получить 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");
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top