2010-05-24 26 views
3

我正在編寫一個web應用程序(在Python中,並不重要)。其中一個特點是人們可以對事情發表評論。我有意見的一類,基本上像這樣:處理代碼中或模板中的未定義值?

class Comment: 
    user = ... 
    # other stuff 

其中user是另一個類的實例,

class User: 
    name = ... 
    # other stuff 

當然,在我的模板,而且,我有

<div>${comment.user.name}</div> 

問題:假設我允許用戶匿名發表評論。在這種情況下,comment.userNone(未定義),當然訪問comment.user.name會引發錯誤。處理這個問題的最好方法是什麼?我看到三種可能性:

  • 在模板中使用條件來測試該情況並顯示不同的內容。這是最通用的解決方案,因爲我可以改變匿名評論的顯示方式,比如「匿名發佈」(而不是「發佈者...」),但我經常被告知模板應該是無意識的顯示機器,不包括這樣的邏輯。另外,其他人可能會爲同一個應用程序編寫替代模板,我覺得我應該爲模板編寫者儘可能簡化事情。
  • 實現針對Comment當真正的用戶是未定義的,返回一個虛設用戶對象的屬性user存取方法。這個虛擬對象將有user.name = 'Anonymous'或類似的東西,所以模板可以訪問它並打印它的名稱沒有錯誤。
  • 把一個實際的記錄對應於用戶與user.name = Anonymous(或類似的東西)我的數據庫中,並指派該用戶發佈任何評論,當沒有人在真實記錄下來。我知道我已經看到了運行一些真實世界的系統這條路。 (phpBB?)

在寫這些類型的系統的人中,是否有普遍的看法:哪些(或某種其他解決方案)最好?如果我以一種方式與另一種方式相比,我應該留意哪些缺陷?誰給出最好的解釋會得到複選標記。

回答

1

我與第一個選項去,在模板中使用if開關。

考慮本地化的情況:您可能會爲每種語言使用不同的模板。您可以輕鬆地將模板本身的「匿名」情況本地化。

此外,數據模型應該什麼都沒有做與輸出端。如果你想測試用戶是否有名字,你會在代碼的其餘部分做什麼?每次檢查== 'Anonymous'

模板確實應該只與輸出數據關注,但是,這並不意味着它必須單獨輸出語句組成。您通常在模板中有某種if user is logged in, display "Logout", otherwise display "Register" and "Login"大小寫。幾乎不可能避免這些。

+0

本地化的好處,我沒想到 – 2010-05-25 02:02:16

1

個人而言,我喜歡乾淨的代碼,並同意模板不應該有主要的邏輯。因此,在我的實現中,我確保所有值都具有「安全」的默認值,通常是空白字符串,指向基類或等價物的指針。這允許對代碼進行兩項重大改進,首先您不必經常測試空值或缺失值,並且可以在顯示模板中輸出默認值,而不需要太多邏輯。

因此,在您的情況下,將默認指針設置爲基準值聽起來像是最佳解決方案。

0

第三種選擇:創建一個代表匿名用戶的常規User實體。

因爲數據庫完整性原因,我不是None的粉絲。