왜 일등 컬렉션을 사용해야합니까?


15

The ThoughtWorks Anthology에서 Jeff Bay (RTF)Object Calisthenics 규칙 번호 4에 따라 " 일류 컬렉션 사용 "을 권장합니다 .

규칙 4 : 퍼스트 클래스 컬렉션

이 규칙의 적용은 간단합니다. 컬렉션을 포함하는 클래스는 다른 멤버 변수를 포함하지 않아야합니다. 각 컬렉션은 자체 클래스로 래핑되므로 컬렉션과 관련된 동작에는 홈이 있습니다. 필터가이 새로운 클래스의 일부가 될 수 있습니다. 또한 새 클래스는 두 그룹을 함께 참여 시키거나 그룹의 각 요소에 규칙을 적용하는 것과 같은 활동을 처리 할 수 ​​있습니다.

내가 이해할 수있는 것은 컬렉션을 래핑하는 별도의 클래스를 사용하고 해당 컬렉션의 수정 데이터를 추가, 삭제하는 메소드를 사용해야한다는 것입니다.

우리는 이것이 어떤 데이터 유형이 컬렉션에 들어가고 어떤 데이터가 나오는지 확신 할 수 있도록하기 위해 필요합니다.

일반 컬렉션 (해당되는 언어로)을 사용하는 경우이 규칙을 따라야합니까?

중요한 의미가없는 경우 명확히하십시오.


1
Amogh Talpallikar 규칙 8이 실제로 "3 개 이상의 인스턴스 변수를 가진 클래스 없음"이므로 규칙 8을 규칙 4로 변경했습니다.
yannis

목차에서 규칙 8 이라고 말한 다음 본문 에서는 규칙 4 라고합니다 .
쓸모없는


6
그것은 단지 나입니까, 아니면이 규칙을 서면으로 구현할 수 없습니까? 내 말은, 당신은 컬렉션이 담긴 수업을 가지고 있으므로 다른 모든 것을 꺼내십시오. 이제 수업은 모음입니다. 만약 당신이 다른 클래스를 가지고 있다면, 그 클래스가 그 안에 컬렉션을 가지고 있습니다.
mjfgates

@mjfgates : 흠 ... 좋은 점! 정말로 생각해야 할 것!
Amogh Talpallikar

답변:


12

타입 안전성은 일류 컬렉션을 사용하는 매우 작은 이유입니다. 귀하의 링크에서 :

규칙 4 : 퍼스트 클래스 컬렉션이 규칙의 적용은 간단합니다. 컬렉션을 포함하는 클래스는 다른 멤버 변수를 포함하지 않아야합니다. 각 컬렉션은 자체 클래스로 래핑되므로 컬렉션과 관련된 동작에는 홈이 있습니다. 필터가이 새로운 클래스의 일부가 될 수 있습니다. 또한 새 클래스는 두 그룹을 함께 참여 시키거나 그룹의 각 요소에 규칙을 적용하는 것과 같은 활동을 처리 할 수 ​​있습니다.

여기서 아이디어는 검색, 필터링, 유효성 검사 또는 컬렉션에서 의미를 추가 / 제거 / iterate를 넘어서는 것을 발견하면 자체 클래스에 넣도록 요청하는 것입니다. 검색 후 하나의 값만 업데이트해야하는 경우 컬렉션 클래스로 이동합니다.

이것에 대한 추론은 매우 간단합니다. 컬렉션이 전달되는 경향이 있습니다. 머지 않아 4 개의 다른 클래스에는 자체 SearchByID()메서드가 있습니다. 또는 Map<Integer, String>해당 맵에 저장된 내용 과 같은 반환 값을 제거합니다. 일류 컬렉션은 단일 소스 파일 비용이 드는 간단한 솔루션입니다. 실제로, 일단 배치가 완료되면 (단위 테스트를 작성하는 것도 매우 쉽습니다), SearchByIDint 대신 GUID를 가져와야 할 때처럼 컬렉션을 다루는 모든 변경을 쉽게 처리 할 수 있습니다.


8

... 컬렉션을 래핑하는 별도의 클래스를 사용하고 해당 컬렉션의 수정 데이터를 추가, 삭제하는 메소드를 사용하십시오.

이것은 컬렉션에 저장된 객체 의 유형 을 보장하는 것 이상으로 컬렉션의 불변성을 보장합니다.

나무 (빨강-검정, AVL 등)는 순서에 민감하며 적절한 경우 균형 재조정에 따라 동작이 달라집니다. 해시 테이블 성능도 적절한 다시 해싱에 따라 다릅니다. 해시 맵에 삽입 할 때마다로드 팩터를 확인해야합니까?

FWIW, 텍스트는 이것에 대해 매우 분명합니다 (그리고 모든 것을 귀하의 질문으로 편집 할 것이므로 아무도 RTF를 다운로드 할 필요가 없습니다).

각 컬렉션은 자체 클래스로 래핑되므로 컬렉션과 관련된 동작에는 홈이 있습니다.

형식 (또는 제네릭)과 관련이 없으며 컬렉션의 동작을 데이터와 연결하는 것과 관련이 있습니다.


1

제네릭을 지원하는 언어를 사용하는 경우 간단한 대답은 "아니오" 입니다. 언어 기능 자체가 이것에서 꽤 잘 작동하므로 유형을 확인할 필요가 없기 때문에 (내 Java generics 경험에서).

그러나 언어에서 제공된 데이터 구조를 사용자 정의하려는 상황이있는 경우 원래 데이터 구조를 중심으로 랩퍼 클래스를 작성하고 고유 한 API를 노출하고 여전히 원래 데이터 구조의 기본 구현을 사용할 수 있습니다.


나는 비슷한 줄에서 생각하고 있습니다. 그러나 무언가가 있어야합니다.이 예제는 Java와 C #에 있었고 둘 다 일반 컬렉션을 지원합니다.
Amogh Talpallikar

@AmoghTalpallikar : 내 요점은 간단하게 유지하는 것이 었습니다. 데이터 구조의 특정 동작을 재정의 할 필요가 없으면 사용자 지정하지 않습니다.
java_mouse
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.