C#学习教程:如何在现有项目中实施SOLID原则以及对必须处理此问题的人的建议:我有(成为什么)一个用C#2.0编写的非常大的RESTfulAPI项目,我的一些课程变得非常糟糕。我的主要API类是一个示例-有几十个成员和方法(可能接近数百个)。可以想象,它已经变成了一个小小的噩梦,不仅要维护这段代码,就连导航代码也变成了一件苦差事。我是SOLID原则的新手,而且我是设计模式的忠实拥护者(但我仍处于可以实现它们的阶段,但还不足以知道何时使用它们——在不太明显的情况下)。我需要细分我的班级人数,但我不知道如何最好地做到这一点。我的StackOverflowers同事是否可以建议他们采用现有的整体代码并将其缩小到合适的大小?单一职责原则——一个类应该只有一个改变的理由。如果你只有一个班级,那么它可能有不止一个改变的理由。只需为您的更改定义一个原因,并使其尽可能合理。我建议从“大”开始。将三分之一的代码重构到另一个类中。一旦你有了它,然后重新开始你的新课程。从一班直接升到二十班,太让人望而生畏了。开放/封闭原则——课程应该对扩展开放,但对变化关闭。在合理的情况下,将您的成员和方法标记为虚拟或抽象。每个项目本质上应该相对较小,并为您提供一些基本功能或行为定义。但是,如果以后需要更改功能,您可以添加代码而不是更改代码来引入新的/不同的功能。Liskov替换原则——一个类应该可以替换它的基类。在我看来,这里的关键是正确继承。如果你有一个巨大的case语句,或两个if语句来检查对象的派生类型,那么你就违反了这一原则,需要重新考虑你的方法。接口隔离原则——在我看来,这个原则与单一职责原则非常相似。它仅适用于高级(或成熟的)类/接口。将此原则用于大型类的一种方法是让您的类实现一个空接口。接下来,将使用您的类的所有类型更改为接口的类型。这会破坏你的代码。但是,它将指示您如何使用课程。如果您有三个实例,每个实例都使用自己的方法和属性子集,那么您现在就知道需要三个不同的接口。每个接口代表一组功能,以及更改的原因。依赖倒置原则——父母/孩子的寓言让我明白了这一点。想想一个父类。它定义了行为,而不是核心细节。这是可靠的。然而,子类化是关于细节的,它经常变化,不能完全依赖。您总是希望依赖父类,负责的类,而不是相反。如果你有一个依赖于子类的父类,当你改变某些东西时你会遇到意想不到的行为。在我看来,这与思考SOA的方式相同。服务契约定义了输入、输出和行为,但没有任何细节。当然,我的观点和理解可能不完整或错误。我建议向那些掌握了这些原则的人学习,比如Bob大叔。对我来说,他的书AgilePrinciples,Patterns,andPracticesinC#是一个很好的起点。另一个很好的资源是Hanselminutes上的UncleBob。当然,正如Joel和Jeff指出的那样,这些是原则,而不是规则。它们是帮助指导您的工具,而不是国家法律。编辑:我刚刚发现这些看起来非常有趣的SOLID截屏视频。每个大约10-15分钟长。MartinFowler有一本经典的书——Refactoring:ImprovingtheDesignofExistingCode。在那里,他提供了一系列设计技术和决策示例,使您现有的代码库(以及SOLID的整个主体)更易于管理和维护。尽管重构中存在一些标准例程,但它是一个非常定制的过程,一种解决方案不能应用于所有项目。单元测试是此过程成功的支柱之一。您需要用足够的代码覆盖率来覆盖现有的代码库,这样您就可以确保在更改代码时不会破坏任何东西。事实上,使用具有模拟支持的现代单元测试框架将使您获得更好的设计。ReSharper(我最喜欢的)和CodeRush等工具可以帮助完成繁琐的代码更改。但这些通常是微不足道的机械设备,使设计决策过程变得更加复杂,并且得不到那么多工具的支持。使用类图和UML会有所帮助。实际上,我将从这里开始。尝试理解已经存在的内容并为其添加一些结构。从那里,您可以决定不同组件之间的分解和关系,并相应地更改您的代码。希望这有助于愉快的重构!这将是一个耗时的过程。您需要阅读代码并找出不遵循SOLID原则的部分并重构到新类中。使用像Resharper(http://www.jetbrains.com)这样的VS插件将有助于重构过程。理想情况下,您将自动覆盖自动化单元测试以确保您的更改不会引入代码问题。更多信息在主要API类中,您需要识别彼此相关的方法并创建一个更具体地表示该方法的作用的类。示例假设我有一个Address类,其中包含用于街道号码、名称等的单独变量。此类负责插入、更新、删除等。如果我还需要为邮政地址格式化地址,我可以使用一个名为GetFormattedPostalAddress的方法()返回格式化的地址。或者,我可以将此方法重构为一个名为AddressFormatter的类,该类在其构造函数中采用Address并具有一个名为PostalAddress的Get属性,该属性返回格式化地址。这个想法是将不同的职责分成不同的类。当我遇到这类事情时,我已经在做的事情(我很容易承认我以前没有使用过SOLID原则,但据我所知,它们听起来不错)是从现有的代码库开始.从本质上讲,通过查看系统,您应该能够找到一些内部高度耦合(许多频繁交互)但外部松散耦合(很少有零星交互)的功能子集。通常,在任何大型代码库中都有几个这样的部分;他们是切除的候选人。基本上,一旦你确定了你的候选人,你就必须列举他们作为一个整体与系统外部耦合的点。这应该让您了解所涉及的相互依赖程度。通常有相当多的相互依赖关系。评估子集及其重构的连接点;通常(但并非总是),您最终会进行一些干净的结构重构,从而增加解耦。关注那些重构,使用现有的耦合来定义允许子系统与系统的其余部分一起工作所需的最小接口。寻找这些接口的共性(通常,您会发现比您预期的更多!)。最后,实施您确定的更改。这个过程听起来很糟糕,但在实践中,它实际上非常简单。请注意,这不是一个完全完美设计的系统的路线图(为此,您需要从头开始),但它肯定会降低整个系统的复杂性并增加代码的可理解性。以上就是C#学习教程:如何将SOLID原则贯彻到现有项目中的所有分享内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
