c# - 谁负责缓存/内存功能结果?

标签 c# caching responsibility

我正在开发允许用户通过实现一组接口(interface)来扩展系统的软件。

为了测试我们正在做的事情的可行性,我的公司“吃自己的狗粮”通过以与用户完全相同的方式在这些类中实现我们所有的业务逻辑.

我们有一些实用类/方法将所有内容联系在一起并使用可扩展类中定义的逻辑。


我想缓存用户定义函数的结果。我应该在哪里执行此操作?

  • 是类(class)本身吗?这似乎会导致大量代码重复。

  • 是实用程序/引擎使用这些类吗?如果是这样,不知情的用户可能会直接调用类函数而不会获得任何缓存优势。


示例代码

public interface ILetter { string[] GetAnimalsThatStartWithMe(); }

public class A : ILetter { public string[] GetAnimalsThatStartWithMe()
                           { 
                               return new [] { "Aardvark", "Ant" }; 
                           }
                         }
public class B : ILetter { public string[] GetAnimalsThatStartWithMe()
                           { 
                               return new [] { "Baboon", "Banshee" }; 
                           } 
                         }
/* ...Left to user to define... */
public class Z : ILetter { public string[] GetAnimalsThatStartWithMe()
                           { 
                               return new [] { "Zebra" };
                           }
                         }

public static class LetterUtility
{
    public static string[] GetAnimalsThatStartWithLetter(char letter)
    {
        if(letter == 'A') return (new A()).GetAnimalsThatStartWithMe();
        if(letter == 'B') return (new B()).GetAnimalsThatStartWithMe();
        /* ... */
        if(letter == 'Z') return (new Z()).GetAnimalsThatStartWithMe();
        throw new ApplicationException("Letter " + letter + " not found");
    }
}

LetterUtility 应该负责缓存吗? ILetter 的每个单独实例都应该吗?还有其他完全可以做的事情吗?

我试图让这个示例简短,所以这些示例函数不需要缓存。但是考虑一下我添加的这个类使得 (new C()).GetAnimalsThatStartWithMe() 每次运行都需要 10 秒:

public class C : ILetter
{
    public string[] GetAnimalsThatStartWithMe()
    {
        Thread.Sleep(10000);
        return new [] { "Cat", "Capybara", "Clam" };
    }
}

我发现自己在使我们的软件尽可能快和维护更少的代码(在这个例子中:在 LetterUtility 中缓存结果)和一遍又一遍地做完全相同的工作(在这个例子中)之间挣扎: 每次使用 C 时等待 10 秒。

最佳答案

Which layer is best responsible for caching of the results of these user-definable functions?

答案很明显:能够正确实现所需缓存策略的层就是正确的层。

一个正确的缓存策略需要具备两个特点:

  • 它绝不能提供陈旧的数据;它必须知道被缓存的方法是否会产生不同的结果,并在调用者获得陈旧数据之前的某个时刻使缓存无效

  • 它必须代表用户有效地管理缓存资源。无限制增长的没有过期策略的缓存还有另一个名字:我们通常称它们为“内存泄漏”。

您系统中哪一层知道“缓存是否过时?”问题的答案。和“缓存太大了吗?” 那是应该实现缓存的层。

关于c# - 谁负责缓存/内存功能结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8328895/

相关文章:

python - 负责任的时间延迟 - 网络爬行

c# - 在 Visual Studio 中运行宏直到文件末尾

c# - Xamarin.iOS 上的回声消除 (AEC)

c# - WPF - MVVM - 谁负责新的 DataProvider 连接?

linux - 如何在标题中显示 nginx 缓存文件的年龄

php - Symfony2 : Same codebase with multiple environments leads to tons of cache files

c# - 更改参数 - 谁负责?

c# - 从 WPF 自定义 MarkupExtension 访问 "current class"

c# - 如何在C#中查找char数组中的字符索引

javascript - .removeClass 用于多个缓存选择器