2013-08-02 4 views
1

이것은 순전히 코딩 스타일 질문입니다.의미있는 값이 없음의 Option에 대한 관용구 구문

내가 호출하는 함수는 Option을 반환하며, None과 같으면 특정 작업을 수행하려고합니다.

예를 들어, 부팅 할 때 기본 사용자를 아직 만들지 않으려 고하고 있다고 가정 해 보겠습니다. 기본 함수와 일치하는 사용자를 찾는 함수를 호출하고 Option[User]을 반환합니다.

반환 값이 None 인 경우 일부 사용자 작성 코드를 실행하고 싶습니다. 그렇지 않다면, 끝났어.

이 점에 대해 가장 관용적 인 스칼라 구문이 궁금합니다. 첫 번째 솔루션은 대부분의 기능처럼 보인다

def getUser(name: String): Option[User] = ... 

getUser("admin") getOrElse createUser("admin", "ChangeThisNow!") 

getUser("admin") match { 
    case None => createUser("admin", "ChangeThisNow!") 
    case _ => 
} 

if(getUser("admin") == None) createUser("admin", "ChangeThisNow!") 

,하지만 난 더 나은 사람이있을 수도 도움이되지만 느낄 수 - 아마도 내가 인정 부분적으로 적용 기능을 사용하여 : 내가 지금까지 가지고 것은 여전히 약간 흐릿 해.

+1

분명히 getOrElse입니다. 결과 사용자와 실제로 무언가를 할 수 있습니다. –

+1

'getOrElse'를 사용합니다. 어떤 이유로 조건문을 사용해야하는 경우'== None' 대신'.isEmpty'를 사용하십시오. –

+0

나는 보통 이러한 질문을 codereview.stackexchange.com – JasonG

답변

4

귀하의 경우 목표가 부작용을 일으키는 것이므로 getOrElse 대신에 조건부를 사용하는 것이 좋습니다.

if (getUser("admin").isEmpty) 
    createUser("admin", "ChangeThisNow!") 
0

정말 이렇게하는 가장 좋은 방법은 당신의 미래 코드가 createUser를 호출하거나되지 않은 경우 알 필요가 없습니다 있도록 의미있는 변수 이름에 결과를 할당하는 것입니다.

val user = getUser("admin").getOrElse(createUser("admin", "ChangeThisNow!"))

이 방법에 상관없이 새 사용자를 만들거나없는 한 경우의 user 변수를 사용할 수 있습니다.

+0

내 질문에이 사실을 분명히하지는 않았지만,이 특별한 경우에는 결과 값에 대해 신경을 쓰지 않아도됩니다. 존재하지 않는다면 사용자를 만들고 싶지만 그렇지 않습니다. 나중에 그걸로 할 일이 좀있어. –

1

스칼라는 다중 패러다임 언어입니다. 구문 외에도 응집력 (단일 책임)과 같은 개념을 고려해야하므로 구문에서 사용하는 실제 숙어 이외에 개체의 구성을 고려할 수 있습니다.

OO 방식은 getUser 함수를 호출하는 다른 코드가 그 관심사를 다루지 않아도되도록 getUser가 속한 객체/클래스를 래퍼에 작성하는 것을 염두에 두는 것일 수 있습니다. 이것은 개방/폐쇄 원칙 및 단일 책임과 잘 어울립니다. 이것은 약간의 빈혈 도메인 모델 안티 패턴이지만 여기서는 OO를 사용하여 대화를 실제 디자인으로 확장하는 방법을 보여줄 수 있습니다.

패턴 일치 또는 getOrElse가 합리적인 해결책입니다. 일반적으로 명령문이 옵션과 같은 모나드에 대해 사용되지 않는다면 적어도 내가 본 것은 아닙니다.

어느 쪽이든, 나는 부작용 (사용자 생성)이 있어도 결과를 반환해야한다고 믿습니다.

case class User(name: String)  

class UserService { 
    def getUser(name: String): Option[User] = ??? 
    def createUser(name: String): User = ??? 
} 

class UserServiceDecorator extends UserService { 
    override def getUser(name: String): Option[User] = 
    Some(super.getUser(name).getOrElse(super.createUser(name))) 
} 
+0

그것은 좋은 대답이기 때문에 Upvoted - 그냥 올바른 질문 아닙니다. 이 특별한 경우에, 나는 반환 값을 필요로하지도, 원하지 않는다. 단지 부팅 할 때 admin 계정이 존재하는지 확인하고, 그렇지 않으면 기본값을 생성하는 것이다. –

관련 문제