2012-01-13 39 views
0

我注意到我坐在幾個控制器的頂部有一段代碼。他們往往是這樣的:我應該在哪裏放置輸出字段描述,控制器或模型?

def app_description(app): 
    """ Dictionary describing an app. """ 
    return {'name': app.app, 
      'id': app.id, 
      'is_new': app.is_new(), 
      'created_on': app.created_on.strftime("%m/%d/%Y"), 
      'configured': app.configured } 

我就可以在控制器中的幾個不同的動作調用此方法,但一般並不控制器之外。它訪問屬性。它調用方法。它格式化不透明的對象(如日期)。

我的問題是:這是控制器代碼,還是型號代碼?

爲控制器的情況下:

  • 它定義了我的API。
  • 它目前僅在該模塊中使用。
  • 這裏似乎沒有任何邏輯。

爲模型的情況下:

  • 這似乎是對數據的描述,模型應該負責。
  • 感覺就像我可能想在其他控制器中使用它。還沒有到那裏,但這些功能還是很新的,所以他們可能會。
  • 將函數附加到它明確屬於的對象似乎比將其作爲模塊級函數更好。
  • 它可以更簡潔地定義在模型上。像頂級模型對象定義爲.description(),並且子類僅定義屬性的黑/白列表,並且重寫方法本身以調用函數。我敢肯定,這將是更少的代碼行(因爲它會讓我省去像'name': app.name這樣的重複),這似乎是件好事。
+0

真正的問題是'MVC'不適用於web開發那麼好.. – plaes 2012-01-13 19:24:35

回答

0

答案我終於決定:

在短期內,有這些方法是在控制器的罰款。如果他們定義輸出,那麼,好的,他們可以留在那裏。他們只在模型中使用。

即使世界幾件事情要注意,這表明他們已經長大了,需要去其他地方:

  • 在一種情況下,我需要訪問對象的規範序列化。此時,它作爲模型方法進入模型。
  • 在另一個案例中,我發現我將所有時間戳的格式設置爲相同。我有一個標準的@ajaxify修飾器,它可以處理集合Content-Type標題,JSON編碼等。在這種情況下,我將日期時間標準格式轉移到那裏 - 當JSON編碼器擊中日期時間(以前是不可序列化的)時,它總是將其視爲相同的時間(對於我來說,自紀元開始秒)。
  • 在第三種情況下,我意識到我在一個控制器中重新使用了這個功能。爲此,我將它拖入一個普通的類(如另一個建議的答案),並用它來定義我的「Web API」。之前我使用過這種模式 - 對於類似使用的數據(如時間序列數據或前N個列表)進行分組是有意義的。

我懷疑還有更多,但基本上,我不認爲這些都與我最初認爲的相似。我目前很高興將它們視爲我們(小型,新型)代碼庫中的簡單對象約定,並且理解經過幾次迭代後,可能會出現更好的解決方案。同時,他們留在控制器中並定義我的AJAXy-JSON專用接口。

0

不知道你正在使用的框架,但我建議建立在自己的類這個輔助功能,並把它放在像lib中的共享文件夾/

或者你可以有一個應用程序輔助模塊​​,只是有一堆這些有用的應用程序範圍的功能。

無論哪種方式,我都會將它遠離模型和控制器。

+0

我不認爲把它們從兩個地方拉開是有意義的。由於它們只用於那一個模塊,所以我決定現在就離開控制器,並且在每次重新訪問代碼時都要謹慎考慮我正在試圖用這個邏輯來做什麼。不過謝謝你的想法。 – 2012-04-19 19:17:47

+0

還有一個想法:我們肯定有一些輸出格式化代碼,它在lib中有自己的模塊。一旦這些功能需要在多個控制器中使用,那麼擁有一個用於格式化Web API的單獨定義的模塊是非常有意義的。 – 2012-04-19 19:19:30

相關問題