C++学习笔记----4、用C++进行程序设计(二)---- 活在类的世界里

2024-08-21 12:36

本文主要是介绍C++学习笔记----4、用C++进行程序设计(二)---- 活在类的世界里,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        从面向过程思维过渡到面向对象的程序员经常会经历一个将属性与行为转变为类的顿悟。有些程序员会重新审视程序设计,重新将代码写成类。另外的程序员可能会将原有代码全部扔掉,开始一个全新的面向对象的应用程序项目。

        有两个用类开发软件的主要方法。对于有些人来说,类只是简单地数据与函数加了一层外表好看的包装。这些程序员在程序中用类加以点缀,使代码易读并且易于维护。使用这种方法的程序员将他们的代码分成独立的片断,像外科医生给病人加起搏器一样,用类来替换这些独立的片断。严格意义上来讲,这种方法也没有错,并且给那些从面向过程思维过来的同学当作入门OOP的圭臬。这些同学把类看成了一个在许多情况下有好处的工具。程序的有些部分就是“感觉像一个类”,比如股票报价。这些都是可以被独立并且用真实世界的词语来进行描述的。

        另外的程序员完全吸收OOP的思想,将所有的东东都转换成类。在他们的思维中,有些类与真实世界的东东相呼应,比如桔子或者股票报价,而其他的包装了更抽象的概念,比如排序器或者撤消类。

        理想的方法可能介于这两个极端之间。一开始,面向对象的程序可能就是带有几个类的传统的面向过程的程序。或者也许你竭尽全力,把一切都变成了类,从将int变成类,再到将整个应用都变成类。随着时间的推移,你会找到一个快乐的解决办法。

1、过度类化

        在设计一个有生命力的面向对象的系统与将所有的小东东都变成类惹恼了所有人之间有一条线。就像Freud过去常说的,一个变量就是一个变量。好吧,这是他说的意思。

        也许你要设计下一款畅销的一字棋游戏。这次,你准备全部用OOP,然后你坐下来,倒上一杯咖啡,在笔记本上画出类与对象的草图。像这类游戏,总是会有一个类统观全局,能够检测到胜者。先要有棋盘,你可能会想象出一个Grid的类来跟踪棋子和他们的位置。实际上,grid的一个部分可以是Piece类来代表X或者O。

        稍等,稍等,这个设计提出了用一个类来代表X或O的方案。这可能就是进行了类的过度设计。毕竟,用一个char来代表X或者O不也可以吗?还有,为什么Grid不用一个枚举类型的二维数组?Piece类不是将代码复杂化了吗?我们来看一下代表提出的piece类的表格:

关联部件属性行为
PieceX或O

        这个表是否有一点空,给我们强烈的暗示,我们现在做的太细粒度了,对于一个成熟的类来说。

        另外,具有先进思想的程序员可能会争论说,目前来说,虽然piece类看起来有一点瘦弱,但把它设计成类有利于将来的无缝扩展。也许在开发的过程中,可能要加上像piece的颜色这样的属性,或者piece是不是最近移动过。

        另外的解决方案是用一个棋盘格的state而不是用piece。棋盘格的状态可以为空、X或O。为了便设计易于将来无缝扩展,可以设计一个抽象的基础类state,然后生成具体的继承类StateEmpty,StateX和StateO。用这样的设计,将来可以在基础类或者具体类上添加另外的属性。

        很明显,没有金科玉律。关键点在于设计应用程序时应该考虑到这些问题。记住,类的存在是为了帮助程序员管理其代码。如果类只用于使代码看起来更面向对象,那一定是有些地方出错了。

2、过于通用的类

        也许更令人气愤的是那些不应该设计成类的类太通用了。所有以像桔子作为例子开始学习OOP的同学--这个嘛,确实是类,没有问题。而在现实世界中的代码,类可能很抽象。许多OOP的程序有一个“应用类”,而不管应用真的不是你能想象得到的以物质形式存在的什么东东。只是因为应用自身有特定的属性与行为,把应用用类来代表可能是有帮助的。

        过于通用的类并不代表任何特定的事物。程序员可能想要让类更灵活,重用性好,结果就是生成了一个令人非常迷惑的类。例如,假如有一个组织显示媒体的程序,可以把照片进行分类,组织你的数字音乐与电影集,服务于个人日志。过于通用的方法就是把这些东东都认为是媒体对象,建立一个可以包含所有支持格式的单个类。这个单独的类有一个叫做“数据”的属性,包含图片、歌曲、电影以及日志的原始数据。该类可能有一个行为叫做"perform",来执行显示图片,播放歌曲,播放电影,或者对调出日志进行编辑。

        这个单独的类的属性与行为就太通用了。“数据”本身的意义不大,在这儿要用一个更通用的词,因为这个类被扩展到了有两种不同的用途。同样的,“perform”对于不同类型的介质要做不同的事情。很明显,这个类要做的事情太多了。

        然而,当要设计一个组织介质的程序时,在应用中当然要用一个“Media”类了。这个Media类可以包含各种介质都有的通用属性,比如名字,预览,对应介质文件的链接等等。Media类不应该包含的就是处理特定介质的细节。不应该包含显示图片、播放歌曲或电影的代码。这些都应该在派生的类中,比如Picture类和Movie类中。这些类包含了特定媒体的像显示图片或播放电影这样特定的功能。很明显,这些特定介质的类与Media类相关,这就是我们下一篇博文中要讨论的类之间的关系。

        敬请期待!!!

这篇关于C++学习笔记----4、用C++进行程序设计(二)---- 活在类的世界里的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1093176

相关文章

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(

使用MongoDB进行数据存储的操作流程

《使用MongoDB进行数据存储的操作流程》在现代应用开发中,数据存储是一个至关重要的部分,随着数据量的增大和复杂性的增加,传统的关系型数据库有时难以应对高并发和大数据量的处理需求,MongoDB作为... 目录什么是MongoDB?MongoDB的优势使用MongoDB进行数据存储1. 安装MongoDB

Linux使用fdisk进行磁盘的相关操作

《Linux使用fdisk进行磁盘的相关操作》fdisk命令是Linux中用于管理磁盘分区的强大文本实用程序,这篇文章主要为大家详细介绍了如何使用fdisk进行磁盘的相关操作,需要的可以了解下... 目录简介基本语法示例用法列出所有分区查看指定磁盘的区分管理指定的磁盘进入交互式模式创建一个新的分区删除一个存

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

使用Python进行文件读写操作的基本方法

《使用Python进行文件读写操作的基本方法》今天的内容来介绍Python中进行文件读写操作的方法,这在学习Python时是必不可少的技术点,希望可以帮助到正在学习python的小伙伴,以下是Pyth... 目录一、文件读取:二、文件写入:三、文件追加:四、文件读写的二进制模式:五、使用 json 模块读写

使用zabbix进行监控网络设备流量

《使用zabbix进行监控网络设备流量》这篇文章主要为大家详细介绍了如何使用zabbix进行监控网络设备流量,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录安装zabbix配置ENSP环境配置zabbix实行监控交换机测试一台liunx服务器,这里使用的为Ubuntu22.04(

C++中实现调试日志输出

《C++中实现调试日志输出》在C++编程中,调试日志对于定位问题和优化代码至关重要,本文将介绍几种常用的调试日志输出方法,并教你如何在日志中添加时间戳,希望对大家有所帮助... 目录1. 使用 #ifdef _DEBUG 宏2. 加入时间戳:精确到毫秒3.Windows 和 MFC 中的调试日志方法MFC

在Pandas中进行数据重命名的方法示例

《在Pandas中进行数据重命名的方法示例》Pandas作为Python中最流行的数据处理库,提供了强大的数据操作功能,其中数据重命名是常见且基础的操作之一,本文将通过简洁明了的讲解和丰富的代码示例,... 目录一、引言二、Pandas rename方法简介三、列名重命名3.1 使用字典进行列名重命名3.编

python安装完成后可以进行的后续步骤和注意事项小结

《python安装完成后可以进行的后续步骤和注意事项小结》本文详细介绍了安装Python3后的后续步骤,包括验证安装、配置环境、安装包、创建和运行脚本,以及使用虚拟环境,还强调了注意事项,如系统更新、... 目录验证安装配置环境(可选)安装python包创建和运行Python脚本虚拟环境(可选)注意事项安装

如何使用celery进行异步处理和定时任务(django)

《如何使用celery进行异步处理和定时任务(django)》文章介绍了Celery的基本概念、安装方法、如何使用Celery进行异步任务处理以及如何设置定时任务,通过Celery,可以在Web应用中... 目录一、celery的作用二、安装celery三、使用celery 异步执行任务四、使用celery