我正在阅读Bob叔叔的blog about SOLID principles,特别是他的书中关于SRP的摘录 - 单一责任原则,并尝试使用真正的控制台应用程序来应用它。
为了证明他的观点,Bob叔叔说:“在.NET中,必须使用计算几何应用程序构建和部署GUI程序集。”因此我们必须将Rectangle分解为两个不同的实体等等。
但是,为了确定,我想测试该语句并将每个对象放入各自的程序集中。
对我而言,Bob叔叔意味着如果ComputationalGeometry是一个控制台应用程序,除非与Rectangle.dll 和 GUI.dll放在同一目录中,否则它不应该运行,对吗?
事实上,我的Computational Geometry Application在可执行文件目录中运行时没有GUI.dll。没有Rectangle.dll就会崩溃,这很明显。所以.NET非常聪明,并且知道ComputationalGeometry应用程序不会调用draw()函数。
鲍勃叔叔错了吗? 有人可以解释我在这里缺少的一点吗?答案 0 :(得分:1)
是的,基于draw()
方法签名,如果实际上没有调用方法,则需要GUI.dll的语句是错误的。
如果所有程序集引用都在方法体内,那么只要不调用方法(或者更精确地JITed),就不需要该程序集。
这就是你的情况 - 你有draw()
方法签名不依赖于GUI.DLL和方法没有被调用。由于您的代码没有调用该方法,因此没有请求JIT它,因此不需要加载该方法的 body 使用的类型。因此,GUI文件夹中不需要存在GUI.DLL。
// method signature does not refer to Gui.
void draw()
{
// Method body refers to Gui.
Gui.Canvas.Default.DrawRectangle(1,2,3,4);
}
在更实际的情况下,draw
会有某种GUI上下文的参数(如draw(Gui.Canvas canvas)
,因此Rectangle
类型本身将依赖于GUI.DLL。结果使用 Rectangle
类要求GUI.DLL存在。
// method signature refers to Gui.
void draw(Gui.Canvas canvas)
{
// Method body refers to Gui.
canvas.DrawRectangle(1,2,3,4);
}