契约

魔兽争霸3中死亡骑士(Death Knight)出生时就会说一句:

  The pact is sealed.

  契约已签订。

 

看过N多童话故事和电影的小伙伴们肯定熟悉这种场景:

  大反派斗不过主角,处于劣势时,就会与诸如恶魔签订契约,以自己的青春换取强大的力量,即:

    青春 --> 恶魔     恶魔  --> 力量  

 

我们把这个再改变一下:

  恶魔 【得到】{青春}  ->  {力量}

  看起来有点眼熟,这不就是function/method干的事情吗?

  

  function 与恶魔签订契约(青春) {
    return 力量;
  }

    

拿一个PHP简单的函数来说吧,此函数是这样的:

function getFullName($givenName, $surname) {return $givenName.' '.$surname;
}

    对于调用方来说,如此调用:$fullName = getFullName($realGivenName, $realSurname);

  输入 $realGivenName 和 $realSurname 不知道是否返回结果,有结果也不知道是什么。

  这里 $givenName和 $surname 两个形参对比之下就是契约条件,而返回的值就是契约回馈。

      

每天在敲代码,原来就是在写各种各样的契约,然后各个契约被各种各样的大反派(调用方)签订(调用)。

 

再来看Java的一个方法

public static String getFullName(String givenName, String surname) {return givenName + " " + surname;
}

 

 给一个String类型 和 一个String参数,返回一个String 类型的结果;

 

   

去跟PHP对比一下,发现Java的Method契约条件的限制更加严格了,而契约回馈的描述也更加准确了。

 

即PHP函数在调用时,函数形参如果不限制类型的话,可以是任意类型($givenName 可以是一个int,也可以是array,甚至是一个resource类型,或者干脆是null),

基于动态语言的特点,甚至还可以传多于/少于(少于的话PHP会报Warning级别的错误)function规定的参数数目进去!

 

所以在上面这种实现在遇到特殊情况下,就会出现意想不到的结果,因此具体实现要对变量类型、值做各种判断;

而Java在实现内则不需要做类型判断,只需要处理空的情况即可;

 

对于return 的结果来说,PHP function实现可以返回 null、int,array,resource... 又是不限制类型和值!契约回馈又是模糊的描述……

 

所以,PHP function/method 契约是模糊的,契约回馈的描述也是模糊,而Java则更加强调契约发起方和契约执行方的明确的责任;

 

如此这般,PHP 一个function/method 实现(契约执行方)就头大了,调用方(契约发起方)传过来的参数(契约条件)很有可能存在

意想不到的情况,于是就需要在实现内加类型判断, 处理空或者其他情况。调用方也不知道实现是否真的能达成契约描述(function/method名称,注释等)

那样的美好的结果,调用方又得对实现返回进行判断。

 

而Java则只是对象参数需要处理null的情况,因为有一步编译的过程,类型则不需要费心。即在通过编译后,契约双方的基本条件和回馈描述被保证了。

PS:这么一说,编译器(Compiler)听起来就像是一个公证人似的。

 

总的来说,PHP因为不必在声明变量或者制定方法签名时声明类型,所以是弱契约。    

 

弱契约的好处是显而易见的:

  调用方的责任限制变少,执行方(实现)的责任 加重(即兼容 各种参数情况),那么只需要一个契约执行方,就可以满足多种调用方的情况。

  即一个function/method实现,调用方多种情况来调用都是没问题的;

  我们也可以把这种实现成为健壮的实现;

 

Java则是强契约,好处不必多说,但是劣势对比弱契约也是很明显,调用方参数若是出现了另外一种类型或者参数变多/变少,则不得不重载(Overload),

如果业务复杂起来,重载方法写起来简直是恶心;

 

 

说道这里泛型横空出世,我们可以理解泛型其实就是在强契约和弱契约之间的一种折中,即Method契约不再死板地限制某个具体类型,也不死板地规定

返回某个具体类型,而是规定为某一系列的类型,即在强契约的上弱化了一些,将类型限制放宽。

 

 

使用了泛型的方法,则可以满足调用方的某一系列的参数类型情况,让我们少些重载方法,减少了代码量 :)

 

 

return ;

 

转载于:https://www.cnblogs.com/Joynic/p/6828590.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/488393.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何实现对外部php文件的调用,laravel如何引用外部文件

laravel如何引用外部文件,主视图,视图,文件,方式,内容laravel如何引用外部文件易采站长站,站长之家为您整理了laravel如何引用外部文件的相关内容。(1)、首先在app\Http\routes.php中定义路由;Route::get(view,ViewControllerview);Route::get(article,V…

清华大学人工智能深度报告:八大维度解析机器学习

来源:世界人工智能大会机器学习(Machine Learning,常简称为 ML)已经成为了当今的热门话题,从机器学习概念诞生到机器学习技术的普遍应用经过了漫长的过程,众多优秀的学者为推动机器学习的发展做出了巨大的贡…

python冷知识_Python 实用冷门知识整理

1.print 打印带有颜色的信息大家知道 Python 中的信息打印函数 print,一般我们会使用它打印一些东西,作为一个简单调试。但是你知道么,这个 Print 打印出来的字体颜色是可以设置的。一个小例子def esc(code0):return f\033[{code}mprint(esc(…

了解CSS核心精髓(一)

CSS 1.css外联 正确写法&#xff1a;<link rel"stylesheet" href"css/style.css" /> <style type"text/css"> import url(xxx.css); </style> 2.w3c盒子模型与IE盒子模型 W3C 盒子模型的范围包括 margin、border、padding、co…

php中$tpl= add_member_info ;什么意思,DEDECMS会员信息在个人模板info和index的调用问题...

会员信息在个人模板info和index的调用问题&#xff0c;好长时间没解决 论坛发帖没人回答 看了一晚上代码 自己解决了。会员个人空间 index.htm 、 listarticle.htm不能像infos.htm模板一样使用<?php echo GetEnumsValue(pfirst,$row[pfirst]); ?> 语句来调用自定义联动…

【周末阅读】5G时代新型基础设施建设白皮书

来源&#xff1a;智东西【导读】当今世界&#xff0c;新一代信息技术与经济社会深度交融&#xff0c;正引领全球新一轮科技革命和产业变革&#xff0c;其速度、广度、深度前所未有。加快 5G 商用和人工智能、工业互联网、物联网等新型基础设施建设是发挥投资关键作用&#xff0…

pandas取出某一列_Pandas高级运算 | apply与applymap方法详解

大家好&#xff0c;今天我们来聊聊pandas的一些高级运算。在之前文章中&#xff0c;我们介绍了panads的一些计算方法&#xff0c;比如两个dataframe的四则运算&#xff0c;以及dataframe填充Null的方法。今天这篇文章我们来聊聊dataframe中的广播机制&#xff0c;以及apply函数…

Protobuf使用规范分享

Protobuf使用规范分享 一、Protobuf 的优点 Protobuf 有如 XML&#xff0c;不过它更小、更快、也更简单。它以高效的二进制方式存储&#xff0c;比 XML 小 3 到 10 倍&#xff0c;快 20 到 100 倍。你可以定义自己的数据结构&#xff0c;然后使用代码生成器生成的代码来读写这个…

深度|​揭秘5G+AI时代的机器人世界!七大核心技术改变人类生活!

来源&#xff1a;电子工程世界AI 和 5G 与机器人技术结合&#xff0c;正在不断催生新的消费电子品类。AI 解决机器理解世界&#xff0c;以及人机交互的问题。5G 拓展机器人的活动边界&#xff0c;并为机器人提供更大的算力和存储空间&#xff08;云协作机器人&#xff09; 。根…

卡农 matlab,matlab 编的卡农

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼% Cripple Pachebels Canon on Matlab% Have fun fs 44100; % sample ratedt 1/fs; T16 0.125; t16 [0:dt:T16];[temp k] size(t16); t4 linspace(0,4*T16,4*k);t8 linspace(0,2*T16,2*k); [temp i] size(t4);[temp j] si…

点击按钮,缩放图片(img.width、img.style.width、img.offsetWidth)

前几天在慕课网上看到一个关于图片缩放的教学视频&#xff0c;因为当时对老师使用img.width,而不是使用img.style.width而感到奇怪&#xff0c;所以周末得空了&#xff0c;想来自己试着写出来&#xff0c;相关视频网址如下&#xff1a;http://www.imooc.com/video/1111&#xf…

sql怎么继续编辑已经保存的代码_某团购CMS的GETSHELL操作代码审计

作者&#xff1a;会上树的猪合天智汇 0x00 写点废话在渗透测试中&#xff0c;获取一个webshell应该是我们不屑的追求&#xff0c;今天要通过这个CMS从代码的角度看一下可利用的getshell的方法。这一次的代码审计需要借助工具来定位可能存在的漏洞点&#xff0c;选择Seay源代码审…

测温枪的工作原理全面解析,如何测出你的温度

来源&#xff1a;世界先进制造技术论坛内容来源&#xff1a;网络测温枪&#xff0c;学名是“红外线测温仪”或者“红外线辐射测温仪”。它的原理是&#xff1a;被动吸收目标的红外辐射能量&#xff0c;从而获得物体温度数值。这次疫情&#xff0c;让这个小东西一下子&#xff0…

mysql不要放docker,Docker从入门到放弃

本文将以比较简单的的方式让大家理解docker&#xff0c;以平时常用到的测试环境为主&#xff0c;从用开始&#xff0c;慢慢理解docker。0x00 用docker进行漏洞测试0x01 docker运行busybox0x02 Docker 搭建运行apache-php环境0x03 用Dockerfile自动化构建可ssh登陆的镜像0x04 Do…

二叉树02

为了加强记忆我又写了一遍二叉树的基本代码。比上一次多了一点点功能。 1 #include<stdio.h>2 #include<iostream>3 using namespace std;4 struct Bitree{//二叉树的结构 5 int val;6 Bitree *lchild,*rchild;7 };8 void creat(Bitree * &T)//创建树 …

一个对称性解释三个宇宙学难题;引力波碰撞会发光?粘液霉菌助力寻找宇宙网 | 一周科技速览...

来源&#xff1a;返朴撰文 &#xff1a;董唯元、杨凌、顾舒晨、洪俊贤、太阁尔、姜小满目 录1. 一个对称性解释三个宇宙学难题2. 引力波碰撞会发光&#xff1f;3. 粘液霉菌助力寻找宇宙网4. 听&#xff0c;是杂质原子的声音5. 更快了&#xff01;地球的大型生态系统在崩溃6. 究…

如何用python爬虫赚早餐_如何利用python爬虫挣钱

Python爬虫是用Python编程语言实现的网络爬虫&#xff0c;主要用于网络数据的抓取和处理&#xff0c;相比于其他语言&#xff0c;Python是一门非常适合开发网络爬虫的编程语言&#xff0c;大量内置包&#xff0c;可以轻松实现网络爬虫功能。那么使用python如何赚钱呢&#xff1…

一ElasticSearch安装启动

参考官方&#xff1a;https://www.elastic.co/downloads/elasticsearch 转载于:https://www.cnblogs.com/tangyongathuse/p/6840231.html

python中表达式4+0.5值的数据类型为_python中,数字类型计算

说明&#xff1a;今天在看python数字类型的操作&#xff0c;在此记录下。操作过程&#xff1a;1.数字的加减乘除>>> 2 24>>> 4 - 22>>> 2 - 4-2>>> 2 * 24>>> 2 / 2 #除法的结果会返回小数的结果&#xff0c;如果是整除&#xf…

结构化数据不应该被人工智能忘之脑后 !

来源&#xff1a;Ihab Ilyas在处理非结构化数据的问题上&#xff0c;人工智能和深度学习方法一直都表现出众且广为人知&#xff0c;无论是在自然语言处理、知识库自动构建&#xff0c;还是图像视频的识别和生成应用中&#xff0c;都有很多成熟案例。然而对于结构化数据的研究&a…