특성은 작곡을 수행하는 또 다른 방법입니다. 컴파일 타임 (또는 JIT 컴파일 타임)에 클래스의 모든 파트를 작성하고 필요한 파트의 구체적인 구현을 구성하는 방법으로 생각하십시오.
기본적으로 다양한 기능 조합으로 클래스를 만들 때 특성을 사용하려고합니다. 이 상황은 다른 사람들이 사용할 수있는 유연한 라이브러리를 작성하는 사람들에게 가장 자주 나타납니다. 예를 들어, 최근에 ScalaTest를 사용하여 작성한 단위 테스트 클래스의 선언은 다음과 같습니다.
class TestMyClass
extends WordSpecLike
with Matchers
with MyCustomTrait
with BeforeAndAfterAll
with BeforeAndAfterEach
with ScalaFutures
단위 테스트 프레임 워크는이 t 다른 구성 옵션을, 모든 팀은 일을하는 방법에 대해 다른 설정을 가지고있다. with
ScalaTest는 (Scala 에서 사용 되는 혼합 된) 특성을 옵션에 넣음으로써 와 같은 클래스 이름을 만들 WordSpecLikeWithMatchersAndFutures
거나 와 같은 런타임 부울 플래그 를 만들지 않고도 모든 옵션을 제공 할 수 있습니다 WordSpecLike(enableFutures, enableMatchers, ...)
. 이를 통해 Open / Closed 원칙을 쉽게 따를 수 있습니다 . 단순히 새로운 특성을 추가하여 새로운 기능과 새로운 기능 조합을 추가 할 수 있습니다. 또한 일반적으로 필요하지 않은 기능을 특성에 쉽게 넣을 수 있기 때문에 인터페이스 분리 원칙을 쉽게 따르기 쉽습니다 .
특성은 상속 계층 구조를 공유하는 것이 타당하지 않은 여러 클래스에 공통 코드를 넣는 좋은 방법입니다. 상속은 매우 밀접하게 연결된 관계이므로 도움이 될 수 있다면 그 비용을 지불하지 않아야합니다. 특성은 훨씬 더 느슨하게 결합 된 관계입니다. 위의 예에서, 나는 MyCustomTrait
관련이없는 여러 테스트 클래스간에 모의 데이터베이스 구현을 쉽게 공유하는 데 사용 했습니다.
의존성 주입은 많은 동일한 목표를 달성하지만 프로그래머 입력에 기반한 컴파일 타임 대신 사용자 입력에 기반한 런타임에 달성됩니다. 특성은 의미 상 동일한 클래스의 일부인 종속성을위한 것입니다. 당신은 다른 책임을 가지고 다른 클래스를 불러 내지 않고 한 클래스의 일부를 모으는 것입니다.
의존성 주입 프레임 워크 는 프로그래머 입력을 기반으로 컴파일 타임에 많은 동일한 목표를 달성하지만, 적절한 특성 지원이없는 프로그래밍 언어에 대한 해결 방법입니다. 특성은 이러한 종속성을 컴파일러 유형 검사기의 영역으로 가져옵니다. 구문이 더 깔끔하고 빌드 프로세스가 단순하여 컴파일 시간과 런타임 종속성을보다 명확하게 구분할 수 있습니다.