2012-05-19 4 views
5

제목의 질문보기! Comparator를 주입하거나 오히려 '새로운'것이라고 생각하십니까? 요소의 순서가 사양에 설정되어 있고 변경되지 않을 가능성이 있다면 새로 도입 하시겠습니까?비교기는 새로운 개체 또는 주사 가능한 개체입니까?

+1

좋은 질문입니다! 대답은 근본적으로 주사가 무엇인지에 대한 광범위한 아이디어를 나타냅니다 *. –

답변

3

"이 종속성을 주입해야합니까?" 참조하는 객체가이 종속성의 본질에 대해 알고 있어야 하는가? " 어, 오직 부정입니다.

클래스가 FastestPonyFinder이고 속도로 List<Pony>을 정렬해야하는 경우 비교기에 대해 알아야한다고 말하고 싶습니다. 비교기는 속도로 비교해야하며 목록의 가장 빠른 순서로 정렬해야합니다. 다른 콤퍼레이터는 그 작업에 적합하지 않습니다. 객체는 List을 만든 것처럼 비교기를 만들어야합니다.

클래스가 BestPonyFinder 인 경우 가장 적합한 구성 요소의 정의가이를 충족하는 조랑말을 찾는 방법의 정의와 분리 될 수 있기 때문에 아마도 비교기를 주입해야합니다. 이렇게하면 코드를 테스트하기가 쉬워지고 앞으로는 더 쉽게 변경 될 것입니다.

+1

답변 해 주셔서 감사합니다! 이 사고 방식에 따라, 특정 날에 조랑말 경주에서 항상 응용 프로그램이 작동한다는 것을 알면 FastestPonyFinder에 TodaysPoniesFinder를 새로 도입 하시겠습니까? 또는 TodaysPoniesFinder가 아마도 Comparator보다 더 복잡한 것으로 생각하면 그렇지 않습니까? (사실, 그 중 하나는 아마도 'TodaysPoniesFinder'와 같은 일을하지 않을 것임을 무시하십시오). 감사! – user1405469

+0

'TodaysPoniesFinder'의 일이 오늘 모든 경쟁하는 조랑말의 목록을 만드는 것이라면,'FastestPonyFinder'는 자신이하는 일에 대해 알 필요가 없다고 말할 것입니다; 그것은 조랑말의 명부를 일으킨 ㄴ다는 것을 단지 걱정한다. 따라서 주사해야합니다. 그것은 구체적 유형이 아닌 'PonyFinder'와 같은 유형의 매개 변수로 주입되어야합니다. –

+1

제쳐두고,'TodaysPoniesFinder'는 완벽하게 테스트 할 수 있습니다 - 당신이 'today'의 값을 주입하는 한! 이것은 [모의목 TDD의 고전적 동작]입니다 (http://www.mockobjects.com/2007/04/test-smell-i-need-to-mock-object-i-cant.html). 매우 간단한'class Clock {public Date now() {return new Date(); }}'시간을 알아야하는 모든 객체에이를 주입합니다. 그런 다음 테스트를 위해 모의 (mock)를 주입 할 수 있습니다. –

1

비교기에 대한 점은 그들이 저렴하다는 것입니다. 그들은 필드를 자주 가지지 않으며, 필드가 많으면 필드가 많지 않습니다.

너무 싸기 때문에 별 문제가되지 않습니다. 그것들을 인라인으로 만들거나 정적 인 최종 필드에서 가져 오거나 싱글 톤 인젝션을 얻을 수 있습니다 - 누가 신경 써야합니까?

+0

단위 테스트의 관점에서 볼 때 기본적으로 비교기는 getter/setter 메서드와 마찬가지로 값이 쌉니다. 그래서, 당신은 그들에 대한 테스트를 쓰는 것을 고려하지 않을 것입니다 ... – user1405469

+1

에 따라 다릅니다. 나는 그들을 사용하는 방법을 확실히 테스트 할 것입니다. –

0

또한 상태가 없으면 항상 "재사용"할 수 있습니다. 이 경우 스레드 안전성을 가지며 이전에 사용했던 상태가되지 않습니다. 그래서 결국 비교기를 어떻게 구현 했느냐에 달려 있습니다 : 상태에 관계없이.

0

단위 테스트의 경우 Comparator의 새 인스턴스를 사용하는 것이 좋지만 비교기가 비교 메서드를 구현하는 경우에만 문제가되지 않습니다. 당신이 비교기에 상태로 어떤 데이터를 주입하기를 원한다면, 변경 가능한 Before와 After 테스트 메소드를 사용하여 이전 컨텍스트를 사용하지 않도록하십시오.