2010-09-11 77 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

哇,谢谢。这很容易测试和管理。 – Mike 2010-09-11 21:05:59