簡體   English   中英

我的服務方法簽名應該如何?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM