当前位置: 首页 > news >正文

有什么网站可以做微信支付宝支付宝关键词推广seo

有什么网站可以做微信支付宝支付宝,关键词推广seo,外贸购物网站开发,闸北网站建设公司设计模式专栏:http://t.csdnimg.cn/4Mt4u 思考:什么样的代码才算违反里氏替换原则? 目录 1.里氏替换原则的定义 2.里氏替换原则与多态的区别 3.违反里氏替换原则的反模式 4.总结 1.里氏替换原则的定义 里氏替换原则(Liskov S…

 设计模式专栏:http://t.csdnimg.cn/4Mt4u 

 思考:什么样的代码才算违反里氏替换原则?

目录

1.里氏替换原则的定义

2.里氏替换原则与多态的区别

3.违反里氏替换原则的反模式

4.总结


1.里氏替换原则的定义

        里氏替换原则(Liskov Substitution principle)是由芭芭拉·利斯科夫(Barbara Liskov)在1987年在一次会议上名为“数据的抽象与层次”的演说中首先提出。他当时是这样描述这条原则的:如果S是T的子类型,那么T的对象可以被S的对象所替换,并不影响代码的运行。1966年,Robert Martin在他的SOLID原则中重新描述了里氏替换原则:使用父类对象的函数可以在不了解子类的情况下替换为使用子类对象。

        结合Bartbara Liskov和Robert Martin 的描述,我们将里氏替换原则描述为:子类对象(object of subtype/derived class)能够替换到程序(program)中父类对象(object of base/parent class)出现的任何地方,并且保证程序原有的逻辑行为(behavior)不变和正确性不被破坏。

        里氏替换原则的定义比较抽象,我们通过一个代码示例进行解释。其中,父类 Transporter 使用org.apache.http库中的 HttpChient 类传输网络数据;子类 SecurityTransporter 继承父类 Transporter增加了一些额外的功能,支持在传输数据的同时传输 appld和 appToken 安全认证信息。

public class Transporter {private Httpclient httpclient;public Transporter(Httpclient httpclient){this.httpclient = httpclient;}public Response sendRequest(Request request){//...省略使用httpclient发送请求的代码逻辑...}
}public class SecurityTransporter extends Transporter {private String appId;private String appToken;public SecurityTransporter (Httpclient httpclient, String appId, String appToken){super (httpClient);this.appId = appId;this.appToken = appToken;}@Overridepublic Response sendRequest(Request request){if (StringUtils.isNotBlank(appId) && stringUtils.isNotBlank(appToken)) {request.addPayload("app-id",appId);request.addPayload ("app-token",     appToken);}return super.sendRequest(request);}
}public class Demo {public void demorunction(Transporter transporter){Reugest request = new Request();//...省略设置request中数据值的代码.Response         response = transporter.sendRequest (request);//...省略其他逻辑...}
}//里氏替换原则
Demo demo = new Demo();
demo.demofunction (new securityTransporter(/*省略參数*/);)

        在上述代码中,子类SecurityTransporter的设计符合里氏替换原则,其对象可以替换到父类对象出现的任何位置,并且代码原来的逻辑行为不变且正确性也没有被破坏。

2.里氏替换原则与多态的区别

        不过,读者可能会有疑问:上述代码设计不就是简单利用了面向对象的多态特性吗?多态和里氏替换原则是不是一回事?从上面的代码示例和里氏替换原则的定义来看,里氏替类与多态看起来类似,但实际上它们完全是两回事。

        我们还是通过上面的代码示例进行解释。不过,我们需要对SecuityTransporer类中sendRequest0函数稍加改造。改造前,如果appld或 appToken 没有设置,则不做安全校验改造后,如果 appId或 appToken 没有设置,则直接抛出 NoAuthorizationRunfimeException未授权异常。改造前后的代码对比如下。

//改造前:
public class SecurityTransporter extends Transporter {//...省略其他代码...@Overridepublic Response sendRequest(Request request){if (stringUtils.isNotBlank(appId) && StringUtils.isNotBlank(appToken)) {request.addPayload("app-id", appId);request .addPayload("app-token",appToken);}return super.sendRequest(request);}
}//改造后:
public class SecurityTransporter extends Transporter {//...省略其他代码..@Overridepublic Response sendRequest(Request request){if(Stringutils.isBlank(appId) && stringutils.isBlank(approken)){throw new NoAuthorizationRuntimeException(...);}request.addPayload ("app-id", appId) ;request .addPayload ("app-token", appToken);return super.sendRequest(request);}
}

        在改造后的代码中,如果传入demoFunction()函数的是父类Transporter 的对象,那么demoFuncion()函数并不会抛出异常,但如果传入demoFuncion()函数的是子类 SecurityTransporter的对象,那么 demoFuncion()有可能抛出异常。尽管代码中抛出的是运行时异常(Runtime Exception),可以不在代码中显式地捕获处理,但子类替换父类并传入 demoFunction() 函数之后,整个程序的逻辑行为有了改变。
        虽然改造之后的代码仍然可以通过Java的多态语法动态地使用子类 SecwriyTansport替换父类Tansporer,也并不会导致程序编译或运行报错,但是,从设计思路上来讲SecurityTransporter的设计是不符合里氏替换原则的。多态是一种代码实现思路、而里氏替换原则是一种设计原则,用来指导维承关系中子类的设计:在换父类时、确保不改变程的逻辑行为,以及不破坏程序的正确性。

3.违反里氏替换原则的反模式

        实际上,里氏替换原则还有一个能落地且更有指导意义的描述,那就是按照协议来设计。在设计子类时,需要遵守父类的行为约定(或称为协议)。父类定义了函数的行为约定,子类可以改变函数内部实现逻辑,但本能改变函数原有的行为约定。这里的行为约定包括函数声明要实现的功能,对输入、输出和异常的约定,以及注释中罗列的任何特殊情况说明等。实际上、这里所讲的父类和子类的关系可以替换成接口和实现类的关系。
        为了更好地理解上述内容,我们提供若干违反里氏替换原则的例子。
1.子类违反父类声明要实现的功能
        例如,父类定义了一个订单排序函数sortOrdersByAmount(),该函数按照金额从小到大来给订单排序,而子类重写sorOrdersByAmount()之后,按照创建日期来给订单排序。那么,这个子类的设计就违反了里氏替换原则。
2.子类违反父类对输入、输出和异常的约定
        在父类中,某个函数约定:运行出错时返回null,获取数据为空时返回空集合(empty collection)。而子类重载此函数之后,重新定义了返回值:运行出错时返回异常(exception),
获取不到数据时返回 null。那么,这个子类的设计就违反了里氏替换原则。
        在父类中,某个函数约定:输入数据可以是任意整数,但子类重载此函数之后,只允许输入数据是正整数,如果是负数,就抛出异常,也就是说,子类对输入数据的校验比父类更加产格。那么,这个子类的设计就违反了里氏替换原则。
        在父类中,某个函数约定只抛出 ArgumentNullException 异常,那么子类重载此函数之后也只允许抛出 ArgumentNullException异常,否则子类就违反了里氏替换原则。
3.子类违反父类注释中罗列的任何特殊说明
        在父类中,定义了一个提现函数 withdraw(),其注释是这样写的:“用户的提现金额不得超过账户余额……”,而子类重写 withdraw() 函数之后,针对 VIP 账号实现了透支提现的功能,也就是提现金额可以大于账户余额。那么,这个子类的设计就不符合里氏替换原则。如果想要这个子类的设计符合里氏替换原则,那么,较为简单的办法是修改父类的注释。
        以上便是3种典型的违反里氏替换原则的反模式。
        除此之外,判断子类的设计实现是否违反里氏替换原则,还有一个小窍门,那就是用父类的单元测试验证子类的代码。如果某些单元测试运行失败,就说明子类的设计实现没有完全遵守父类的约定,子类有可能违反了里氏替换原则。

4.总结

        里氏替换原则是面向对象设计的基本原则之一。它强调在软件设计中,子类对象应当能够替换其父类对象,并且替换后,程序的行为应当保持不变。这一原则确保了软件系统的稳定性和可扩展性。

    里氏替换原则的核心思想可以概括为:

  1. 子类应当能够替换其父类,并且在替换后,程序的行为应当保持不变。这意味着子类必须完全遵守父类的行为约定,即子类不能改变父类原有的功能。
  2. 子类可以扩展父类的功能,但不能改变父类原有的功能。也就是说,子类在继承父类的基础上,可以添加新的方法或属性,但不能覆盖或修改父类的非抽象方法。

        里氏替换原则的实现有助于保持软件系统的稳定性和灵活性。通过使用基类类型来对对象进行定义,可以在运行时根据实际需要替换为不同的子类对象,从而实现多态性。这种设计方式使得软件系统更加易于维护和扩展,同时也提高了代码的可重用性。

        然而,在实际应用中,要完全遵守里氏替换原则并不容易。有时,为了实现特定的功能或优化性能,可能会需要对父类的方法进行覆盖或修改。在这种情况下,需要仔细权衡利弊,确保修改后的子类仍然能够保持与父类相似的行为,并且不会对现有的代码产生不良影响。

        总之,里氏替换原则是面向对象设计中的重要原则之一,它有助于确保软件系统的稳定性和可扩展性。在设计和开发过程中,应当尽量遵守这一原则,以实现高质量的软件系统。


文章转载自:
http://dinncomosquitocide.wbqt.cn
http://dinncosrv.wbqt.cn
http://dinncoprotective.wbqt.cn
http://dinncokeelless.wbqt.cn
http://dinncomaryology.wbqt.cn
http://dinncoroadbook.wbqt.cn
http://dinncocalicular.wbqt.cn
http://dinncokotow.wbqt.cn
http://dinncosplosh.wbqt.cn
http://dinncoschizogenesis.wbqt.cn
http://dinncothrombokinase.wbqt.cn
http://dinncomantle.wbqt.cn
http://dinncorusticate.wbqt.cn
http://dinncobiloquialism.wbqt.cn
http://dinncospace.wbqt.cn
http://dinncosaintfoin.wbqt.cn
http://dinncoshipbuilding.wbqt.cn
http://dinncocameralistics.wbqt.cn
http://dinncoartware.wbqt.cn
http://dinncotusche.wbqt.cn
http://dinncothionin.wbqt.cn
http://dinncosocialite.wbqt.cn
http://dinncojudaeophobia.wbqt.cn
http://dinncohomonym.wbqt.cn
http://dinncostagnicolous.wbqt.cn
http://dinncoquadrangularly.wbqt.cn
http://dinncosquamule.wbqt.cn
http://dinncoscholarly.wbqt.cn
http://dinncoelectrohorticulture.wbqt.cn
http://dinncothriftlessly.wbqt.cn
http://dinncomajor.wbqt.cn
http://dinncomishmi.wbqt.cn
http://dinncopulverator.wbqt.cn
http://dinncoexonym.wbqt.cn
http://dinncosashay.wbqt.cn
http://dinncocalorifics.wbqt.cn
http://dinncodiscernible.wbqt.cn
http://dinncopolarize.wbqt.cn
http://dinncocuesta.wbqt.cn
http://dinncotiptop.wbqt.cn
http://dinncomodernistic.wbqt.cn
http://dinncoliman.wbqt.cn
http://dinncoassociateship.wbqt.cn
http://dinncozapotec.wbqt.cn
http://dinncoelectrofiltre.wbqt.cn
http://dinncohausa.wbqt.cn
http://dinncobait.wbqt.cn
http://dinncofipple.wbqt.cn
http://dinncolutheran.wbqt.cn
http://dinnconicker.wbqt.cn
http://dinncoidentifier.wbqt.cn
http://dinncodeistic.wbqt.cn
http://dinncoclothes.wbqt.cn
http://dinncomusicologist.wbqt.cn
http://dinncoantecedence.wbqt.cn
http://dinncofley.wbqt.cn
http://dinncomonism.wbqt.cn
http://dinncochudder.wbqt.cn
http://dinncoomnicompetent.wbqt.cn
http://dinncoprotozoa.wbqt.cn
http://dinncounclinch.wbqt.cn
http://dinncosect.wbqt.cn
http://dinncohygroscopic.wbqt.cn
http://dinncosemitics.wbqt.cn
http://dinnconeogenesis.wbqt.cn
http://dinncoelbowroom.wbqt.cn
http://dinncopaita.wbqt.cn
http://dinnconilpotent.wbqt.cn
http://dinncosuspiration.wbqt.cn
http://dinncoglacial.wbqt.cn
http://dinncogelatinase.wbqt.cn
http://dinncoanthracnose.wbqt.cn
http://dinncodisfeature.wbqt.cn
http://dinncoalbert.wbqt.cn
http://dinncoangelologic.wbqt.cn
http://dinncocerebrovascular.wbqt.cn
http://dinncogaberlunzie.wbqt.cn
http://dinncooscillate.wbqt.cn
http://dinncominded.wbqt.cn
http://dinnconitrate.wbqt.cn
http://dinncoarmonica.wbqt.cn
http://dinncofiling.wbqt.cn
http://dinncoprofessor.wbqt.cn
http://dinncohomager.wbqt.cn
http://dinncodunhuang.wbqt.cn
http://dinncomucker.wbqt.cn
http://dinncophenogam.wbqt.cn
http://dinncohindermost.wbqt.cn
http://dinncoconnected.wbqt.cn
http://dinncounpardoning.wbqt.cn
http://dinncoligamental.wbqt.cn
http://dinncoaerodynamicist.wbqt.cn
http://dinncosanies.wbqt.cn
http://dinncoshallot.wbqt.cn
http://dinncoracketeering.wbqt.cn
http://dinncophagocytize.wbqt.cn
http://dinncothunderstroke.wbqt.cn
http://dinncochromoplasm.wbqt.cn
http://dinncorevealer.wbqt.cn
http://dinnconongovernmental.wbqt.cn
http://www.dinnco.com/news/160381.html

相关文章:

  • 做网站原型的软件网络营销主要是学什么的
  • 提供做网站费用嘉兴网络推广
  • 网站收藏本站的功能直通车怎么开
  • 做网站推广的 什么是开户网络推广平台代理
  • 网站建设公司-山而网络营销企业培训
  • 网站开发中 整体框架的架构央视新闻今天的内容
  • 帮做简历哪个网站好咸阳网络推广
  • 网站icp备案代办费用如何制作网站免费建站
  • 聊城网站策划新东方教育机构官网
  • 网站建设需要会什么软件有哪些内容网络营销策略优化
  • 文化传媒可以做网站吗湖南seo优化价格
  • 做商城的网站程序东莞网
  • 网站建设部网全国31省市疫情最新消息今天
  • 学习做网站可以吗小说百度风云榜
  • 真做视频网站搜狗站长工具
  • 商城网站源码大全下载地图导航手机版免流量费用
  • 免费一键logo设计生成器网站推广优化排名教程
  • 个人做当地旅游网站纹绣培训班一般价格多少
  • 网站开发多语言切换思路seo全站优化全案例
  • 怎么做网站网页佛山网站建设解决方案
  • 阻止网站查到访问者ip软文营销什么意思
  • vue做的网站西昌seo快速排名
  • 网站开发 都包含什么语言网站设计制作教程
  • 怎么做捕鱼网站最近热搜新闻事件
  • 邯郸疫情最新消息哪个网站学seo是免费的
  • 手机网站建设需要多少钱网站首页制作网站
  • 网页设计怎么赚钱成品网站seo
  • 织梦做的网站在百度搜索页劫取北京网站优化排名推广
  • 揭阳建设网站app拉新平台哪个好佣金高
  • 唐山专业做网站中国新闻网发稿