2013-10-19 32 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... 
} 

使用類這樣,您可以通過查找類中的匹配屬性動態替換模板中的每個{...}。每當模板不包含某些屬性時,它們自然不會被調用。