2013-09-22 20 views
0

我正在構建一個刮板,目前我的解析類有大約100行構造函數,它引發了包含在類和其他第三方組件代碼中的10個方法。構造函數究竟應該包含什麼?

所有這些方法主要分析原始html並將最終值分配給類atttributes。

構造函數是放置此代碼的正確位置嗎?如果我不希望它在類實例化時執行,它應該去哪裏?

+1

我通常對類實例化​​的東西感興趣。設置變量和環境是好的,但我把工作留在其他方法中。如果你經常需要它,創建一個方便的函數/方法來完成這個工作:實例化對象,然後調用你想要的函數。 100是長遠的。如果它做了多件事情,如果它包含多個if/switch語句,則將它們分成它們自己的(可能是私有的/受保護的)函數,那麼您就有了多態性的候選者。我的一般經驗法則(當然有例外)是一個函數應該是<20行。 – Wrikken

+0

@Wrikken在某些情況下,在'__construct'函數中發生某些事情是可以接受的。例子:'__construct(){session_start(); }'< - 一個基本的方式,但展示了一個可接受的(在錯誤處理之後)通過類啓動會話的方式 –

+0

@DarylGill:是的,有例外,它不是100%。然而,很多事情與它在適當的地方有關。例如,拿你的'session_start()',我不會指望它像'新日曆',我可以在'New SomeController()'中允許它,我完全期望它在一個專門的'new會話對象。例如,在這種情況下,如果一個理論上的Calendar對象需要一個會話,我寧願在'Calendar'的構造函數中定義一個'Session'專用類/對象,_require_'Session'對象來清除它('函數__construct(Session $ session){..etc ..}')。 – Wrikken

回答

0

在構造函數中執行工作並不是很糟糕,但對於代碼可讀性和整潔性來說,可以將特定的功能分解爲單獨的方法。然後,您可以從構造函數中調用它們,或者在實例化您的類後更好。它將使代碼在將來更加可用,所以如果您在實例化類時需要使用其中一種方法,則它不會在構造函數中執行所有操作,並且只能調用所需的方法。

+1

而且,爲了增加它,僅用1個目標來定義小的,孤立的函數,使得使用繼承來創建一個對象的行爲與您所需的部分不同,而無需重新實現/複製/粘貼的原始功能。 – Wrikken