C# S.O.L.I.D.原则和汇编?

C# S.O.L.I.D.原则和汇编?,c#,.net,design-patterns,compilation,solid-principles,C#,.net,Design Patterns,Compilation,Solid Principles,例如,关于单一责任原则: 让我们来谈谈收音机课程: 有人可能会说,无线电课程有两个职责,即音量和电台管理。这些操作将从使用它的客户端的完全不同的区域调用 因此,我们有: 都很好 但我总是看到这样的句子: 因此,现在当我们需要更改时,所有代码都取决于 损坏的组件甚至不需要重新编译 等等 如果我需要更改VolumeManager类,我将不必重新编译Radio和StationManager。 但是我必须停止(在web中)iis,以便应用程序使用新的DLL,这将导致应用程序关闭 另外,在控制台中,我

例如,关于
单一责任
原则:

让我们来谈谈
收音机
课程:

有人可能会说,
无线电
课程有两个职责,即音量和电台管理。这些操作将从使用它的客户端的完全不同的区域调用

因此,我们有:

都很好

但我总是看到这样的句子:

因此,现在当我们需要更改时,所有代码都取决于 损坏的组件甚至不需要重新编译

等等

如果我需要更改
VolumeManager
类,我将不必重新编译
Radio
StationManager
但是我必须停止(在web中)iis,以便应用程序使用新的DLL,这将导致应用程序关闭

另外,在
控制台中
,我必须终止整个程序才能更改dll,因为它已被进程锁定(应用程序运行时无法更改dll-文件已锁定)

即使在使用GAC时,我也必须停止程序以更改dll

那它救了我什么? 编译只需右键单击并构建。就这些

我看不到提到“您只需要编译损坏的类…”的好处

我错过了什么

查找单词“
build

查找单词“
重新编译


寻找单词“
recompile

我不认为保存的编译是重要的,而是为什么您可以不使用它就可以逃脱

因为某个更改包含在应用程序的有限区域中。这本身就是一件好事——在一个设计良好的系统中,我不必为了改变其行为而理解整个应用程序,我认为这才是重要的

DLL被锁定或IIS重新启动受影响的应用程序池(我可以说它做得很好)这一事实是技术上的问题,在未来的一些系统中可能会得到缓解


实际上,使用一些卷影复制和应用程序域hokey pokey,您可以编写一个程序,在交换dll时不需要重新启动。

忘记编译时间,忘记应用程序重新启动


SOLID是关于干净的代码和可维护性的。这与运行时无关,而是代码随着时间的推移变得越来越复杂,难以维护,这才是真正的成本所在。

我认为设计模式需要牢记的重要一点是灵活性。如果您曾经决定实现各种类型的StationManager和VolumeManager,则不必更改Radio类中的任何代码。唯一的更改将由类Radio的实例化施加。为此,您仍然需要重新启动应用程序,但您的类中不会有任何带有多个if-else语句的意大利面代码。代码不会更改,您只需为新类添加新代码。这也遵循了另一个重要的设计原则:打开/关闭原则(实心的O):代码应该是开放的,可以扩展,但不能修改。即使您遵循了所有良好的设计实践,您仍然必须重新启动应用程序,以便进行更改

在某些情况下,如果您可以证明更改的范围有限,则将更新部署到现有应用程序“政治上”更容易:例如,如果只需要更新一个DLL。(请注意,这并不意味着每个类都应该在自己的DLL中。但很可能不是所有类都在同一个DLL中)


然而,另一个优势是概念性的:如果我不必重新编译DLL,那么我肯定知道我没有破坏其中的任何内容。越少的代码必须被触摸,我引入bug的机会就越少。C++中的编译时间不是C语言中的问题。一个大的C++项目可能需要很长时间才能编译。当试图在一个区域中进行更改导致重新编译不相关的组件时,这会变得非常令人沮丧。“单一责任”可以通过这种方式改善编译问题,从而实现更紧凑的依赖关系。

我强烈推荐Bob叔叔关于可靠原则的视频

独立部署能力背后的主要思想是,可以独立部署的模块也可以独立开发。通常情况下,您不会独立部署模块,但您确实可以从独立开发模块中获益

与编译过程的影响有关,这可能与C++相关,当编译代码依赖于更改时,每个编译单元(CPP文件)都需要重新编译,其中一个精心构建的依赖图(其中一个更改只影响一个编译单元)会严重影响编译时间。无论如何,除非您使用的是较旧的硬件,否则可能不应该优先考虑编译时间


关于在修改和部署独立模块时必须停止应用程序(web或控制台)-这可以通过使用插件框架避免,插件框架可以动态地将新的/更改的程序集加载到应用程序中-并且可以将可靠的原则应用于构建插件及其接口的方式。请记住,这可能会增加更多的复杂性,我建议避免这种情况,只需在部署时重新启动应用程序

实际上,与编译和构建过程相关的参数对于.NET平台来说并不重要。但它对其他平台或/和语言可能非常重要

例如,在C++世界中,这个好处可以通过DeV团队来提高生产力,因为它可以节省编译时间。在C++世界中,使用桥接模式或成语可以节省大量时间,因为头文件(即使在私有部分)的每一次更改都会导致记录。