函数封装

Encapsulate Field (封装字段)

筅森魡賤 提交于 2020-03-02 01:47:38
Summary : 你的类中存在一个 public 字段。 将它声明为 private ,并提供相应的访问函数。 动机: 面向对象的首要原则之一就是封装,或者成为“数据隐藏”。按此原则,你绝不应该将数据声明为 public ,否则其他对象就有可能访问甚至修改这项数据,而拥有该数据的对象却毫无察觉。于是,数据和行为就被分开了 — 这可不是件好事。 数据声明为 public 被看做是一种不好的做法,因为这样会降低程序的模块化程度。数据和使用该数据的行为如果集中在一起,一旦情况发生变化,代码的修改就会比较简单,因为需要修改的代码都集中于同一块地方,而不是星罗棋布地散落在整个程序中。 Encapsulate Field 是封装过程的第一步。通过这项重构手法,你可以将数据隐藏起来,并提供相应的访问函数。但它毕竟只是第一步。如果一个类除了访问函数外不能提供其他行为,它终究只是一个哑巴类。这样的类并不能享受对象技术带来的好处。而你知道,浪费任何一个对象都是很不好的。实施 Encapsulate Field 之后,我会尝试寻找用到新建访问函数的代码,看看是否可以通过简单的 Move Method 轻快地将它们移到新对象去。 做法: 1. 为 public 字段提供取值 / 设值函数。 2. 找到这个类以外使用该字段的所有地点。如果客户只是读取该字段,就把引用替换为对取值函数的调用

Self Encapsulate Field (自封装字段)

丶灬走出姿态 提交于 2020-03-01 23:58:21
Summary: 你直接访问一个字段,但与字段之间的耦合关系逐渐变得笨拙。 为这个字段建立取值/设值函数,并且只以这些函数来访问字段。 Motivation: 间接访问变量的好处是,子类可以通过覆写一个函数而改变获取数据的途径;它还支持更灵活的数据管理方式,例如延迟初始化。直接访问变量的好处则是:代码比较容易阅读。 如果你想访问超类中的一个字段,却又想在子类中将对这个变量的访问改为一个计算后的值,这就是最该使用Self Encapsulate Field的时候。“字段自我封装”只是第一步。完成自我封装后,就可以在子类中根据自己的需要随意覆写取值/设值函数。 Mechanics: 1. 为带封装字段建立取值/设值函数。 2.找出该字段的所有引用点,将它们全部改为调用取值/设值函数。 如果引用点要读取字段值,就将它替换为调用取值函数;如果引用点要给字段赋值,就将它替换为调用设置函数。 你可以暂时将该字段改名,让编译器帮助你查找引用点。 3.将该字段声明为private。 4.复查,确保找出所有引用点。 5.编译,测试。 使用本项重构时,你必须小心对待“在构造函数中使用设值函数”的情况。一般来说,设值函数被认为应该在对象创建后才使用,所以初始化过程中的行为有可能与设值函数的行为不同。这种情况下,我们可以在构造函数中直接访问字段或者单独另建一个初始化函数。 来源: oschina 链接:

PHP 之文件上传类封装

半腔热情 提交于 2020-03-01 18:12:32
一、前端代码 <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"/> <title>文件上传</title> </head> <body> <form action="do.php" method="post" enctype="multipart/form-data"> <input type="file" name="file" value=""><br> <input type="submit" value="上传文件"/><br> </form> </body> </html> 二、php代码 <?php /** * Created by PhpStorm. * User: Yang * Date: 2019/8/13 * Time: 14:02 */ include_once "./Upload.php"; $upload = new Upload(); if (!$upload->uploadFile("file")) { echo $upload->errorInfo; } 三、类库代码 <?php /** * Created by PhpStorm. * User: Yang * Date: 2019/8/13 * Time: 13:49 */ class Upload { //文件上传路径

Python3函数之装饰器

℡╲_俬逩灬. 提交于 2020-03-01 10:45:05
不带参数的装饰器 from functools import wraps # 封装函数进行装饰,保留被装饰函数属性 def zsq(sc): # 设计一个装饰器函数,传入被装饰函数 @wraps(sc) def nsc(*args, **kwargs): # 设计它的封装 jg = sc(*args, **kwargs) # 调用被装饰函数,配合百搭 print('nsc function.') print(jg) return 0 return nsc @zsq def zzsc(): # 设计最终函数,也当做sc被装饰,这里百搭参数 '''zzsc...''' print('sc function.') return 1 # 返回值 # 定义过程: # 设计zzsc为被装饰函数,并作为输入函数参数被传入装饰器 # 装饰器封装一个函数,并传入百搭参数 # 装饰器返回封装函数,并把最终函数指向封装函数, # 这时候最终函数的参数(百搭参数) #执行过程: # 调用最终函数,传入百搭参数 # 执行封装函数。。 # 执行被装饰函数 #PS: # 装饰器的返回值肯定是封装函数 # 最终函数|被装饰函数的返回值,用于供封装函数可能使用 # 封装函数的返回值会成为最终函数的返回值被返回 装饰器的本质是函数,接收一个函数作为参数,并且返回一个函数 装饰器通常会返回一个封装函数

JavaScript函数封装随机验证码

微笑、不失礼 提交于 2020-03-01 09:54:53
JavaScript函数封装随机验证码 数字 大小写字母组成的4位数值验证码 1.首先第一步,我们需要定义一个变量,把所有的数字和大小写字母设定为一个字符串 let str = ‘0123456789QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm’; 2.用 split( ) 方法把字符串分割为数组,定义一个变量来接收 let arr = str.split(’ '); 3.重新定义一个空的字符串,用循环的方式来接收验证码 let newStr = ’ '; 此时需要几位数值的验证码 i 的值就少于几 然后乘以数组 arr 的长度 随机一个数字,作为数组arr的下标 把arr[随机数字(下标)],循环赋值给空的字符串 for(let i = 0; i < 4; i++){ newStr += arr[parseInt(Math.random()*arr.length)]; } 此时的 newStr 就是一个随机出来的4位数值的验证码 4.把写好的代码放进一个函数封装起来,就可以方便随时调用了,是不是很简单啊 以下是整个代码块: function code(){ let str = '0123456789QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm'; let arr

微信分享代码封装

巧了我就是萌 提交于 2020-02-29 05:43:30
wxShare.js (function(){ var wxShare = function(opts){ var defaults = { getWxConfigUrl: '', // 获取微信接口权限url orDebug: false, // 是否开启调试模式 title: '', // 分享标题 desc: '', // 分享描述 wxUrl: '', // 参与签名的url link: '', // 分享链接 imgUrl: '', // 分享图标 success: function(){}, // 用户确认分享后执行的回调函数 cancel: function(){} // 用户取消分享后执行的回调函数 }; var _opts = $.extend(defaults, opts); // 获取微信权限 $.ajax({ url: _opts['getWxConfigUrl'], type: 'POST', dataType: 'json', data: {share_url: _opts['wxUrl']}, }) .done(function(res) { if(typeof res == 'object'){ // 通过config接口注入权限验证配置 wx.config({ // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数

函数式 Python 中的 Pipe 与 itertools

萝らか妹 提交于 2020-02-28 17:53:59
1、迭代器与管道函数式编程简介 可迭代器(iterable),不仅限于list/str等,还包括任何包含有yield关键字的函数,后者未必有规律的迭代特征。标准库中的itertools包提供了更加灵活的产生迭代器的工具,这些工具的输入大都是已有的迭代器函数的封装,并且itertools给出的函数都是针对广义迭代器而言。而len()等函数是针对狭义迭代器,即sequence(i.e. str, list, tuple)而言的。 以内置函数range()为例,执行结果会是一次性计算好整个序列。这对于很长的序列来说会比较耗时,甚至带来性能问题。因而,python还提供了内置函数,提供了惰性求值版本,那就是xrange()。它利用yield特性,第一次执行时仅仅返回迭代器,不到用时是不会求值的。 实际上,itertools提供的函数都是惰性的,并且给原内置函数都重写了惰性版本。如imap()对于内置的map()。 扩展库Pipe则对内置函数和部分itertools进行了封装,提供了类似unix bash下的管道式调用风格,更接近人类从左到右的阅读习惯,使得代码更加优雅。其他动态语言,如ruby, c#-lambda java8-lambda也都提供了类似的 链式调用 形式。 另外,也提供了@Pipe装饰器,可以非常方便地扩展出自己的管道函数,或者继续封装其他itertools中的有用函数。

Frida功能封装(二)

社会主义新天地 提交于 2020-02-28 14:36:21
一、封装库 (1).hook jni函数调用 https://github.com/Areizen/JNI-Frida-Hook 二、自己封装 function str2ArrayBuffer(str) { var buf = new ArrayBuffer(str.length); // 1 bytes for each char var bufView = new Uint8Array(buf); for (var i=0, strLen=str.length; i < strLen; i++) { bufView[i] = str.charCodeAt(i); } return buf; } 来源: CSDN 作者: jinangl 链接: https://blog.csdn.net/jinangl/article/details/104550691

python库收集

人走茶凉 提交于 2020-02-27 02:14:22
Requests.Kenneth Reitz写的最富盛名的http库。每个Python程序员都应该有它。 Scrapy.如果你从事爬虫相关的工作,那么这个库也是必不可少的。用过它之后你就不会再想用别的同类库了。 wxPython.Python的一个GUI(图形用户界面)工具。我主要用它替代tkinter。你一定会爱上它的。 Pillow.它是PIL(Python图形库)的一个友好分支。对于用户比PIL更加友好,对于任何在图形领域工作的人是必备的库。 SQLAlchemy.一个数据库的库。对它的评价褒贬参半。是否使用的决定权在你手里。 BeautifulSoup.我知道它很慢,但这个xml和html的解析库对于新手非常有用。 Twisted.对于网络应用开发者最重要的工具。它有非常优美的api,被很多Python开发大牛使用。 NumPy.我们怎么能缺少这么重要的库?它为Python提供了很多高级的数学方法。 SciPy.既然我们提了NumPy,那就不得不提一下SciPy。这是一个Python的算法和数学工具库,它的功能把很多科学家从Ruby吸引到了Python。 matplotlib.一个绘制数据图的库。对于数据科学家或分析师非常有用。 Pygame.哪个程序员不喜欢玩游戏和写游戏?这个库会让你在开发2D游戏的时候如虎添翼。 Pyglet.3D动画和游戏开发引擎

CoppeliaSim/Vrep Remote API 封装

那年仲夏 提交于 2020-02-26 20:12:56
自己把CoppeliaSim remote API 中的部分函数封装了类,可以完成机器人的关节空间控制,以及笛卡尔空间控制。 VS2017 和 CoppeliaSim/Vrep 的配置参见我的博客: CoppeliaSim Remote API 实操 关节空间控制,需在CoppeliaSim/Vrep中关闭逆运动学,笛卡尔空间控制开启逆运动学。 下面是头文件,全部文件请在下方链接下载:(包括VS的永久配置文件,需按照自己文件的路径稍作修改) https://download.csdn.net/download/qq_29696095/12192775 // Copyright SJTU // author Li Wang 05liwang@sjtu.edu.cn 935342669@qq.com // this file is used to wrap the legacy remote API of CoppeliaSim // all the unit of data from coppeliasim is m or s or N or deg // orientation is euler anles, alpha, beta and gamma // T = rotx(a)*roty(b)*rotz(g) # ifndef COPPELIA_H_ # define