List 인터페이스가 유출되는 추상화입니까?


9

내가 포함하는 변수가 있다면 또는 List다른 유형의 많은 객체를 포함 할 수 있습니다 . a 와 an 의 차이 는 꽤 큽니다. 방법의 큰 O 행동은 크게 다릅니다. 예를 들어를 정렬 한 다음 이진 검색을 수행하여 사용하는 것은 완벽 하지만 괜찮 습니다 .ArrayListLinkedListLinkedListArrayListListArrayListLinkedList


"큰 O"는 무엇을 의미합니까?
— Tulains Córdova

답변:


25

나는 그렇게 말하지 않을 것입니다.

누설 추상화는 추상화해야 할 구현 세부 사항을 처리하도록 강요하는 추상화입니다. 그러나 구현마다 성능이 항상 다르므로 누출로 간주하면 누출이 아닌 추상화가 없습니다.

List추가 문서가없는 것으로 선언 된 경우 성능에 대한 보장이 없으며, 성능에 민감한 작업을 수행하려면 복사하여 작업해야합니다.

또한 기능이 충분하고 성능에 대해 많은 가정을하도록 유혹하지 않는 훨씬 일반적인 인터페이스가 있다는 것을 잊지 마십시오 Collection.


9
기능면에서 훨씬 더 일반적인 인터페이스가 Iterable있습니다.
— emory

서로 다른 구현 간의 성능 차이가 예상됩니다. 예를 들어 Vector와 ArrayList에는 차이점이 있지만 LinkedList의 get 작업은 이상하게 보입니다.
— Paling

17

사소한 추상화는 어느 정도 누출됩니다. 그것은 실제로 그것이 여기에 적용되는지 확실하지 않습니다. :-)

추상화는 행동과 관련이 있습니다. 동작이 특정 성능 (Java List가 아닌) 을 지정 하지 않으면 구현 세부 사항입니다. 즉 관련이 없습니다.

Java를 사용하면 문서 외부의 인터페이스에 대한 최소 성능을 지정할 수 없으며 컴파일러가 확인하기가 매우 어려울 수 있습니다. 성능이 중요한 경우 몇 가지 옵션을 볼 수 있습니다.

  1. 목록 인스턴스가 속하는 클래스 / 인터페이스에 문서화하십시오.
  2. BinarySearchPerformantList다양한 방법의 성능 요구 사항을 지정 하는 새 인터페이스 ( 예 : (yuck!))를 만듭니다 .

옵션 2는 아마도 더 나은 추상화이지만 추가 오버 헤드가 있습니다.


1
+1. 기술적으로 그렇습니다. 목록은 누출 추상 이지만 equals객체 비교 에 사용 하는 것과 관련된 복잡성을 숨기는 Object도 마찬가지입니다 .
— Neil

2
@Neil 그것이 논란의 여지가 있다고 생각합니다 ... 추상화는 성능을 언급하지 않기 때문에이 경우에는 실패했다고 생각하지 않습니다 (논쟁했습니다). 성능에 대해 생각하고 있다면 다른 추상화가 필요합니다. 그것을 언급하기 위해 편집합니다.
— vaughandroid

당신이 숨기고있는 것에 달려 있습니다. 사용법이 복잡합니까 아니면 메모리 사용 및 구현에 있습니까? 그것이 추상 클래스라면, 하나 이상의 이러한 복잡성이 어떤 식 으로든 숨겨져 있기 때문입니다.
— Neil

나는 주위에 많은 년 마커와 같은 인터페이스를 사용하여 옵션 2의 변형을 구현 재생 LinearSpace과 LogarithmicTime같은 클래스를 선언 다음과 public class BinarySearch : ISearchStrategy<T>, LogarithmicTime. 다른 클래스는 public T find<T, S>(IList<T> list, S strategy) where S : ISearchStrategy<T>, LogarithmicTime { }성능 제약 조건을 적용하는 것과 같은 매개 변수를 사용할 수 있습니다 .
— Lucas

2
우리가 Joel Spolsky 기사로 가고 있다면, 나는 그것이 어느 정도 "누수 적"이라고 생각합니다. 기사의 다음 인용문을 참조하십시오. "회사의 시스템 관리자와 계약을 맺고 오버로드 된 허브에 연결하여 처벌 한 경우 일부 IP 패킷 만 통과하고 TCP는 작동하지만 모든 것이 작동합니다. 정말 느려요 "라고 생각합니다.
— Amish Programmer

4

Java에는 일반적으로 일정한 랜덤 액세스 시간 (O (1) get, put 등)이있는 목록으로 정의되는 RandomAccess 인터페이스가 있습니다. 모듈에 이러한 성능 특성이있는 목록이 필요하다고 생각되면 RandomAccess대신을 사용해보십시오 List. 그러한 변경을 할 필요가 없다고 느끼지 않는다면 (그리고 거의 할 일이 없다면) List는 그렇게 새지 않을 것입니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.