希望您对SOLID原理很熟悉,特别是如果您使用面向对象的语言进行编程。其中包含的智慧 (主要) 不仅限于面向对象的语言,但这些语言是预期的目标。
如果您不熟悉并且没有时间阅读链接的Wikipedia页面,SOLID是面向对象编程的五个原则的助记符缩写,或者正如我暗示的那样,实际上只是一般编程 (除了Liskov替换原则)。这些概念至少从21世纪00年代初就已经存在,并且真正经受住了时间的考验。
你通过遵循它们得到的是更容易维护的代码。正确遵循这些设计准则,将会引导您编写干净的代码。
我想做的是提供这些原则的现实生活类似物。我想这可能会让他们更容易记住,但我认为这也可以帮助你把积分放在首位,并帮助鼓励 “啊哈” 的时刻,如果你还没有他们。而且,即使你有,它永远不会伤害有一个视觉来帮助加强概念或解释它的人-即使是非技术,潜在的。
S为单一责任原则
单一责任原则 (SRP) 断言类或模块只应做一件事。现在,这是一种主观的,所以原则是加强了启发式的类或模块应该只有一个理由改变。
作为反例,考虑一个类,它打开到数据库的连接,取出一些表数据,并将数据写入文件。这个类有多个原因需要更改: 采用新数据库,修改文件输出格式,决定使用ORM等。就SRP而言,我们会说这个课程做得太多了。
在你的日常生活中,想象一下你偶尔在一些湖边小镇看到的 “鸭子” 车。他们是街头法律和水上能力,所以鸭子之旅为您提供了独特而超现实的体验,即坐在 “汽车” 中,到达水边并继续前进。很有趣,对吧?
然而,你看不到很多。有数以百万计的家庭拥有汽车和船只,很少有家庭购买这些鸭子。你知道为什么吗?这很可能是因为没有人想因为他们的船舵坏了而无法开车去上班。鸭子很有趣,但它们也是SRP可以帮助您避免的陷阱的一个很好的例子。
O为开启/关闭原则
开放/封闭原则指出,代码实体应该对扩展开放,但对修改关闭。为了更具体地说,你应该写一个类,它可以完美地完成它所需要的,而不是假设人们以后应该进来改变它。它已关闭以进行修改,但可以通过例如继承并覆盖或扩展某些行为来扩展。运行违反开放封闭原则的一个例子是在某个地方有一个switch语句,你需要在每次你想向你的应用程序添加一个菜单选项时添加它。
这在现实生活中的一个很好的例子是坐在你的口袋里的智能手机的形式。所有此类手机都有应用程序商店,这些应用程序商店可让您扩展手机的基本功能。当然,它附带了基础知识: 相机操作,实际通话,短信等。但是通过app store,您可以扩展手机的功能,使您可以管理待办事项列表,玩疯狂的视频游戏,甚至可以用作手电筒或无线接入点。
然而,允许你这样做的机制纯粹是一种扩展。苹果、谷歌和微软并没有把操作系统的源代码放在github上,并邀请你潜入并开始构建游戏和手电筒功能。相反,它们使核心电话功能关闭以进行修改 ,并打开扩展功能。
L为Liskov替换原则
Liskov Substition原则 (LSP) 是面向对象编程中最独特的原则。LSP说,基本上,父类型的任何子类型都应该能够代表父类,而不会发生爆炸。
换句话说,如果你有一个类,Animal,带有MakeNoise() 方法,那么Animal的任何子类都应该合理地实现MakeNoise()。猫应该喵喵叫,狗应该吠叫,等等。你不会做的是定义一个MuteMouse类,它抛出IDontActuallyMakeNoiseException。这违反了LSP,并且论点是这个类没有从Animal继承的业务。
想象一下,想象一下自己煮炖菜。如果你像我一样,你只会把可食用的东西放在里面,因为你想吃炖菜而不吃每一口,反复问自己,“这可食用吗?”
I为接口隔离原则
接口分离原则 (Interface Segregation Principle,ISP) 指出,在一个更大的、更单一的接口上,您应该支持许多更小的、特定于客户端的接口。简而言之,你不想强迫客户依赖他们实际上不需要的东西。想象一下,你的代码消耗一些大的,胖的接口,不得不重新编译/部署与恼人的频率,因为一些方法,你甚至不关心得到一个新的签名。
为了在现实世界中描绘这一点,想想去你当地的街角餐厅看看菜单。您会看到所有常规菜单的主要内容,然后是所谓的 “每日汤”。他们为什么要这么做?因为汤的变化很大,每天重新打印菜单是没有意义的。不关心汤的客户端甚至不需要担心,而使用不同接口的客户端-询问服务器。
D表示依赖倒置
依赖反转原则 (DIP) 鼓励您编写依赖于抽象而不是具体细节的代码。您可以在您阅读的代码中识别这一点,方法是寻找一个类或方法,它需要像 “流” 这样的通用的东西,并对其执行操作,而不是实例化一个特定的Filestream或Stringstream或任何东西。这给了有问题的代码更多的灵活性 — 你可以交换任何符合流抽象的东西,它仍然可以工作。
为了在你的日常生活中想象这一点,去你当地的商店用信用卡支付一些东西。店员在看到您的卡是Visa后,不会检查您的卡并从 “Visa机器” 中取出。他只是拿走你的卡,不管它是什么,然后刷它。您和店员都依赖于信用卡抽象,而不必担心细节。
而且,这是固体!
希望这些可视化可以帮助你。如果您在编写代码时始终保持坚定的想法,那么您将使维护该代码的人更加快乐。而且,如果你有一个简单的方法来描绘和记住这些原则,你就更有可能记住它们。
想要构建具有高性能控件的桌面、移动或web应用程序?下载终极免费试用版现在,看看它能为你做什么!