2010-12-10 3 views
1

자바 6을 사용하고 있습니다.중첩 템플릿과 새로운 인터페이스의 장단점은 무엇입니까?

가끔 이런 일을하는 것을 느낍니다.

Map<String,List<Integer>> myMap; 

이것은 단지 예입니다. 그것보다 깊게 갈 수 있습니다.

새 인터페이스를 만들고 대신이 작업을 수행하는 것이 장단점은 무엇입니까?

Map<String,NewInterface> myMap; 

내가보기에 유일한 것은 좀 더 읽기 쉽습니다. 성능, 모듈성, 결합 또는 과 관련하여 다른 점이 있다면으로 지정 하시겠습니까?

답변

2

예를 들어, 구성 요소 목록 주위에 복잡한 논리 연산이있는 경우 모듈성을 높이고 테스트를 단순화하기 위해 무언가를 둘러 쌀 수도 있습니다.

그러나 만약 당신이하고있는 일이 단순하다면 그럴 필요가 없을 것입니다.

그러나 더 복잡한 경우가 있음을 나타내므로 ID는 추상이라고 말합니다.

당신은 하위 구조를 추상화하는 다른 이점을 지적합니다.

가독성은 대형 소프트웨어 프로젝트에서 중요 할 수 있습니다. 코드를 깨끗하게 유지하고 유지 보수를 더 쉽게 만듭니다. 거대한 하위 구조의 의도를 이해하기 어렵습니다. 당신은 코드가 스스로 문서화 될 수있을 때, 당신이 무엇을하고 있는지를 알아내는 데 반나절이 지출을 유지해야하는 사람을 원하지 않습니다.

0

하나의 경우, List<Integer>은 분명히 새 인터페이스를 구현하지 않습니다. 변수에 List<Integer>을 입력하면 코드에 많은 부분이있을 것입니다. 간단한 Map<String, List<Integer>>은 해당 목록을 즉시 수용했지만 사용자 인터페이스 버전은 사용자 지정 인터페이스를 구현하는 List<Integer>의 새로운 사용자 지정 버전을 인스턴스화하기 위해 코드의 모든 해당 위치를 수정해야합니다.

이것은 수정할 수없는 JDK 클래스를 예제로 선택했기 때문에 문제가됩니다. 자유롭게 수정할 수있는 자신 만의 클래스를 다루는 경우, 인터페이스를 추상화하는 것은 훌륭한 접근 방법입니다. 결과 코드는 일반적으로 제네릭 와일드 카드 사용을 최소화하는 데 도움이되기 때문에 읽기가 훨씬 쉽습니다.

0

단일 컬렉션 인 경우에도 추상화를 도입해야합니다. OO가 소프트웨어를 키울 때 새로운 추상화가 필요하다는 것은 놀라운 일이 아닙니다.

추상화를 도입하면 추가 코드가 추가됩니다. 적어도 단기간에.

소수의 존경할만한 사람들이 추상화를 위해 곧장 가서 컬렉션을 반환해야한다는 극단적 인 견해를 갖고 있습니다.

일반 기업 프로그래머는 객체 지향을 피합니다.

0

새 인터페이스를 사용하면 화면에 표시되는 문자 수가 줄어들지 만 실제로 여러 유형을 연결하려는 시나리오가 중단 될 수 있습니다.내가 뭔가 가독성을 최소화하여

private Map<T, NodeList> edges; 

에 그 NodeList를 보장 할 수 있기 때문에 가능하면 같은 값으로 구성되었다 오류를 허용 할 인터페이스

public interface NodeList implements List<T> { 

} 

을 만들었다 경우

public class Graph<T> { 

    private Set<T> nodes; 

    private Map<T, List<T>> edges; 

} 

T을지도로 사용하십시오. 예 :

edges = new Map<Cities, NodeList>(new NodeList<States>()); 

이것은 분명히 의도 한 것이 아닙니다.

+0

NodeList 인터페이스에는 유형 매개 변수가 없으므로 NodeList 으로 인스턴스화 할 수 없습니다. 유형 매개 변수가있는 경우 모서리의 서명은 그래프 클래스의 유형 매개 변수 T에 바인딩해야하므로 불일치 구문이 컴파일 시간 오류가됩니다. –

0

당신이 필요한 것을 제공하는 가장 일반적인 추상화로 프로그래밍해야합니다. 내용을 주문할 필요가없는 경우 Map<String, ? extends Collection<Integer>을 수락하십시오. 크기, 조회 요소 등을 알 필요가 없지만 요소를 반복 할 수 있어야하는 경우 Map<String, ? extends Iterable<Integer>>을 사용하십시오.

의미가없는 인터페이스를 만들어 코드의 유연성과 결합력을 향상시키지 마십시오. 자세한 내용은 여기서 사업을하는 데 드는 비용입니다. 너를 나쁜 디자인으로 만들지 마라.

관련 문제