我正在开发允许用户通过实现一组接口来扩展系统的软件。
为了测试我们所做工作的可行性,我的公司通过以与用户完全相同的方式在这些类中实现我们所有的业务逻辑来“吃自己的狗粮”。
我们有一些实用程序类/方法将所有内容联系在一起并使用可扩展类中定义的逻辑。
我想缓存用户定义函数的结果。我应该在哪里做这个?
是班级本身吗?这似乎会导致大量代码重复。
是使用这些类的实用程序/引擎吗?如果是这样,不知情的用户可能会直接调用类函数而不会获得任何缓存好处。
示例代码
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