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

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

揭秘世界上那些同时横跨两大洲的国家

我们在《世界人口过亿的一级行政区分布》盘点全球是那些人口过亿的一级行政区。 现在我们介绍五个横跨两州的国家,并整理七大洲和这些国家的KML矢量数据分析分享给大家,如果你需要这些数据,请在文末查看领取方式。 世界上横跨两大洲的国家 地球被分为七个大洲分别是亚洲、欧洲、北美洲、南美洲、非洲、大洋洲和南极洲。 七大洲示意图 其中,南极洲是无人居住的大陆,而其他六个大洲则孕育了众多国家和

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi