第十章 类

第十章 类

10.1 类的组织

  • 类的组织应该从一组变量开始;首先是公有静态变量,之后私有静态变量,以及私有实体变量;很少会有公共实体变量;
  • 公共函数应该跟在变量之后;
  • 公共函数调用的私有工具函数紧随其后;

封装

  • 尽可能保持变量和工具函数的私有性;
  • 当测试需要访问时,可以将变量和工具函数设为protected属性,方便访问;
  • 对于该种变量和工具函数最低要使其为protect或者仅包内可以访问;

10.2 类应该短小

  • 类应该短小,权责单一
  • 当不对一个类进行精确命名时,表明该类权责多余一个,而类就太长了;

10.2.1 单一权责原则

  • 类或者模块应该有且只有一条修改的理由;
  • 再次强调代码能够正常工作不是编码的终点,对其进行组织和重构才是最后一步;
  • 对于达到一定规模的系统包含大量的逻辑和复杂性;加以组织就能够方便开发者在哪找到东西和理解需要的东西;

10.2.2 内聚

  • 所谓内聚是指类中的方法基本围绕在类的变量进行操作,与外界很少接触;这样的类方法具有高内聚;
  • 如果类中变量被每一个方法使用,该类具有最高德内聚性;
  • 高内聚表明方法与变量相互依赖,相互结合成一个逻辑整体;

10.2.3 保持内聚性就会得到许多短小的类

  • 当存在一个较长的函数时,将函数分节为多个小函数;将原函数中声明的变量提升为实体变量;但这样存在这样的问题,实体变量只被部分方法使用,降低了类的内聚性(理由见上一节);
  • 当内聚点分散时,就是将每个内聚点拆分成一个类;程序会更加有组织,也会拥有更为透明的组织;
  • 例程PrimePrinter(素数打印)中,将类分为三个部分;主程序(负责环境搭建)、素数获取、数据输出;

10.3 为了修改而组织

  • 对于上述类,当增加一个新方法时需要修改此类;当修改类方法时,需要修改此类;所以权责不单一;
  • 解决方法是从每一个方法派生一个类;

  • 类的修改与功能增加都互不影响,遵循单一权责原则;
  • 此外遵循开放-闭合原则:对扩展开放,对修改封闭;

隔离修改

  • 通过抽象类和接口来隔离修改;
  • 将外部的细节的不确定性固定在封装的抽象类或者接口中,当细节修改时,直接修改封装,自己的代码不会和细节纠缠在一起;

  • 降低链接度,是另一个设计原则,依赖倒置原则(Dependency Inversion Principle,DIP);类应当依赖于抽象而不是具体细节;
基于python实现的粒子群的VRP(车辆配送路径规划)问题建模求解+源码+项目文档+算法解析,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 算法设计的关键在于如何向表现较好的个体学习,标准粒子群算法引入惯性因子w、自我认知因子c1、社会认知因子c2分别作为自身、当代最优解和历史最优解的权重,指导粒子速度和位置的更新,这在求解函数极值问题时比较容易实现,而在VRP问题上,速度位置的更新则难以直接采用加权的方式进行,一个常见的方法是采用基于遗传算法交叉算子的混合型粒子群算法进行求解,这里采用顺序交叉算子,对惯性因子w、自我认知因子c1、社会认知因子c2则以w/(w+c1+c2),c1/(w+c1+c2),c2/(w+c1+c2)的概率接受粒子本身、当前最优解、全局最优解交叉的父代之一(即按概率选择其中一个作为父代,不加权)。 算法设计的关键在于如何向表现较好的个体学习,标准粒子群算法引入惯性因子w、自我认知因子c1、社会认知因子c2分别作为自身、当代最优解和历史最优解的权重,指导粒子速度和位置的更新,这在求解函数极值问题时比较容易实现,而在VRP问题上,速度位置的更新则难以直接采用加权的方式进行,一个常见的方法是采用基于遗传算法交叉算子的混合型粒子群算法进行求解,这里采用顺序交叉算子,对惯性因子w、自我认知因子c1、社会认知因子c2则以w/(w+c1+c2),c1/(w+c1+c2),c2/(w+c1+c2)的概率接受粒子本身、当前最优解、全局最优解交叉的父代之一(即按概率选择其中一个作为父代,不加权)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值