2011-06-04 135 views
0

假設我有一個類加載器,我想註冊。處理重複方法調用的最佳做法是什麼?

$loader = new ClassLoader; 

$loader->register(); 

當方法register()被稱爲第二次,我應該:

  1. 拋出一個異常,說明類裝載器已經被註冊
  2. 失敗默默
  3. 返回一個布爾狀態

如果我要選擇#1,我還會提供一個在第二次調用之前,方法提供了一些檢查的機會。

處理這種情況的最佳方式是什麼?

還有其他更好的選擇嗎?

回答

2

您是否認爲觸發了警告或通知?

trigger_error("ClassLoader already registered", E_USER_WARNING); 

與異常不同,觸發錯誤是一種很好的方法,可以在不停止執行程序的情況下查找代碼中的缺陷/中斷。您保留回溯並在錯誤日誌中獲取條目。如果這樣的錯誤(註冊一個類加載器兩次)投入生產,你會希望它對用戶是透明的(這不是關鍵),但程序員得到通知。

+0

我決定採用您的解決方案,因爲它不會影響程序,但確實爲開發人員提供了一種找出問題的方法。 – 2011-06-04 18:13:53

0

單身人士或單身人士的方法如何?我使用了創建全球Smarty對象:

在config.php:

$GLOBALS['config']['SmartyObj']  = 0; 

在你utils.php中(或任何你想使用):

function smartyObject() 
{ 
    if ($GLOBALS['config']['SmartyObj'] == 0) 
    { 
     $smarty = new SmartyGame(); 
     $GLOBALS['config']['SmartyObj'] = $smarty; 
    } 
    else 
     $smarty = $GLOBALS['config']['SmartyObj']; 
    return $smarty; 
} 

的想法是如果該對象存在,則返回與該對象相同的引用。如果沒有,你創建它。

2

這取決於該方法在做什麼。在這種情況下,如果你正在加載一個類來訪問靜態方法,如果這個類已經被加載,我會默默地忽略這個請求。

在這種情況下,程序將保持相同的狀態,無論該類是否在之前加載過(無論是加載類還是什麼都不做,類將被加載)。

如果它是一個帶有實例方法/屬性的類,那麼你不會想失敗;相反,你會想創建一個新的實例。

在這種情況下,當類已經註冊時拋出一個Exception只會爲使用您的代碼的開發人員造成麻煩。但是,如果你選擇拋出一個異常,你提供一個isRegistered()方法讓他們在加載類之前調用​​。儘管如此,我一定會和#2 一起在這種情況下使用

1

這是我的經驗法則: 如果你正在開發一個別人將建立的應用程序,觸發錯誤(或更好的是,拋出異常)是通知同伴開發者他們不必要地重新註冊的可接受方式你的班。然而,如果代碼只是爲了你或者一小部分熟悉代碼的人,觸發錯誤似乎過分熱衷。除非調用寄存器函數是處理器密集型的,否則我會說在返回寄存器函數開頭的快速檢查中返回false應該沒問題。

相關問題