2012-08-07 11 views
6

私はScalaでかなり頻繁にこの種のパターン(found this example here)を参照してください。これはスカラAPIを設計するための良いリターン型パターンですか?

class UserActor extends Actor { 
    def receive = { 
    case GetUser(id) => 
     // load the user, reply with None or Some(user) 
     val user: Option[User] = ... 
     sender ! user 
    case FindAll() => 
     // find all users 
     val users: List[User] = ... 
     sender ! users 
    case Save(user) => 
     // persist the user 
     sender ! Right(user) 
    } 
} 

だから、あなたが得るの呼び出しに応じて、[ユーザー]、リストの[ユーザー]、右[ユーザー]オプション。このアプローチは大丈夫です!これが最適であれば、私はただ関心を寄せているだけですか?例えば、(これは悪いことかもしれません):常にList [User]を返すことで、APIを改善して一般化しようとしますか?したがって、ユーザーが見つからない場合や保存が失敗した場合、リストは単に空になります。私はちょうど好奇心が強い....上記のパターンがどのように改善されるかについての他の提案は?

私はちょうど1つのエンティティを取得する場合があり、場合によってはそれらを取得しない場合もあります。これを行うための「最良の」方法はありますか、あるいは誰もが自分自身の役割を果たしていますか?

+3

リストは空にすることができます。[0,1]、[0、n]のリストに制約すると、オプションはいいです。 –

答えて

15

戻り値の型は、APIの意図された動作を明確にするのに役立ちます。

GetUserListを返した場合、開発者は混乱し、複数のユーザーが返される可能性があるのか​​疑問に思うかもしれません。 Optionが返されたことを確認すると、意図した動作がすぐに理解されます。

私はかつてあなたが説明したように一般化されたCRUD操作を提供するかなり複雑なAPIで作業しなければなりませんでした。私は理解が難しく、あいまいに定義されていて、扱いが難しいと感じました。

+4

+1 APIの戻り値の型(およびそれらのパラメータ、名前、デフォルト値など)は、ある形式の文書の非常に重要な役割を果たします。戻り値の型は時にはこれから除外されますが、これは答えに適切に記述されている間違いです。 –

1

私の意見では、これはAPIデザインにとって非常に良いパターンです。
nullを処理する必要がないため、私は非常に頻繁にOptionを返します。 Seqを返すことは当然複数の要素に当てはまり、エラー記述を返す場合はEitherが最適です。私はI/Oの解析中に頻繁に使用します。時には私はSeqと他のものとを組み合わせることさえできます。 APIのユーザーの環境設定や目標を知らない可能性が高いため、これらのすべての戻り値を提供して、ユーザーが快適に感じられるようにします。

関連する問題