作者|杰斯克森来源|达达前端酒馆1主要学习JavaScript中的六大原则。那么你还记得六大原则是什么吗?这六大原则指的是:单一职责原则(SRP)、开闭原则(OCP)、里氏替换原则(LSP)、依赖倒置原则(DIP)、接口分离原则(ISP)、最少知识原则(LKP)。单一职责原则开闭原则里氏替换原则依赖倒置原则接口分离原则最少知识原则那么什么是单一职责原则呢?单一职责原则,英文单词是:singleresponsiveprincple,原则体现为一个对象或方法只做一件事。从前车马慢,书信远,一生只够爱一个人。“从前的日子变慢了,车马邮递都慢了,一辈子只够爱一个人。从前的锁也好看,钥匙精致时尚.一旦你锁定它,人们就会明白”(一个对象或一个方法只做一件事)如果一个方法承担了很多很多的职责,那么很有可能在需求变化的过程中需要重写这个方法。单一职责原则,一个类只提供一个功能,不应该有太多的理由改变类。以前是一个人负责两个不同的任务,任务1和任务2,当任务1需要调整的时候,这个人需要做调整,可能会影响到任务2的正常运行,从而导致任务2没有办法完成。遵循单一职责原则可以解决这种情况。让两个人分别做task1和task2,让1做task1,让2做task2。这样,当task1需要改变的时候,不会影响task2的正常运行。同理,当任务2需要修改,人1所做的不会受到影响。里氏替换原则:所有对基类的引用必须能够使用其子类的对象。过去有一个玩家A,他的棋子是Z1。招式Z由原招式Z1和新功能Z2组成,新功能Z由玩家A的子类徒弟玩家B完成。那么这个子类徒弟玩家B,在完成这个新功能Z2的同时,可能会会影响原来的走法Z1,导致走法失误。(迪米特定律:只和直接的朋友交流),每个对象都会和其他对象产生耦合关系,只要两个对象之间存在耦合关系,就说这两个对象是朋友。2.开放封闭原则。类、方法等应该对其扩展开放,修改关闭,扩展不修改。当出现新的需求时,我们可以扩展现有的需求。方法、对象等达到目的;修改已关闭,不能对实体进行任何修改。可以在不修改现有功能方法的情况下进行实现各种更改的代码。//定义方法functionda(x,y){document.getElementById(x).style.color=y;}//调用方法dada('dashucoding','red');//制定封闭原则->error//定义方法functionda(x,y,z){document.getElementById(x).style.color=y;document.getElementById(x).style.size=z;}//调用方法dada('dashucoding','red','100px');//定义一个方法functionda(x,y){document.getElementById(x).style.color=y;}//不要碰da这个方法functiondada(x,y,z){da(x,y);document.getElementById(x).style.size=z;}//正确使用开发函数的封闭原则da(x,y){document.getElementById(x).style.color=y;}da('dashucoding','red');函数dada(x,y,z){da(x,y);document.getElementById(x).style.size=z;}dada('dashucoding','red','100px');单一职责原则,介绍,对于一个类来说,它的变化应该只有一个原因。开闭原则,简介,软件实体对扩展开放但对修改关闭。即在不修改软件实体的情况下扩展其功能。LiskovSubstitutionPrinciple,Introduction,子类必须能够替换它们的基类。DependencyInversionPrinciple,简单介绍,高层模块不应该依赖低层模块,它们都应该依赖抽象。抽象不应该依赖于具体的实现,具体的实现应该依赖于抽象。功能,降低客户端与实现模块之间的耦合度。接口分离原理,简单介绍,用多个专门的接口来代替一个统一的接口。合成复用的原理,简单介绍一下,就是在新对象中使用一些已经存在的对象,使它们成为新对象的一部分;新对象通过委托给这些对象来达到重用已有功能的目的。简单来说就是尽量用组合,尽量不要用继承。Demeter'sLaw,介绍一下,也叫最少知识原则,意思是一个对象应该尽可能少地了解其他对象,并且不应该和陌生人交谈。3里氏代入原则是对封闭开发原则的补充,讲的是基类和子类的关系。理解里氏代入原理最经典的例子就是“正方形是长方形”、“鸵鸟不是鸟”等。以正方形为例。上数学课的时候,我们知道正方形是长方形。它是一个长宽相等的正方形。矩形,那么从这里可以看出正方形应该继承自矩形。公共类Rectangle{privateintheight;私有整数宽度;//省略gettersetter}//正方形的长度和宽度总是相同的super.setHeight(宽度);}@OverridepublicvoidsetHeight(intheight){super.setWidth(height);super.setHeight(高度);}}publicclassTest{publicstaticvoidmain(String[]args){Testtest=newTest();矩形rectangle=newRectangle();rectangle.setHeight(5);rectangle.setWidth(4);test.zoom(矩形,2,3);Squaresquare=newSquare();.setHeight(5);square.setWidth(4);test.zoom(square,2,3);}publicvoidzoom(Rectanglerectangle,intwidth,intheight){rectangle.setWidth(rectangle.getWidth()+width);rectangle.setHeight(rectangle.getHeight()+height);}}依赖倒置原则,高层模块不应该依赖低层模块,它们都应该依赖抽象。抽象不应该依赖于具体的实现,具体的实现应该依赖于抽象。高层模块依赖于中层模块,中层模块又依赖于低层模块。高层和低层互不依赖,低层的任何修改都会影响到高层模块。抽象层,高层,实现层,具体实现取决于抽象层。接口分离原则,客户端不要依赖它不需要的接口,一个类对另一个类的依赖应该建立在最小的接口上。怎么说?有A、B、C三个客户端,都依赖一个大接口。这个大接口包括A()、B()、C(),但是客户端A只需要A(),其他的不需要。这时候就利用接口分离的原则,让客户端A只需要A(),让客户端B只需要B(),让客户端C只需要C()。设计原则是指导思想,从思想上为我们指明程序设计的正确方向,而设计模式是实现手段,因此设计模式也遵守这些原则。实现高内聚和低耦合。高内聚意味着模块内部必须是高度聚合的,也就是模块内部的关系。低耦合就是模块之间的耦合要尽可能的低,也就是模块之间的关系。单一职责原则总结:一个对象只做一件事。开放封闭原则总结:对扩展开放,对修改封闭。得墨忒尔定律,又称最少知识原则摘要:一个对象对其他对象的了解应该是最少的。设计模式中的外观模式和中介模式就是迪米特法则的应用实例。Dimit方法很简单,只和朋友交谈,不和陌生人交谈。缺点是会在系统中产生大量的小方法。合成复用原则,多用组合,少用继承。继承是面向对象的三大特性,封装、继承、多态,继承实现简单,易于扩展,但是继承也有缺陷,父类变了,子类也必须变,继承破坏了封装,对于父类,其实现对子类是透明的,继承是一种强耦合关系。当父类改变时,子类必须改变;inheritancedestroystheencapsulation(子类被封装,父类由于父类的改变而破坏了子类的封装)。对于子类,没有必要继承父类。为了安全,如果父类修改了它的内容,子类的功能就会被破坏;对于父类,子类继承父类,重写其方法时,不能随意修改父类的方法。设计原则:单一职责原则,一个方法只做一件事;里氏替换原则,子类可以替换父类;依赖倒置原则,只依赖接口不依赖方法,不关心底层实现方法;接口分离原则,把大接口拆分成小接口;迪米特定律,函数中传入的参数越少越好,开放封闭原则,对扩展开放,对修改封闭。5单一职责原则,优点:降低单个类或对象的复杂度,按照单一职责原则将对象分解成更小的单元,有利于代码复用和单元测试。当一个职责需要改变的时候,不会影响到其他职责。缺点:增加了编码的复杂度,增加了对象之间关联的难度。了解不同的班级有不同的职责。一个类只有一个责任。最少知识原则,优点:降低或消除对象之间的耦合度,提高可重用性。缺点:需要封装对象或者引入第三方对象来处理两者的关系。有时第三方对象非常复杂,难以维护。开放封闭原则,优点:程序的稳定性非常高,把容易改动的地方分开,更容易维护。//单一职责原则//ClasspublicclassPeople{publicvoidwork(){System.out.println("work");}publicvoideat(){System.out.println("eat");}publicvoidplay(){System.out.println("播放");}}//一个类,三个职责//单一职责原则publicinterfaceworkInter{publicvoidwork();}publicinterfaceeatInter{publicvoideat();}publicinterfaceplayInter{publicvoidplay();}//继承interfacepublicclassPeopleimplementsworkInter,eatInter,playInter{publicvoidwork(){System.out.println("work");}publicvoideat(){System.out.println("eat");}publicvoidplay(){System.out.println("播放");}}publicclassTest{publicstaticvoidmain(Stringargs[]){Peoplepeople=newPeople();workInterworker=newPeople();工人.工作();eatIntereater=newPeople();食者.吃();playInterplayer=newPeople();播放器.play();根据替换原则,所有对基类的引用必须能够透明地使用其子类的对象,子类必须完全实现父类的功能。哪里有父类出现,用子类代替就不会有问题。里氏代入原则,我喜欢动物,那么我一定喜欢狗,因为狗是动物的一个子类;但是我说我喜欢狗,但我不能说我喜欢动物,因为我不喜欢其他的小动物。子类必须完整实现父类的功能,例如://parentclasspublicabstractclassFather{//workpublicabstractvoidwork();}//subclasspublicclassChildextendsFather{@Overridepublicvoidwork(){//这个方法实现了,但是功能没有实现,什么也没做}}依赖倒置原理,理解为使用接口或者抽象类。模块之间的依赖是通过抽象发生的,实现类之间的关系不能直接依赖。实现类的依赖关系是通过接口或抽象类产生的。接口或抽象类依赖于实现类,实现类又依赖于接口或抽象类。publicclassDa{privateDadadada=null;publicDa(Dadadada){this.da=da;}}publicinterfaceDaInter{publicvoidsetDa(Dadadada);}publicclassDaimplementsDaInter{privateDadadada=null;publicvoidsetDA(Dadadada){this.da=da;}}接口分离原则,如果一个类实现了一个接口,但是这个接口有它不需要的方法,就需要把接口拆分出来,把它需要的方法独立出来,形成一个新的接口让这个类去实现。单例模式:一个类只有一个实例,用一个变量来区分当前实例是否已经创建//一个参数,一个变量varda=function(name){this.name=name;this.instance=null;}da.prototype.getName=function(){alert(this.name)}da.getInstance=fucntion(name){if(!this.instance){this.instance=da(name);}returnthis.instance;}推荐阅读1.你对this、new、bind、call、apply了解多少?那我告诉你2.为什么要学JavaScript设计模式,因为它是核心3.一篇文章带你走进JavaScript闭包和高级函数4.大厂HR面试ES6深度面试题知识点5.一个JavaScript技术栈拿你了解继承和原型链。当前文章内容涉及前端和PHP知识点。有兴趣的可以关注一下。很荣幸被你发现。真是有见地!感谢您的关注。在以后的日子里,希望大家一直默默支持我,我会努力写出更多优秀的作品。我们一起成长,从零开始学习编程,将Web前端领域、数据结构与算法、网络原理,通俗易懂的呈现给小伙伴们。分享Web前端相关的技术文章、工具资源、精选课程、热点资讯。如本账号内容有问题(例如:涉及版权或其他问题),请及时联系我们进行整改,我们会尽快处理。请喜欢它!因为您的认可/鼓励是我写作最大的动力!欢迎来到达达的CSDN!这是一个有品质有态度的博客
