문제

나는 Postsharp (마법과 구별 할 수 없음)를 속성을 읽기로 결정하고 기능을 기억합니다. 함수 호출의 해시가 키가되고 캐시 된 (in 속도) 함수를 다시 호출하는 대신 결과가 반환됩니다. 쉬운 농민, Mac-and-cheesy.

나는 벌써 포기했다 장식 된 기능에서 부작용을 감지 할 수 있는데, 이는 전문가들에게도 "어려운 문제"인 것으로 판명되었습니다. 다음으로, 다른 기능이 회고록 후보인지 알아 내야합니다.

  • 복잡한 참조 유형을 매개 변수로 취하는 방법은 어떻습니까?
  • 인스턴스 내부의 데이터에 의존하는 방법은 어떻습니까?

ActiveRecord-esque 데이터 객체가 마지막으로 떠오른다.

회고록을 지원하기 위해 일주일 오래된 코드를 리팩터링해야합니까?

도움이 되었습니까?

해결책

모든 입력이 값 유형 또는 불변의 참조 유형 인 경우에만 함수를 메모 할 수 있고, 값 유형 또는 참조 유형의 새 인스턴스를 반환하고 부작용이없는 경우에만 기능을 메모 할 수 있습니다. 기간.

메모 화는 입력과 출력 사이의 결정 론적 매핑에 달려 있습니다. 모든 전화 F(a, b, c) A, B 및 C는 동일한 값을 포함하여 메모 화가 가능하기 위해 동일한 결과를 반환해야합니다.

매개 변수가 참조 유형 인 경우 값이 변경되지 않더라도 해당 값이 변경되지 않더라도 기능을 사용하여 여러 호출이 다른 결과를 생성 할 수 있습니다. 사소한 예 :

public int MyFunction(MyType t)
{
   return t.Value;
}

Console.WriteLine(MyFunction(t));
t.Value++;
Console.WriteLine(MyFunction(t));

마찬가지로 함수가 외부의 값에 의존하면 동일한 매개 변수로 해당 함수에 대한 여러 호출이 다른 결과를 반환 할 수 있습니다.

int Value = 0;

public int MyFunction(int input)
{
   return Value;
}

Console.WriteLine(MyFunction(1));
Value++;
Console.WriteLine(MyFunction(1));

그리고 메모 된 기능이 값을 반환하는 것 외에 다른 일을하는 경우 천국이 도움을줍니다.

int Value = 0;

public int MyFunction(int input)
{
   Value++;
   return input;
}

그 기능을 10 번이라고 부르면 Value 메모 삽입을 사용하고 10 번이라고 불러 오도록 리팩터를 리팩터링하면됩니다. Value 1이 될 것입니다.

상태를 메모하는 방법을 알아내는 경로를 따라 내려 가서 참조 유형을 추억화하는 함수를 가득 채울 수 있습니다. 그러나 당신이 정말로 기억하는 것은 함수가 작동하는 값 세트입니다. 메모 화 전에 부작용이 발생하도록 부작용이있는 메모 화 된 기능을 유사하게 해킹 할 수 있습니다. 그러나 이것은 모두 문제를 구걸합니다.

참조 유형을 취하는 함수로 메모 화를 구현하려면 올바른 접근 방식은 값 유형에서만 작동하는 함수의 일부를 리팩터링하고 해당 함수를 메모하는 것입니다.

public int MyFunction(MyType t)
{
   return t.Value + 1;
}

이에:

public int MyFunction(MyType t)
{
   return MyMemoizableFunction(t.Value);
}

private int MyMemoizableFunction(int value)
{
   return value + 1;
}

a) a)를 취하는 메모 화를 구현하는 다른 접근법은 더 모호한 수단을 통해 같은 일을하거나 b) 작동하지 않습니다.

다른 팁

글쎄, 이론적으로 모든 기능은 회고록 후보입니다. 그러나 메모리는 속도를위한 거래 공간에 관한 것임을 기억하십시오.

일반적으로, 이는 답을 계산하기 위해 함수가 필요하거나 의존할수록 공간 비용이 높아져서 방법을 메모 화하는 바람직 함을 줄입니다.

두 가지 예 모두 기본적으로 더 많은 상태를 저장 해야하는 경우입니다. 이것은 두 가지 부작용이 있습니다.

첫째,이를 위해서는 기능을 메모 화하려면 더 많은 메모리 공간이 필요합니다. 더 많은 정보를 저장해야하므로 저장해야합니다.

둘째, 이것은 공간이 클수록 답변 조회 비용이 높을수록 결과가 저축되었는지 여부를 찾는 데 비용이 더 높기 때문에 메모 화 된 기능을 늦출 수 있습니다.

일반적으로 답변을 계산하는 데 비용이 많이 들지 않는 한 입력이 적은 기능과 저장 요구 사항이 낮은 기능 만 고려하는 경향이 있습니다.

나는 이것이 모호하다고 생각하지만 이것은 건축에서 "예술성"의 일부입니다. 두 옵션 (Memozied 및 Non-Memoized Functions), 프로파일 링 및 측정 모두를 구현하지 않고 "올바른"답변은 없습니다.

당신은 이미 기능 주위의 회고록을 제공하기위한 AOP 솔루션을 제공하는 방법을 생각했습니다. Foo, 그럼 알아야 할 것은 무엇입니까?

예, 임의의 복잡성의 대상을 매개 변수로 전달할 수 있습니다. 다시 말하지만, 이것은 현재 정적으로 발견하기가 쉽지 않습니다.

여전히 사용자에게 통보하기 위해 코드를 정적으로 검토 할 수 있다는 아이디어에 여전히 결혼 했습니까? Foo?"

당신이 당신의 요구 사항 중 하나를 만들면, 당신은 지금까지 몇 년 동안 지속 된 글로벌 연구 노력에 참여하게 될 것입니다. 당신이 얼마나 야심적인지에 달려 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top