Skip to content

Latest commit

 

History

History
25 lines (20 loc) · 2.05 KB

아이템15_리시버를_명시적으로_참조하라.md

File metadata and controls

25 lines (20 loc) · 2.05 KB

아이템 15: 리시버를 명시적으로 참조하라

  • 확장 리시버 (this) 를 명시적으로 참조할 것

여러 개의 리시버

  • 스코프 내부에 둘 이상의 리시버가 있는 경우, 리시버를 명시적으로 나타내면 좋습니다.
    • apply, with, run 함수를 사용할 때가 대표적인 예입니다.
    • 일반적으로 also 또는 let을 시용하는 것이 nullable 값을 처리할 때 훨씬 좋은 선택지입니다.
  • 리시버가 명확하지 않다면, 명시적으로 리시버를 적어서 이를 명확하게 해주세요.
    • 레이블 없이 리시버를 사용하면, 가장 가까운 리시버를 의미합니다.
    • 외부에 있는 리시버를 사용하려면, 레이블을 사용해야합니다.
  • 이렇게 명확하게 작성하면, 코드를 안전하게 사용할 수 있을 뿐만 아니라 가독성도 향상됩니다.

DSL 마커

  • 코틀린 DSL을 사용할 때는 여러 리시버를 가진 요소들이 중첩되더라도, 리시버를 명시적으로 붙이지 않습니다.
  • HTML table 요소를 만드는 HTML DSL을 생각해 봅시다.
  • 잘못된 사용을 막으려면, 암묵적으로 리시버를 사용하는 것을 막는 DslMarker 라는 메타 어노테이션 (어노테이션을 위한 어노테이션) 을 사용합니다.
    • @DslMarker 를 사용하면 암묵적으로 외부 리시버를 사용하는 것이 금지됩니다
    • 외부 리시버의 함수를 사용하려면,다음과 같이 (p.91) 명시적으로 해야합니다.
  • DSL 마커는 가장 가까운 리시버만을 사용하게 하거나, 명시적으로 외부 리시버를 사용하지 못하게 할 때 활용할 수 있는 굉장히 중요한 메커니즘입니다.

정리

짧게 적을 수 있다는 이유만으로 리시버를 제거하지 말기 바랍니다. 여러 개의 리시버가 있는 상황 등에는 리시버를 명시적으로 적어 주는 것이 좋습니다. DSL에서 외부 스코프에 있는 리시버를 명시적으로 적게 강제하고 싶다면, DslMarker 메타 어노테이션을 사용합니다.