[英]How should be my Service method signature?
我正在使用服務層,直到現在我使用了ServiceObject(實現了ArrayAccess,Iterator,Countable),但我想知道這是不是一個好主意。
你會怎么做:
ArticleService::createArticle($articleData, $userId);
要么
ArticleService::createArticle(ServiceObject $data);
其中$data
是:
array(
'title' => 'Lorem ipsum',
'body' => 'Dolor sid amet',
'userId' => 55,
);
ServiceObject具有為每個方法提供通用簽名的好處,但有時它看起來效率不高,並且它沒有被廣泛使用,它失去了它的興趣。
任何反饋?
將其更改為:
ArticleService::createArticle($title, $body, $user_id);
這使得您非常清楚創建“文章”需要什么。
像' $articleData
和$data
這樣的'選項'數組不可能理智地$articleData
,我會反對它。
將您的想法刪除為通用ServiceObject
這實際上是一個非常糟糕的主意。 你的動機是高尚的,但這是錯誤的解決方案。
如果你需要更有說服力,請隨意戳。
我認為這里最好的方法就是擁有類似的東西
$article = new Article;
$article->title = "Lorem ipsum"
$article->body = "Dolor sit amet"
$article->creator = $userID
ArticleService::createArticle($article)
雖然大概“createArticle”不再是該函數的最佳名稱,但是已經創建了Article對象。 你可能會有類似ArticleService::publishArticle($article)
雖然我不知道你在做什么。
您想要的是將數據( Article
)的構造與其使用( ArticleService
)分開。
我真正想說的是不要使createArticle的參數成為通用數組或“ServiceObject”,這兩者都是參數列表的無用抽象,使它成為一個真正代表相關實體的類。
我投票支持該對象,因為復雜系統中的代碼完成是非常好的事情,也是一些自動驗證,因為當您知道對象類型時,您可以以某種方式驗證它。 但是如果你在createSomething中沒有復雜的邏輯,那么數組也可以適合。
第二種方式更好 ,你永遠不會遇到人們以錯誤的方式調用你的方法的問題! 它也更容易閱讀和查看所需內容。 對於我作為開發人員,很明顯我必須傳遞一個ServiceObject
類型的對象,然后我開始搜索該類的文檔或示例或接口。 但在第一個例子中,我必須閱讀createArticle
的代碼,以確定如何處理這兩個參數。
第二種方法還可以幫助您保持API /簽名的清潔。 當需要里面的一些額外的數據createArticle
您只需通過他們線槽ServiceObject
,你不需要更改簽名!
第一個例子的一個更好的簽名是:
ArticleService::createArticle(array $articleData, $userId);
在這種情況下, $articleData
必須是一個數組。 這可以防止錯誤。 在PHP函數參數中,只能使用數組和類名進行強制轉換。
沒有正確的方法 ,但我會使用ArticleService::createArticle($articleData, $userId);
在這個特定的情況下。
我假設該文章具有必需的非空屬性userId(您從上下文中獲取)和可選(不是非常重要的)內容數據,這些數據可能為空。
這樣,文章和用戶對象之間的連接是顯而易見的。 可讀性略有提高。 否則,您需要完全熟悉所需的數據和createArticle方法。
作為證據:當我看到ArticleService::createArticle($articleData, $userId)
我立刻明白了方法正在做什么以及對輸入數據的期望是什么,而第二個讓我困惑。
此外,如果缺少userId,此時您將收到錯誤,而不是在您將其插入數據庫時,您可能會收到更難跟蹤的SQL錯誤。
另一方面,在ZF中,使用數組作為參數是很常見的,因此您的代碼可能會以不同的樣式顯示。
但是,這主要取決於您的偏好。
我認為更好的方法是注入一個對象。 但為什么ServiceObject存在呢? 你有一個方法createArticle,那么將一個文章對象傳遞給它是合乎邏輯的,不是嗎? 以這種方式組織驗證過程更簡單,您可以只標記要在注釋中驗證的字段。
這也是你正在使用的方法問題。 如果在服務層中使用數據映射器模式,那么顯然應該將對象傳遞給它。
使用對象,您可以在對象之間擁有透明且清晰的通信界面。 使用數組時,不清楚您傳輸的數據類型,字段類型等等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.