2012-12-18 55 views
2

我正在開發一個支付庫,它允許我通過相同的接口實現任何支付處理器。我現在的問題是,我想改進處理器饋送的數據的方式。現在它是一個數組,我對該數組不滿意。問題在於,如果您事先不知道所有字段,最終會收到通知,或者處理器代碼本身需要進行一系列檢查。這個想法是能夠採取任何類型的數據結構,因爲它在應用程序之間有所不同,並使其與處理器一起工作,但也確保處理器獲得他們所需的數據饋送。API接口的最佳實踐:傳遞數組或對象以使用?

我現在的想法是將其改爲一個對象。該對象將與所有處理器需要的有限的一組字段一起提供,並且通常具有相同的特性,但是可以擴展該對象以佔用額外的字段。

這樣做的好處是,我可以在處理器中驗證它是否已通過支付對象,並且可以驗證它是否實現了所有必需的字段(如果不引發異常)。

所以現在的問題是,如果這是一個好方法,或者有沒有更好的方法來保證所有的處理器都可以依賴傳遞的數據?

+1

Downvoted?幾秒鐘後?跆拳道?在沒有證明理由的情況下,人們在投票之前是否甚至會閱讀標題以外的內容? – burzum

+1

這是一個關於SO的問題嗎?跆拳道?人們甚至在閱讀常見問題解答之前,除了在天空問孔之前自己做任何事情嗎? - 抱歉的諷刺,但我想念你的問題的實質。在PHP中,數組幾乎可以與對象相同,您需要更具體地區分兩者。這取決於你在這裏不分享的很多背景中哪一個更好。非常主觀的方式要求而不是建設性的。你會看到,這也反映了答案的質量。 – hakre

+0

到目前爲止,我對兩個4個答案都很滿意。 – burzum

回答

1

在你的情況,我可能會使用類似以下的架構:

payment_data - >此類會對所有常見的領域和可能提供一些常用的數據驗證,你也可以用特定的處理器子類,特定的實現,其中某些處理器可以接受處理器特定邏輯的附加數據。如果根據您的驗證規則無法成功構建付款處理邏輯,則無需將此對象傳遞給付款處理邏輯。

接口payment_processor - >該接口將定義常用方法,以便您的任何特定於處理器的實現類都需要能夠處理基礎對象。

payment_processor執行特定處理器的類 - >這些類將所有能夠處理一個基本payment_data對象,但可能任選地能夠被傳遞的payment_data處理器特定子類,該處理器實現的附加特徵。

+0

這與我到目前爲止非常接近。 – burzum

+0

這可能是一種非常穩定的方法,當您發現自己添加更多付款處理器或需要爲特定付款處理器定製邏輯時,它應該至少讓您在設計上具有靈活性。當然你也可能想要一些輔助工廠類。例如,假設您需要根據最終用戶提供給您的數據確定使用哪個支付處理器。如果有一個類可以使用您指定的任何邏輯來實例化相應的'payment_data'和'payment_processor'類,那將是非常好的。 –

+0

我終於實現了一種方法來設置字段到處理器Processor :: set()和Processor :: validateFields(),它將在實際的支付/退款/任何調用之前驗證設置值。是的,我有一個處理器工廠。 :)這裏唯一的缺點是我總是需要在應用程序和處理器之間的數據映射,因爲結構會因應用程序而有所不同。 – burzum

0

對象是一種很好的方法;它足夠普遍,它爲您提供了相當大的靈活性。一定要編寫一個界面,以最大限度地提高靈活性。

當然你怎麼設計對象的事項...

0

你有正確的想法。我建議你使用一個包含所有你需要的元素的__構造的模型,然後在其他地方注入模型(當然這是一個對象)。通過這種方式,您可以非常輕鬆地在界面中使用各種模型。

1

我已經完成了你正在做的事情,並堅持使用數組。數組非常快,可以檢查是否缺少所需的「字段」。如果數組鍵是字段名稱,則創建一個必需字段的數組並使用它來測試是否存在必需字段。

function loadData($data) { 
    static $rqd_fields = array('field1','field2','field3'); 
    $passed_fields = array_keys($data); 
    $missing_fields = array_diff($rqd_fields, $passed_fields); 
    if (count($missing_fields)>0) { 
     // error, return $missing_fields 
    } else { 
     // ok, continue 
    } 
}