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++ move 的作用详解及陷阱最佳实践

《C++move的作用详解及陷阱最佳实践》文章详细介绍了C++中的`std::move`函数的作用,包括为什么需要它、它的本质、典型使用场景、以及一些常见陷阱和最佳实践,感兴趣的朋友跟随小编一起看... 目录C++ move 的作用详解一、一句话总结二、为什么需要 move?C++98/03 的痛点⚡C++

详解C++ 存储二进制数据容器的几种方法

《详解C++存储二进制数据容器的几种方法》本文主要介绍了详解C++存储二进制数据容器,包括std::vector、std::array、std::string、std::bitset和std::ve... 目录1.std::vector<uint8_t>(最常用)特点:适用场景:示例:2.std::arra

C++构造函数中explicit详解

《C++构造函数中explicit详解》explicit关键字用于修饰单参数构造函数或可以看作单参数的构造函数,阻止编译器进行隐式类型转换或拷贝初始化,本文就来介绍explicit的使用,感兴趣的可以... 目录1. 什么是explicit2. 隐式转换的问题3.explicit的使用示例基本用法多参数构造

C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解

《C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解》:本文主要介绍C++,C#,Rust,Go,Java,Python,JavaScript性能对比全面... 目录编程语言性能对比、核心优势与最佳使用场景性能对比表格C++C#RustGoJavapythonjav

C++打印 vector的几种方法小结

《C++打印vector的几种方法小结》本文介绍了C++中遍历vector的几种方法,包括使用迭代器、auto关键字、typedef、计数器以及C++11引入的范围基础循环,具有一定的参考价值,感兴... 目录1. 使用迭代器2. 使用 auto (C++11) / typedef / type alias

C++ scoped_ptr 和 unique_ptr对比分析

《C++scoped_ptr和unique_ptr对比分析》本文介绍了C++中的`scoped_ptr`和`unique_ptr`,详细比较了它们的特性、使用场景以及现代C++推荐的使用`uni... 目录1. scoped_ptr基本特性主要特点2. unique_ptr基本用法3. 主要区别对比4. u

C++11中的包装器实战案例

《C++11中的包装器实战案例》本文给大家介绍C++11中的包装器实战案例,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录引言1.std::function1.1.什么是std::function1.2.核心用法1.2.1.包装普通函数1.2.

C++多线程开发环境配置方法

《C++多线程开发环境配置方法》文章详细介绍了如何在Windows上安装MinGW-w64和VSCode,并配置环境变量和编译任务,使用VSCode创建一个C++多线程测试项目,并通过配置tasks.... 目录下载安装 MinGW-w64下载安装VS code创建测试项目配置编译任务创建 tasks.js

JAVA SpringBoot集成Jasypt进行加密、解密的详细过程

《JAVASpringBoot集成Jasypt进行加密、解密的详细过程》文章详细介绍了如何在SpringBoot项目中集成Jasypt进行加密和解密,包括Jasypt简介、如何添加依赖、配置加密密钥... 目录Java (SpringBoot) 集成 Jasypt 进行加密、解密 - 详细教程一、Jasyp

C++ 多态性实战之何时使用 virtual 和 override的问题解析

《C++多态性实战之何时使用virtual和override的问题解析》在面向对象编程中,多态是一个核心概念,很多开发者在遇到override编译错误时,不清楚是否需要将基类函数声明为virt... 目录C++ 多态性实战:何时使用 virtual 和 override?引言问题场景判断是否需要多态的三个关