2017-01-06 6 views
2

Что вернуть на успех в add?Либо [String, Unit] - это идиоматично? Есть ли более идиоматический тип для этого?

В настоящее время я возвращаю Unit, есть ли более идиоматический способ?

Я имею в виду, что Either[String, Unit] не чувствует себя хорошо, потому что Right предназначен для возврата значения, так как он имеет параметр типа.

Метод может быть неудачным или успешным, однако, когда он завершается с успехом, нет ничего, чтобы вернуться, поэтому я просто возвращаю Right(). Интересно, что такое идиоматический способ описания такой ситуации?

Что было бы хорошего типа для представления этой ситуации?

import scala.collection.immutable.HashMap 
import scala.concurrent.ExecutionContext 

object UUID{ 
    def apply():UUID= UUID(java.util.UUID.randomUUID().toString) 
} 

case class UUID(id:String) case class Ref[T](c:Class[T], id:UUID) { 
    override def equals(that:Any)=id.equals(that) 
    override def hashCode()=id.hashCode() 
} 

case class RefVal[T](r:Ref[T],v:T) 

package container { 

    import scala.concurrent.Future 

    trait MapContainer[T] { 
    var map: HashMap[Ref[T], RefVal[T]] = HashMap[Ref[T], RefVal[T]](); 

    private[container] def add(rv: RefVal[T]): Future[Either[String, Unit]] = Future 
    { 
     if (!map.contains(rv.r)) { 
     map = map updated(rv.r, rv) 
     Right() 
     } else Left("add, class already exists with this uuid :" + rv.r.c) 
    } 

    private[container] def notExposed=println("cannot run this from outside package 'model'") 

    def delete(r:Ref[T]) : Future[Either[String,Unit]]= Future { 
     if (map.contains(r)) 
     { 
     map = map - r 
     Right() 
     } 
     else Left(r+"element not found") 

    } 
... 
} 
+0

Это спорный вопрос, но я бы эту модель как «Будущее [Unit]», в противном случае в будущем будет исключение приложения в случае сбоя. – maasg

+0

см. Также: http://stackoverflow.com/questions/40283042/futureeitrapperror-optionuser-in-scala/40284496#40284496 – maasg

+0

@maasg Недавно я прочитал это о 'Future [Unit]' https://lustforge.com/2016/04/12/future-unit-and-stupid-scala-tricks/ – jhegedus

ответ

1

Я думаю, что более идиоматический способ будет:

  • Создание пользовательского класса исключения для случая исключения (спорного)
  • Вернуть либо [Throwable, Карта] в методе добавления, возвращая модифицированную карту на правой стороне

Btw, вы можете использовать codereview.stackexchange для, ну, нуждается обзор кода :)

Редактировать: как @massg указал, в этот момент Try [Map] имеет точно семантику Либо [Throwable, Map], и действительно более подходит для подражания

+0

Спасибо, имеет смысл. – jhegedus

+2

'Либо [Throwable, T] == Попробуйте [T]' – maasg

+0

@jhegedus maasg comment на самом деле имеет большой смысл! Я отредактирую свой ответ – C4stor