3

データベースからユーザーを取得する定義を作成しました。

 def user(userId: Int) : User = database withSession {
    (for{
      u <- Users if u.id === userId} 
    yield u).first
  }

存在しない userId を使用すると、データベースが空のリストを返す可能性があります。
ただし、存在しない userId がいつ提供されるかはわかりません。たとえば、私の userId はログインしているユーザーから取得されます。そして、存在しない userId が提供された場合、リクエストを激しく失敗させても大丈夫だと思います。

何かご意見は?

4

3 に答える 3

4

いいえ、リクエストを激しく失敗させるのはよくありません:

def user(userId: Int) : Option[User] // is OK
def user(userId: Int) : Either[String,User] // is OK
def user(usedId: Int) : User // is not OK

または、Integer をカプセル化する型 (概念) を作成して、それが有効な UserId (出生時) であることを確認することもできます。

sealed case class UserId(u:Int) //extends AnyVal // If it's scala 2.10.0

object UserId {
    def get(i:Int) : Option[UserId] = //some validation

} /// ....

def  user(userId:UserId) : User //is OK // well it depends on the semantic of user destruction.

def を作成するときは、関数のドメイン (this と引数) とコドメイン (結果) の間に適切な関係があることを確認する必要があります。

とにかく、ためらわずに入力 (概念を作成) してください。それは、コードについて推論するのに役立ちます。


なぜdef user(userId: Int) :UserOKではないのですか?

Integerの要素と の要素の間の関係がUser存在しないためです。UserId がすべて正の整数であるのに、 を要求するとどうなりuser(-10)ますか? (それは起こりませんよね?) この呼び出しは例外を発生させるべきですか? または null を返しますか?

null を返す必要があると思われる場合は、Option を返します。これにより、欠落している可能性のある対応がカプセル化されます。

例外を発生させる必要があると思われる場合は、次を返します。

  • a Validation[SomethingRepresentingAnError, User](スカラス),
  • an Either[SomethingRepresentingAnError, User](scala 2.7、2.8、2.9)
  • またはTry[User](scala 2.10)

豊富な戻り値の型があると、API を正しく使用するのに役立ちます。

ところで、Scala はチェック例外を使用しないため、代替結果として例外を使用することはできません。例外は、真に例外的な動作のために保持する必要があります (ランタイム例外として)。

も参照してください。

  • http://www.scala-lang.org/api/current/index.html#scala.util.control.Exception$
于 2013-01-29T18:30:55.130 に答える
1

ID でデータをフェッチするときは常に Option[] を返すことをお勧めします。そのような ID を持つユーザーが存在することを確認することはできません。例)別の要求がこのユーザーを削除したか、誰かが入力データを改ざんしようとしました。データベースはアプリケーションの外部システムであり、そのような障害から回復する方法を知っている場合は、それを実行する必要があります。特に、オプションがそのようなタスクに適したツールであるScalaでは。

于 2013-01-29T19:09:23.067 に答える
1

Option失敗する可能性のある計算からの戻り値を表す最も最小限の方法です。例外のスローまたはリターンは、Java コードを処理していて、既存の API によって手を縛られている場合 (およびコードが Java コードから呼び出されている場合) にのみnull許容されます。

からの次のステップアップOptionEither[FailureIndication, SuccessValue].

さらに改善されたのが ScalaZ のValidation.

于 2013-01-29T21:44:40.930 に答える