2015-08-07 4 views
6

Я хотел проверить некоторые лучшие практики программирования Scala, так как я новичок в Scala. Я читал онлайн о том, как Scala обычно не использует исключения, кроме «исключительных» обстоятельств (которые не включают проверку параметров). Прямо сейчас в моем проекте я использую много require, поэтому мне интересно, какой будет лучший способ проверки типов.Проверка параметров конструктора/метода Scala

Например, если у меня есть класс

class Foo(String bar){ 
    require(StringUtils.isNotEmpty(bar), "bar can't be empty") 
} 

каковы мои альтернативы проверки бар? Создать такой сопутствующий объект

Object Foo { 
    def apply(bar: String) = Try[Foo] { 
    bar match = { 
     case null => Failure("can't be null") 
     //rest of checks 
     case _ => Success[Foo] 
    } 
} 

Или использовать вместо этого вариант «Вариант»?

Кроме того, для методов scala, как я могу проверить параметр метода? Если я уже возвращаю параметр, я просто возвращаю пустой параметр, если я получаю плохой параметр? Разве это не значит, что я должен проверить пустой параметр, когда я использую возврат метода и не выдавал исключение для более конкретного сообщения? (например, исключение среды выполнения не может использовать нули).

+1

Мне тоже интересно об этом – iCodeLikeImDrunk

+0

@eddiemundorapundo, как это будет работать для методов? Для классов я бы просто использовал право? – jstnchng

+0

ugh извините за удаление моего комментария Я не видел Try/Success/Failure, так как я последний раз использовал Scala. Try/Success/Failure похоже на Либо, как вариант. В вашем примере, похоже, вам нужно будет getOrElse() в сочетании с вашим Foo(), чтобы получить объект Foo, или вы можете что-то сделать с объектом Foo напрямую, используя Foo(). FlatMap (...) и верните еще один Try (который может исходить из ваших методов), затем подключите больше карт/фильтров/whatevers. – eddiemundorapundo

ответ

2

Я думаю, что часть успеха вашего объекта-компаньона вернет объект Foo()?

Object Foo { 
     def apply(bar: String) = Try[Foo] { 
     bar match = { 
      case null => Failure("can't be null") 
      //rest of checks 
      case _ => Success[Foo](new Foo(bar)) 
     } 
    } 

Чтобы использовать его, вы могли бы сделать что-то с Success вы получаете от Foo (бар):

val hehe = Foo(bar).map(foo => foo.someString()).getOrElse('failed') 

Методы Try автоматически обертывают исключения, сгенерированные SomeString() или что-то еще, что ты» re внутри внутри внутри отказов. Если вы хотите проверить параметры foo.someString(), вы бы сделали что-то похожее на ваш метод apply(). Это не так сильно отличается от бросания исключений из условий, но я думаю, что это лучше, потому что «блоки блокировки» будут в recover() или recoverWith(). Вы всегда можете выйти из Try, используя getOrElse(), если ваш код не был предназначен для цепочки Try s сверху вниз.

+0

К сожалению, это значит, что он снова возвращает новый объект foo. Поэтому, когда я хочу создать новый объект Foo, 'val hehe = Foo (bar)' даст мне ошибку, если я перейду в плохую переменную, а успех в противном случае? Что такое 'someString()'? – jstnchng

+0

О, извините, 'someString()' - просто примерный метод, который может иметь foo. Да, когда 'bar' является' null' 'Foo (bar)' будет возвращать 'Failure', который является экземпляром' Try', который имеет методы типа 'map()'. Когда вы используете такие методы, как 'map()' в 'Failure', он возвращает тот же самый« Failure ». Таким образом, вы можете думать о нем как о трубопроводе, где, когда какая-то часть трубы возвращает «Failure», все остальные части трубы передадут этот «Failure». Там, где вы хотите обработать сбой в конвейере, вы можете поместить 'recover()' или 'recoverWith()'. – eddiemundorapundo

Смежные вопросы