최상의 즐겨찾기 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등 컬렉션 카테고리를 사용하는 경우보다 밀접하게 결합되고 확장된 기능의 모듈화 등이 어려워진다.
참고 문헌
Reference
이 문제에 관하여(최상의 즐겨찾기 Scara 구현), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/jkugiya/articles/cd9059f903fa8b텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)