최상의 즐겨찾기 Scara 구현

무엇이 일등석 소장품입니까?


첫 번째 유형의 모음은 언어의 원본 모음집을 포장하여 모음집 기능을 확장하는 데 사용되는 실장 모드이다.
아래의 예는 상품의 소장품을 포장하여 확장기능으로 가격을 계산하는 합계와 세액을 제공하여 논리를 재사용할 수 있도록 하는 것이다.
class Items(values: Seq[Item]) {

  def total: BigDecimal = values.map(_.price).sum
  
  def tax: BigDecimal = total * 0.08
  
}

문제점


다음 코드가 드메테르의 법칙을 위반했다는 토론이 발생할 것이다.
val pItems: Seq[Item] = ???
val items = new Items(pItem)
for {
  item <- items.values.filter(_.price > 100) // dotが2つ
  ...
} ...
이러한 상황을 피하기 위해 다음과 같은 봉인을 진행할 수 있습니다
// オリジナルのコレクションをprivateにして隠蔽
class Items(private values: Seq[Item]) {

  def total: BigDecimal = values.map(_.price).sum
  
  def tax: BigDecimal = total * 0.08
  
  // filterはラップする
  def filter(f: Item => Boolean): Seq[Item] = values.filter(f)
  
  // 元のコレクションも取得できるようにしておく
  def asSeq: Seq[Item] = values
}
그런데 filter 설치가 너무 뻔해서 원래 소장품을 복원하는 것public과 원형을 유지하는 것이 다르다는 말도 있고 불쾌한 사람도 있죠?

암시적 변환 사용


위에서 말한 바와 같이 일등석 소장을 실현하는 목적은'언어의 원시 소장품을 포장하여 소장 기능을 확장하는 것'이다. 그러나 이러한 목적을 실현하기 위해 래퍼 유형의 형식을 사용한 것은 자바 등 언어의 경우언어의 원시 소장품을 확장할 수 없기 때문이죠.그러나 실제 언어에 따라 언어에도 표준 라이브러리와 제3자의 분류를 확장하는 기능이 있어 Scara에서는 스텔스 변환(implicit conversion)을 사용할 수 있다.
또한 자바 등 버전에서는 표준 소장품은 가변적(mutable)이지만 Scala의 소장품은 변하지 않는다(immutable)Collections.unmodifiableList 이러한 방법을 이용하여 일등석 소장 내부의 소장품이 파괴되지 않도록 봉인하는 동기는 Scara의 실현에서 원래부터 드물었다.
// 暗黙クラスの宣言
implicit class Items(values: Seq[Item]) {

  def total: BigDecimal = values.map(_.price).sum
  
  def tax: BigDecimal = total * 0.08
  
}
이 종류의 코드를 사용하면 다음과 같다.
import Items

val items: Seq[Item] = ???
val price = items.filter(_.price > 100).total
val tax = items.tax
filter는 원래 소장된 함수를 사용하지만 기존 프로젝트에서 일등 소장 개념을 도입했을 때이런 방식의 큰 장점은 구성원이 보유한 반의 실복을 바꾸지 않거나, 일등석에 싸인 소장 대상을 바꾸지 않는다는 것이다.

스텔스 변환 사용 시 단점


스텔스 변환을 사용하는 것도 다음과 같은 단점이 있다.
  • 컴파일 시간과 실행 시간 비용
    일반적으로, 은밀한 선언 방법이 호출되면, 컴파일할 때의 비용은 컴파일 시간을 증가시킬 수 있다.또한 은밀한 클래스에서 선언하는 방법의 호출은 실행할 때 new 은밀한 클래스를 통해 실행되기 때문에 실행할 때도 비용이 든다.스텔스 변환을 이용한 추상화는 비용이 필요하다는 것이다.
  • 긴밀한 결합
    스텔스 카테고리를 사용한 구현에서는 확장된 기능을 호출할 때마다 스텔스 카테고리가 나타나기 때문에 1등 컬렉션 카테고리를 사용하는 경우보다 밀접하게 결합되고 확장된 기능의 모듈화 등이 어려워진다.
  • 참고 문헌

  • 선집
  • 현장에서 유용한 시스템 설계 원칙
  • 좋은 웹페이지 즐겨찾기