2011-11-15 4 views
1

제목이 적절한 지 모르겠지만 디자인 질문입니다. 무거운 계산을 수행하는 메서드가있는 자바 클래스를 디자인하고 있으며 메서드가 호출 될 때마다이 계산을 피하는 명확한 방법이 있는지 궁금합니다. 나는 호출 코드가 이것을 처리 할 수 ​​있지만 항상 호출 코드의 책임이되어야한다는 것을 알고있다.클래스 메서드가 호출 될 때마다 계산을하지 않아야합니다.

정교하게 - 크기를 계산하는 방법으로 천 차원 벡터의 클래스를 작성했습니다.이 메서드를 호출 할 때마다 모든 차원에서 크기를 계산합니다.

+1

캐시 뒤의 계산을 숨기고 벡터가 업데이트 된 경우에만 다시 계산 하시겠습니까? – mcfinnigan

답변

3

당신이 당신의 벡터 여부에 변경이 있는지 여부를 나타냅니다 Memoization

0

클래스의 내부 구조로 결과를 캐시하면됩니다. 메서드가 호출되면 이전에 계산 된 결과가 캐시에 있는지 확인한 다음이를 반환합니다. 다른 경우에는 계산을 수행하고 캐시에 결과를 저장합니다. 기억을 조심해라.

0

사용 플래그라고 찾고있는 개념. 변경 사항이있는 경우 메소드는 전체 계산을 수행하거나 변경 사항에만 계산을 적용해야하지만 나머지 클래스의 모든 구현을 고려해야하며 플래그가 올바르게 설정 될 때마다 플래그가 올바르게 설정되어야합니다. 값이 수정됩니다.

두 번째 방법은 캐시를 사용하는 것입니다. 이것은 이전에 계산 된 결과를 저장하고 계산하기 전에 찾아보십시오. 그러나이 방법은 객체의 키 값이 다양하지 않은 경우에만 효과적입니다. 그렇지 않으면 많은 메모리를 사용하게됩니다. 특히, 키 값에 double 유형이 있으면 정확하게 일치하지 않으면 키 값을 찾지 못할 수도 있습니다.

0

"천 차원 벡터"가 c'tor로 전달되면 c'tor에서 크기를 계산하고 일부 개인 멤버 변수에 저장할 수 있습니다.

몇 가지 있습니다 돌봐 :

  • 추가/벡터 또는 벡터의 내용을 삭제하는 방법이있는 경우

    그러면 당신은 그 방법의 크기를 업데이트해야합니다.
  • 클래스가 스레드로부터 안전하다고 가정되는 경우 적절한 쓰기 함수가 기본 적이어야합니다.
0

얼마나 자주 크기가 변경됩니까? 이 변경 불가능합니까? 벡터 인터페이스의 얼마만큼을 제어합니까? 특히, 1000 차원 공간에서 회전 또는 다른 크기 보존 변형을 식별 할 수있는 방법이 있습니까? 크기의 상태를 저장하고 값이 변경되면 플래그를 지정하고 필요한 경우에만 다시 계산할 수 있습니다. 변환에 멋진 내부가있는 경우 해당 지식을 기반으로 계산을 건너 뛸 수 있습니다.

관련 문제