2013-10-19 36 views
0

我有存储在一个文本文件,下面的模板:如何重构此代码以使其更通用?

您好,感谢您购买的{一年} {使} {}模型。

year, make, and model进来存储在template configuration table和实际值存储在一个Car table

目前,我得到的是模板(year, make, and model)使用,然后我从Car表对他们的价值观和我更换令牌({year}, {make}, {model})与数据库中的值的所有领域,所以它最终看起来像东西:

你好,感谢购买2013年本田思域。

这是所有罚款时,一切都从Car表,因为如果模板添加需要一个新的领域,像{color},我只是将它添加到template configuration table和一切工作和template configuration table是每个用户,所以如果一个用户不希望{color},这可以很容易地完成。我遇到的问题是当数据没有从Car来,但可能会从其他表来,例如:

您好,感谢您购买的{一年} {使} {}模型。

您的订单号为{} order_no,你可以联系{} customer_service_number

客户服务,如果您有任何问题。

对于此示例的目的,让我们假设{order_no}来自一个orders表和{customer_service_number}来自一个CustomerService表。

我想有这样的方法:

var text = @"Hello, Thanks for Buying the {year} {make} {model}. 
Your order number is {order_no} and you can contact customer service at {customer_service_number} if you have any problems."; 

//This is for fields that are found directly on the Car object 
foreach(var field in templateFields) 
{ 
    var val = car.GetType().GetProperty(field).GetValue(car,null); 

    text = text.Replace(field, val); 
} 

//Replace other fields 
var order_no = order.GetOrderNo(); 

text = text.Replace("{order_no}",order_no); 

var customer_service_number = customerService.GetCustomerServiceNumber(); 

text = text.Replace("{customer_service_number}",customer_service_number); 

,如果每个人都希望看到的附加字段中的上述工作正常,但如果只有几个用户希望看到的order_no and/or the customer_service_number一部分,然后调用一个或者两者都没有意义。

此外,如果客户希望看到产生额外的信息,那我也有像另一个电话:

text = text.Replace("{number_of_oil_changes}",car.NumberOfOilChanges); 

然后我结束了一堆根据不同的客户有用的和/或无用的方法,那么如何避免必须编写所有这些额外的方法来获取依赖于客户的信息?

+0

为什么客户*不想*看到所有的信息? –

+1

@DanTeesdale - 这是一个简单的例子,但让我们只是说,有些人不会为额外的信息开车,有些人会这样做。 – xaisoft

+4

似乎更适合[codereview.se] – millimoose

回答

2

我认为这可能是一种情况下,你应该实际上去较少通用的方法,因为用户界面通常不是通用的。例如,您后来可能会意识到,想要在没有年份的情况下查看模型的客户应该以与查看年份的客户不同的格式查看模型。这些是不同的屏幕,因此可能会有不同的规则,并且具有特定于每个屏幕的代码将在稍后使工作更轻松。

我会创建一个专门针对模板需求定制的平面结构。这甚至包括直接来自Car的字段,因为这意味着如果表格结构发生变化,则不需要更新模板。假设您将“模型”分成两列,以便于过滤或进行其他操作 - 在这种情况下,您只需更新结构,以便将“模型”字段设置为model1 + model2,而不是将所有模板更改为{model1}{model2}

为了避免加载冗余信息,您可以随时检查它包含哪些字段的模板。一种更好的方式,在我看来,是使用与您的模板结构“懒”属性的类(属性,其值一旦被要求在第一次只装):像

class OrderDisplay { 
    private readonly Order _order; 

    public OrderDisplay(Order order) { 
     _order = order; 
    } 

    private string _orderNo; 
    public string OrderNo { 
     get { 
      if (_orderNo == null) _orderNo = _order.GetOrderNo(); 
      return _orderNo; 
     } 
    } 

    ...other properties... 
} 

使用类这样,您可以通过查找类中的匹配属性动态替换模板中的每个{...}。每当模板不包含某些属性时,它们自然不会被调用。