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#如何调用C++库

《C#如何调用C++库》:本文主要介绍C#如何调用C++库方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录方法一:使用P/Invoke1. 导出C++函数2. 定义P/Invoke签名3. 调用C++函数方法二:使用C++/CLI作为桥接1. 创建C++/CL

利用python实现对excel文件进行加密

《利用python实现对excel文件进行加密》由于文件内容的私密性,需要对Excel文件进行加密,保护文件以免给第三方看到,本文将以Python语言为例,和大家讲讲如何对Excel文件进行加密,感兴... 目录前言方法一:使用pywin32库(仅限Windows)方法二:使用msoffcrypto-too

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

Pandas使用AdaBoost进行分类的实现

《Pandas使用AdaBoost进行分类的实现》Pandas和AdaBoost分类算法,可以高效地进行数据预处理和分类任务,本文主要介绍了Pandas使用AdaBoost进行分类的实现,具有一定的参... 目录什么是 AdaBoost?使用 AdaBoost 的步骤安装必要的库步骤一:数据准备步骤二:模型

使用Pandas进行均值填充的实现

《使用Pandas进行均值填充的实现》缺失数据(NaN值)是一个常见的问题,我们可以通过多种方法来处理缺失数据,其中一种常用的方法是均值填充,本文主要介绍了使用Pandas进行均值填充的实现,感兴趣的... 目录什么是均值填充?为什么选择均值填充?均值填充的步骤实际代码示例总结在数据分析和处理过程中,缺失数

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

Linux下如何使用C++获取硬件信息

《Linux下如何使用C++获取硬件信息》这篇文章主要为大家详细介绍了如何使用C++实现获取CPU,主板,磁盘,BIOS信息等硬件信息,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录方法获取CPU信息:读取"/proc/cpuinfo"文件获取磁盘信息:读取"/proc/diskstats"文

QT进行CSV文件初始化与读写操作

《QT进行CSV文件初始化与读写操作》这篇文章主要为大家详细介绍了在QT环境中如何进行CSV文件的初始化、写入和读取操作,本文为大家整理了相关的操作的多种方法,希望对大家有所帮助... 目录前言一、CSV文件初始化二、CSV写入三、CSV读取四、QT 逐行读取csv文件五、Qt如何将数据保存成CSV文件前言

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a