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의 변형을 구현 재생 LinearSpaceLogarithmicTime같은 클래스를 선언 다음과 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.