2015-08-07 16 views
6

Chciałem sprawdzić niektóre najlepsze praktyki programowania Scala, ponieważ jestem nowy w Scala. Czytałem online o tym, jak Scala zazwyczaj nie używa wyjątków, z wyjątkiem "wyjątkowych" okoliczności (które nie obejmują sprawdzania parametrów). Obecnie w moim projekcie korzystam z dużej ilości require, więc zastanawiam się, jaki byłby lepszy sposób sprawdzania typu.Scala Constructor/Metoda sprawdzania parametrów

Na przykład, jeśli mam klasy

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

jakie są moje alternatywy dla sprawdzenia poprzeczkę? Czy utworzę obiekt towarzyszący, taki jak Czy mogę zamiast tego użyć opcji?

Ponadto, w przypadku metod scala, w jaki sposób sprawdzić parametr metody? Jeśli już zwróciłem opcję, czy po prostu zwracam pustą opcję, jeśli otrzymam zły parametr? Czy nie oznacza to, że muszę sprawdzić pustą opcję, gdy używam zwrotu metody i czy zgłoszenie wyjątku nie pozwoli na bardziej konkretny komunikat? (np. wyjątek środowiska wykonawczego nie może używać wartości null).

+1

Ja też się zastanawiam nad tym – iCodeLikeImDrunk

+0

@eddiemundorapundo jak to by działało w przypadku metod? W przypadku zajęć chciałbym po prostu zastosować zastosowanie, prawda? – jstnchng

+0

Ugh przepraszam za skasowanie mojego komentarza Nie widziałem Try/Success/Failure od czasu ostatniego użycia Scala. Try/Success/Failure wydaje się być podobny, który jest podobny do opcji. W twoim przykładzie wygląda na to, że będziesz musiał uzyskaćOrElse() w połączeniu z Foo(), aby uzyskać obiekt Foo lub możesz coś zrobić z obiektem Foo bezpośrednio, używając Foo(). FlatMap (...) i zwróć kolejną próbę (która może pochodzić z twoich metod), a następnie łańcuch więcej map/filtrów/whatevers. – eddiemundorapundo

Odpowiedz

2

Myślę, że część Success twojego obiektu towarzyszącego zwróciłaby również obiekt 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)) 
     } 
    } 

Aby go użyć można zrobić coś z Success można uzyskać z Foo (bar):

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

Metody spróbować będzie automatycznie zawijany wyjątki generowane przez someString() lub cokolwiek innego, co cię” Robię to wewnątrz Usterki. Jeśli chcesz sprawdzić parametry foo.someString(), możesz zrobić coś podobnego do metody apply(). To nie jest tak bardzo odmienne niż wyrzucanie wyjątków na warunkach, ale myślę, że jest ładniej, ponieważ "bloków catch" będzie w recover() lub recoverWith(). Zawsze możesz wyjść z Try przy użyciu getOrElse(), jeśli Twój kod nie został zaprojektowany do połączenia z najwyższymi i najniższymi numerami Try.

+0

Whoops yeah, oznaczało, że zwróci mu nowy obiekt foo. Kiedy więc chcę utworzyć nowy obiekt Foo, "val hehe = Foo (bar)" spowoduje niepowodzenie, jeśli przekażę złą zmienną, a sukces inaczej? Czym jest 'someString()'? – jstnchng

+0

Przepraszam, że 'someString()' jest tylko przykładową metodą, którą może mieć 'foo'. Tak, gdy 'bar' jest' null' 'Foo (bar)' zwróci 'Failure', który jest instancją' Try', która ma metody takie jak 'map()'. Gdy użyjesz metod takich jak 'map()' na 'Failure' zwróci to samo' Failure'. Więc możesz myśleć o tym jak o rurociągu, w którym, gdy jakaś część rury zwróci 'Failure', wszystkie dalsze części rury przejdą przez' Failure'. Gdziekolwiek chcesz poradzić sobie z awarią w potoku, możesz umieścić 'recover()' lub 'recoverWith()'. – eddiemundorapundo

Powiązane problemy