函数封装

Encapsulate Collection (封装集合)

冷暖自知 提交于 2019-12-06 21:12:20
Summary :有个函数返回一个集合。 让这个函数返回该集合的一个只读副本,并在这个类中提供添加 / 移除集合元素的函数 Motivation: 我们常常会在一个类中使用集合( collection ,可能是 array 、 list 、 set 或 vector )来保存一组实例。这样的类通常也会提供针对该集合的取值 / 设值函数。 但是,集合的处理方式应该和其他种类的数据略有不同。取值函数不该返回集合自身,因为这会让用户得以修改集合内容而集合拥有者却一无所悉。这也会对用户暴露过多对象内部数据结构的信息。如果一个取值函数确实需要返回多个值,它应该避免用户直接操作对象内所保存的集合,并隐藏对象内与用户无关的数据结构。至于如何做到这一点,视你使用的 java 版本不同而有所不同。另外,不应该为这整个结婚提供一个设置函数,但应该提供用以为集合添加 / 移除元素的函数。这样,集合拥有者(对象)就可以控制集合元素的添加和移除。 如果你做到以上几点,集合就被很好的封装起来了,这便可以降低集合拥有者和用户之间的耦合度。 Mechanics : 1. 加入为集合添加 / 移除元素的函数 2. 将保存集合的字段初始化为一个空集合。 3. 编译。 4. 找出集合设值函数的所有调用者。你可以修改那个设值函数,让它使用上述新建立的“添加 / 移除元素”函数;也可以直接修改调用端

面向过程编程&面向对象编程

淺唱寂寞╮ 提交于 2019-12-06 14:36:00
面向过程编程 Procedure Oriented Programming C语言是面向过程编程的,面向过程编程主要使用顺序、条件选择、循环三种基本结构来编写程序。 顺序:按照时间轴顺序完成每个处理; 条件选择:根据条件的成立与否执行不同的条件分支; 循环:根据一定的条件反复执行同样的代码; 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。 例如:洗衣机的洗衣功能:放水、洗涤、脱水、打干,按照一定的顺序执行功能:放水->洗涤->脱水->放水->洗涤->脱水->打干。 在早期计算机配置低、内存小为了节省内存空间,大都采用面向过程编程(以时间换空间)。 面向对象编程 Object Oriented Programming 面向对象编程语言:Objective-C、C++、Java 面向对象是一种编程方式,满足面向对象编程的语言,一般会提供类、封装、继承、多态等语法和概念来辅助我们进行面向对象编程。 所谓的面向对象就是将我们的程序模块化、对象化,把具体事物的特性属性和通过这些属性来实现一些动作的具体方法封装到一个类里面,然后创建实例对象,以对象作为程序的基本模块来进行软件的分析、设计和开发的一种思考方法。 面向对象的三大特征:继承、封装、多态 1. 继承 继承:A类继承B类,我们通常称A类为B类的子类,被继承的B类为A类的父类

如何封装一个带表单验证的 Vue的表单插件(一):起步

为君一笑 提交于 2019-12-06 10:42:53
缘起 以前做Vue项目,经常需要用到表单验证,当时为了项目的速度,为了更好的交互和上线之后更稳定的性能,一直使用的都是 VeeValidate 确实很好用很强大,但是复杂的英文API的确也在开发中给我带了一定的困难,再加上项目上的需求或多或少和插件有一点点的差别,去看源码修改插件这种事情对我这个菜鸟压力太大~~;一直痛并快乐着。 在闲鱼时间,一直希望可以系统学习一下如何封装一个form表单插件,一方面解决工作上面的痛点,一方面可以牢固所学知识。 ?????????????????????????????????????????????????????????? 效果 下面的动图就是我最近学习写出来的效果,功能简单,但也因此,容易应对不通项目需求更快速的做出适当定制~ 分析与准备 form表单组件属于基础组件( 不包含任何业务逻辑 只包含某种独立功能的组件,比如模态框、日历插件也是基础组件,这种组件适用于大多数项目,通过高度抽象的API 和可定制化选项匹配大多数项目 ) 所以说,我们不能在form表单组件里面出现业务逻辑,它要适用于绝大多数的需要表单校验的地方,在这个表单组件里,我们使用 异步表单验证插件 async-validator 。很多大型的UI框架都是使用这个插件,使用比较简单,大家可以直接去GitHub上面查看使用文档。 拆分 封装一个基础组件,一定要记住一个词 单一职责

封装、继承、多态

谁都会走 提交于 2019-12-06 07:03:53
封装是面向对象的三大特性之一 封装指的是隐藏对象中的一些不希望被外部所访问的属性或方法 如果隐藏一个对象中的属性? 将对象的属性名,修改为一个外部不知道的名字 如何获取(修改)对象中的属性? 需要提供一个getter和setter方法使外部可以访问到属性 getter 获取对象中指定属性(getter_属性名) setter 用来设置对象中指定属性(setter_属性名) 使用封装,确实增加了类的定义的复杂程度,但是它也确保了数据的安全性 隐藏了属性名,使用调用者无法随意的修改对象的属性确保了数据的安全性 增加了getter和setter方法,很好的控制了属性是否是只读的 如果希望属性是只读的,则可以直接去掉setter方法 如果希望属性不能被外部访问,则可以直接去掉getter方法 使用setter方法设置属性,可以增加数据的验证,确保数据的值是正确的。 使用getter方法获取属性,使用setter方法设置属性 可以在读取属性和修改属性的同时做一些其他的处理 使用getter方法可以表示一些计算的属性 class Dog:'''表示狗的类''' def __init__(self,name): self.hidden_name = name def say_hello(self): print('大家好,我是%s'%hidden_name) def get_name(self)

python pickle 模块的使用

 ̄綄美尐妖づ 提交于 2019-12-06 05:34:12
python pickle 模块的使用 用于序列化的两个模块   json:用于字符串和Python数据类型间进行转换   pickle: 用于python特有的类型和python的数据类型间进行转换   json提供四个功能:dumps,dump,loads,load   pickle提供四个功能:dumps,dump,loads,load pickle可以存储什么类型的数据呢? 所有python支持的原生类型:布尔值,整数,浮点数,复数,字符串,字节,None。 由任何原生类型组成的列表,元组,字典和集合。 函数,类,类的实例 pickle模块中常用的方法有: 1. pickle.dump(obj, file, protocol=None,) 必填参数obj表示将要封装的对象 必填参数file表示obj要写入的文件对象,file必须以二进制可写模式打开,即“wb” 可选参数protocol表示告知pickler使用的协议,支持的协议有0,1,2,3,默认的协议是添加在Python 3中的协议3。    Protocol version 0 is the original “human-readable” protocol and is backwards compatible with earlier versions of Python. Protocol version 1

es6 最新函数封装(简易版)

三世轮回 提交于 2019-12-06 04:15:28
map封装: Array.prototype.map=function(fn){ var arr=this; var newArr=[] for(var i=0;i<arr.length;i++){ var ele=fn(arr[i],i); newArr.push(ele); } return newArr; } reduce封装: Array.prototype.reduce=function(fn,init){ var arr=this; for(var i=0;i<arr.length;i++){ init=fn(init,arr[i],i); } return init; } some封装: Array.prototype.some=function(fn){ var arr=this; for(var i=0;i<arr.length;i++){ var flag=fn(arr[i],i); if(flag){ return true; break; } } return false; } every封装: Array.prototype.every1=function(fn){ var arr=this; for(var i=0;i<arr.length;i++){ var flag=fn(arr[i],i); if(!flag){ return false;

设计模式之美学习(三):封装、抽象、继承、多态分别可以解决哪些编程问题?

主宰稳场 提交于 2019-12-06 03:28:01
理解面向对象编程及面向对象编程语言的关键就是理解其四大特性:封装、抽象、继承、多态。不过,对于这四大特性,光知道它们的定义是不够的,我们还要知道每个特性存在的意义和目的,以及它们能解决哪些编程问题。 封装(Encapsulation) 封装也叫作信息隐藏或者数据访问保护。类通过暴露有限的访问接口,授权外部仅能通过类提供的方式(或者叫函数)来访问内部信息或者数据。 对于封装这个特性,我们需要编程语言本身提供一定的语法机制来支持。这个语法机制就是 访问权限控制 。 private 、 public 等关键字就是 Java 语言中的访问权限控制语法。 private 关键字修饰的属性只能类本身访问,可以保护其不被类之外的代码直接访问。如果 Java 语言没有提供访问权限控制语法,所有的属性默认都是 public 的,那任意外部代码都可以通过类似 wallet.id=123 ; 这样的方式直接访问、修改属性,也就没办法达到隐藏信息和保护数据的目的了,也就无法支持封装特性了。 封装的意义是什么?它能解决什么编程问题? 如果我们对类中属性的访问不做限制,那任何代码都可以访问、修改类中的属性,虽然这样看起来更加灵活,但从另一方面来说,过度灵活也意味着不可控,属性可以随意被以各种奇葩的方式修改,而且修改逻辑可能散落在代码中的各个角落,势必影响代码的可读性、可维护性

多条件过滤引发的那些小小疑虑

怎甘沉沦 提交于 2019-12-06 02:58:15
对于希望将 java 作为毕生事业的来说,掌握 java 基础知识是远远不够的,还需要在各种实战项目中提升能力, JavaWeb 项目实战的重要性不言而喻,接下来,我就为你分享一下关于 JavaWeb 项目中多条件过滤相关的内容,希望可以帮到你。 分页查询 需求分析:在列表页面中,显示指定条数的数据,通过翻页按钮完成首页/上一页/下一页/尾页的查询 数据分析: 通过观察,页面上需要显示下面的几个数据: 当前页:currentPage 页面大小:pageSize 总页数:totalPage 首页:1 上一页:prevPage 下一页:nextPage 尾页:endPage 总条数:totalCount 结果集:result 那么,我们应该如何方便快速的将这多个数据共享到页面上呢?答案是:封装 我们应该将这几个参数封装到一个对象中,然后共享这个对象即可,所以,我们有了下面这个类 @Getterpublic class PageResult { public static final PageResult EMPTY_RESULT = new PageResult(Collections.EMPTY_LIST, 0, 1, 3); //1:两传 private int currentPage; private int pageSize; //2:两查 private List<?>

JavaWeb项目之多条件过滤

瘦欲@ 提交于 2019-12-06 02:57:04
相信很多同学在学习 java 基础之后,面对各种项目还是相当头疼,那今天我将手把手教你学会 JavaWeb 项目中的多条件过滤,希望你能在与我实战的过程中积累经验,更进一步。 分页查询 需求分析 : 在列表页面中 , 显示指定条数的数据 , 通过翻页按钮完成首页 / 上一页 / 下一页 / 尾页的查询 数据分析 : 通过观察 , 页面上需要显示下面的几个数据 : 当前页 :currentPage 页面大小 :pageSize 总页数 :totalPage 首页 :1 上一页 :prevPage 下一页 :nextPage 尾页 :endPage 总条数 :totalCount 结果集 :result 那么 , 我们应该如何方便快速的将这多个数据共享到页面上呢 ? 答案是 : 封装 我们应该将这几个参数封装到一个对象中 , 然后共享这个对象即可 , 所以 , 我们有了下面这个类 @Getterpublic class PageResult { public static final PageResult EMPTY_RESULT = new PageResult(Collections.EMPTY_LIST, 0, 1, 3); //1:两传 private int currentPage; private int pageSize; //2:两查 private List<?>

vuex封装购物车函数

谁说我不能喝 提交于 2019-12-06 02:56:43
js import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) export default new Vuex.Store({ state:{ shopCart:[], allChecked:false }, mutations:{ setShopCart(state,obj){ state.shopCart.push(obj); }, calcUp(state,index){ state.shopCart[index].Num == state.shopCart[index].total?state.shopCart[index].total : state.shopCart[index].Num++ }, calcDown(state,index){ state.shopCart[index].Num == 0?0 : state.shopCart[index].Num-- }, ShopVal(state,index){ var shopVal = state.shopCart[index].Num; shopVal = isNaN(shopVal)? 0 : Math.ceil(shopVal); shopVal = shopVal<0?0:shopVal; shopVal = shopVal>state