저와 제 동료 중 하나는 다음과 같은 문제를 해결하기 위해 노력하고 있었다 :이것이 안티 패턴의 예입니까?
이 클래스의 예를 취할 수있는 내 동료 중 하나는 특정한 하나에서 하나 개의 속성을 가져 오기 A. 에서 하나 개의 특정 속성을 추출의 문제에 직면했다 클래스 (이 경우 A)는 쉽습니다. 그러나 은 여러 개의 클래스 (A1, A2 ...)를 가지고 있고 더 많은 코드 재사용으로이 클래스의 컬렉션에서 특정 속성을 가져 오려고한다고 가정합니다. 예를 들어
public class A {
private String name;
.
.
.
}
List<String> listOfNames = createNameList(listOfAInstances);
createNameList() 메소드는 다음과 같이 될 것이다 :
List<String> tempList = new ArrayList<>();
for(A a : listOfAInstances) {
tempList.add(a.getName());
}
return tempList;
내가 각 클래스와 다른 속성에 대해이 작업을 수행해야 할 여러 클래스가 이제합니다.
- 반사 기반의 접근 방식 : 나는 두 가지 방법을 제안했다.
- "PropertyExtractable"이라는 인터페이스를 만들고 그 안에 "extractProperty"라는 메서드를 넣습니다.
아래와 같이이 들어
interface PropertyExtractable {
Object extractProperty();
}
public class A implements PropertyExtractable {
private String name;
.
.
.
public Object extractProperty() {
return this.name;
}
}
내가 다음 사방 즉,이 배경이었다
public Object getPropertiesOfPropertyExtractable(PropertyExtractable prExtractable) {
return prExtractable.extractProperty();
}
사용할 수있는 유틸리티 메소드를 작성할 수, 나의 다른 한 동료가 있었다 제 2 접근법에 대한 다른 견해, 그는 그것이 안티 패턴과 같다고 나에게 말했다. 그는 나에게 설명하려고 노력했다. 그러나 나는 그것을 그렇게 완전히 얻지 않았다. 그리고 그러므로 나는 여기에서 묻고있다.
이 예제를 Java의 Comparator 인터페이스와 비교하려고합니다. 자바와 마찬가지로 우리는 커스텀 객체 클래스에서 Comparator를 사용할 수 있으며 비교를위한 로직을 정의 할 수있다. 왜 추출 로직을 정의 할 수 없는가?
더 많은 인터페이스가이 방식으로 사용될 수있다. 우리는 그것을 사용해서는 안됩니다
나는이 접근 방식이 안티 패턴인지 알고 싶습니까? 왜?
흠, 내 생각에 형식이 안전하지 않다는 것이 었습니다. 그런 다음 다른 클래스 목록을 가질 수 있다면 이미 공통 인터페이스를 가질 필요가 있습니다. 왜 거기에'String getName()'을 포함하지 않겠습니까? – Fildor
예제 코드와 "예"텍스트가 클래스 이름과 일치하면 많은 도움이됩니다. –
재정의 된 메소드에서보다 구체적인 리턴 유형을 사용할 수 있음을 잊지 마라 :'A'의'public String extractProperty()'. 그런 다음,'A'에 대한 참조가 있다면'String name = myA.extractProperty();'라고 쓸 수 있으며, 변환 할 필요가 없습니다. –