高内聚、低耦合是软件设计中非常关键的概念。在面向对象程序设计中类的划分时,类的内聚性越高,其封装性越好,越容易复用。以下在类划分时关于内聚性的问题。

  1. 静态类的设计
    在软件设计中,我们经常会将一些通用的方法封装到一个类中,这种类只包含方法,没有属性,类中的方法之间没有关联,内聚性最低,属于偶然内聚或巧合内聚。这种设计常用于工具类,一般设计为静态类,这些方法的使用时类似函数调用。设计需注意,将功能基本接近的方法封装到一个类中,切忌不能将所有的公用方法封装到一个大类中,如:日期格式转换,数字转换字符串等。

  2. 高内聚类的设计
    高内聚类的设计时,按照操作功能进行封装,需遵循单一职责原则,即每一个类完成规定的某一项任务。如:dao层的类用作数据的增删改查(CRUD),数据实体仅为数据载体,用作传递数据任务。即每个封装的类仅完成一项任务。
    又如迭代器模式中迭代器仅为某一个集合进行服务,但是还要独立出来一个内部类,就是把集合数据的表示和对集合的遍历操作两项任务分开。
    低耦合代表高内聚,在进行类的设计时,如类A的方法中调用了B类的方法,在A类定义属性变量或局部对象变量时,使用B类接口定义,通过注入或方法参数传入B的对象,使得二者之间形成一种松耦合的关系。如果一个类对外暴露的接口简单,接口的参数为简单数据类型,所有的复杂操作封装在类的内部,这种类内聚性最高,独立性强。如:通过短信猫发送短信,对外接口仅为sendMsg(String msg),如何创建连接、格式转换、信息发送全部封装类的内部。

附:面向过程编程中模块的内聚性
以下是面向过程中内聚性由高到低做一说明,对类划分时有一定的参考意义。

  1. 偶然内聚或巧合内聚(Coincidental):内内的各成分之间没有关联,只是把分散的功能合并在一起;类A内有BCDE四个方法,这四个方法均为public方法,功能含义上各自独立。前端开发api,将不同模块的api放在一起,就是偶然耦合。
var api = {//登录getCaptcha: (param) => get(apiBase+"/captcha.jpg", param), adminLogin: (param) => post(apiBase+"/sys/login", param),//部门管理departmentList:(param) => get(apiBase+"/tywdepart/list", param),departmentAdd:(param) =>post(apiBase+"/tywdepart/save", param),departmentUpdate:(param) =>post(apiBase+"/tywdepart/update", param),departmentDelete:(param) =>post(apiBase+"/tywdepart/delete", param),}

增强耦合度办法:拆分;将登录api要使用的api和部门管理api设计为两个独立的api。
2. 逻辑内聚(Logical):若干个逻辑相似的功能通过参数确定该模块对应哪一个功能。如:类A内有BCDE四个方法,这四个方法均为public方法,功能上类似,把它们封装在一起,如字符串转换函数工具类,包括int转字符串、double转字符串等。
3. 时间内聚(Temporal ): 因为功能必须在同一时间内执行才写到一个模块,即这些功能只是因为时间因素才有关联。 例:程序初始化时,程序员把对所有全局变量的初始化操作放在模块A中,模块A中就是时间内聚。
4. 过程内聚:模块内部的处理成分是相关的,而且这些处理必须以特定的次序进行执行。一个模块,为某员工计算工龄工资:打开员工信息文件取出员工记录;按一定的算法计算工 龄;按一定的算法计算工龄工资。 该模块中的三个相对独立的子功能必须以特定次序执行,整个模块具有过程内聚
5. 通信内聚(Communicational):所有处理元素集中在一个数据结构的区域上。一个模块,接收一个远程传来的信息文件,保存,同时马上打印该文件。 该模块针对同一个文件操作,打印和存盘操作没有前后顺序关系,整个模块具有通信内聚。
6. 顺序内聚(Sequential):模块内的各个处理元素关注同一功能,顺序执行,前一元素的输出结果作为下一元素的输入。
7. 功能内聚(Functional):类内所有的功能成分均为了完成一项功能服务的,如:userDao都是为了完成用户数据库的增删改查(CRUD)服务的。

面向过程编程中模块的内聚性参考:
https://www.cnblogs.com/corvoh/p/5747856.html

面向对象编程类的内聚性相关推荐

  1. 面向对象编程——类和对象

    面向对象编程 类和对象 类(Class):用来描述具有相同属性和方法的对象的集合 class Student:name='stu'#属性def say(self):#方法print("hel ...

  2. Python中的面向对象编程(类编程)由简单到复杂的示例代码

    关于本文代码中的self的含义,大家可参考下面这篇博文: https://blog.csdn.net/wenhao_ir/article/details/125384347 另:说明一下,本博文中&q ...

  3. java class对象创建时机_Java面向对象编程-类的声明周期

    第十章 类的生命周期 10.1 Java虚拟机及程序的生命周期 当通过java命令运行一个Java程序时,就启动了一个Java虚拟机进程.Java虚拟机进程从启动到终止的过程,称为Java虚拟机的生命 ...

  4. 【Python基础知识-pycharm版】第八节-面向对象编程/类

    面向对象编程 面向对象和面向过程的区别_执行者思维_设计者思维 类的定义 构造函数__init__ 实例属性_内存分析 实例方法_内存分析 类对象 类属性_内存分析创建类和对象的底层 类方法_静态方法 ...

  5. python的类和实例_Python 面向对象编程——类和实例

    1面向对象编程 面向对象编程: 面向对象编程--Object OrientedProgramming OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机程 ...

  6. python多个对象调用类方法、且之间有联系_趣味解读Python面向对象编程 (类和对象)...

    一.面向对象简介 考虑现实生活中,我们的思维方式是放在学生这个个人上,是学生做了自我介绍.而不是像我们刚刚写出的代码,先有了介绍的行为,再去看介绍了谁. 用我们的现实思维方式该怎么用程序表达呢? 面向 ...

  7. python编程例子-Python面向对象编程 - 类和实例

    一.preface 面向对象编程OOP:object oriented programming. OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数.Python是一门面向对象的编程语 ...

  8. [转] 面向对象编程 - 类和实例

    面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的"对象",每个对象都拥有相同的 ...

  9. Python面向对象编程——类的学习

    面向对象编程     面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向 ...

最新文章

  1. 腾讯爬虫python_Python爬虫,爬取腾讯漫画实战
  2. Object对象具体解释(二)之clone
  3. java jigsaw_Java 9,Jigsaw,JPMS和模块:个人探索
  4. 程序员最常用的7大编程实战网站,阿里腾讯面试题也用它!
  5. android文件管理器项目,浅析Android文件管理器(项目一)
  6. Python精通-Python函数使用
  7. c语言 pdf支持库,解决支持库版本兼容问题:引入包时候support包有红色下划线
  8. WCF中NetTCp配置
  9. python实现葵花8号(Himawari-8)的WLF数据自动下载与数据库导入
  10. CSS3:boder-radius
  11. 数据执行保护呈灰色无法开启 用命令BCEDIT无效 请问怎么解决?
  12. BUUCTF Misc 弱口令 [RoarCTF2019]黄金6年 小易的U盘 [WUSTCTF2020]alison_likes
  13. 视频教程-嵌入式Linux驱动教程(韦东山2期)-驱动/内核开发
  14. 实名域名是什么意思?域名必须要进行实名认证吗?
  15. mp4 转 m3u8 java_java下载m3u8转ts合成mp4
  16. pair及pair在vector中的使用
  17. Win10 新版Edge浏览器Flash Player不兼容,总是显示flash与地区不兼容(完美解决)
  18. loopj----Android Asynchronous Http Client(AHC)
  19. k1658停运_武汉局集团公司近期临时停运列车的公告
  20. Java面试题基础系列228道(2),查漏补缺

热门文章

  1. win32打印机控制,API打印操作
  2. PointNet系列论文解读
  3. Puppet standalone
  4. 七日杀服务器可以修改吗,七日杀如何更改游戏设置 | 手游网游页游攻略大全
  5. 微信硬件蓝牙开发指南
  6. 简述什么是jsp,以及jsp的特点和功能+简述JSTL及其作用
  7. php实用技术:制作购物车页面
  8. 老王赛马!!!(题目有漏洞哦)
  9. 在python中经常出现无法导入自己写的库文件的问题
  10. 使用Maven和WTP开发WEB项目。