2010-09-11 5 views
7

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

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

спасибо.

ответ

6

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

Используя класс фабрики, вы можете получить 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"); 
+0

Woah, спасибо. Это намного проще проверить и управлять. – Mike

Смежные вопросы