Нет, это не нормально, чтобы не выполнить запрос:
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
или же вы можете создать тип (концепцию), который инкапсулирует целое число, которое гарантирует, что это действительный идентификатор пользователя (при рождении).
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.
Когда вы делаете определение, вы должны убедиться, что существует правильное отношение между доменом (this и args) вашей функции и доменом кода (результатом).
В любом случае, не стесняйтесь печатать (создавать концепции), это поможет вам рассуждать о вашем коде.
Почему def user(userId: Int) :User
не подходит?
Потому что отношение между элементами Integer
к элементам User
не существует. Что, если все идентификаторы пользователей — положительные целые числа, но вы запрашиваете user(-10)
? (этого не произойдет, верно?) Должен ли этот вызов вызвать исключение? Или вернуть ноль?
Если вы считаете, что он должен возвращать значение null, верните параметр Option, он инкапсулирует потенциально отсутствующее соответствие.
Если вы считаете, что это должно вызвать исключение, верните:
Validation[SomethingRepresentingAnError, User]
(скалаз),
Either[SomethingRepresentingAnError, User]
(скала 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$
person
jwinandy
schedule
29.01.2013