Создание Either :: Left с явно передаваемым бросаемым объектом - PullRequest
0 голосов
/ 02 июня 2018

Я разрабатываю метод возврата и хочу сохранить ссылочную прозрачность.Поэтому вместо возврата результата и проверки предварительных условий я возвращаю Either[Throwable, String].В настоящее время он выглядит следующим образом:

def logName(arg: String): Either[Throwable, String] =
  if (arg.lenght < 5)
    Right(arg)
  else
    Left(new IllegalArgumentException(s"Illegal lenght"))

Меня смутило то, что я создаю исключение и не выкидываю его, а просто храню в объекте Left.Это общая схема сохранения ссылочной прозрачности?

1 Ответ

0 голосов
/ 02 июня 2018

Короче говоря, да.

Создание и перехват исключений нарушает нормальный поток выполнения, поэтому любая функция, которая выдает исключение, не может быть прозрачной по ссылкам.Возвращая экземпляр класса исключения, заключенный в экземпляр объявленного возвращаемого типа, вы сохраняете состояние ошибки и делаете вызов также прозрачным по ссылкам.Кроме того, вы позволяете звонящему определить, что должно произойти впоследствии.

В зависимости от ваших требований и, как вы, возможно, уже знаете, scala.util.Try - это еще одна альтернатива scala.util.Either.См. этот ответ на вопрос «В чем разница между Try and Either?» для получения дополнительной информации о различиях между ними.Если вам все равно, какое исключение возникает, scala.Option - это еще одна возможность.

...