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

相关文章

如何使用Lombok进行spring 注入

《如何使用Lombok进行spring注入》本文介绍如何用Lombok简化Spring注入,推荐优先使用setter注入,通过注解自动生成getter/setter及构造器,减少冗余代码,提升开发效... Lombok为了开发环境简化代码,好处不用多说。spring 注入方式为2种,构造器注入和setter

MySQL进行数据库审计的详细步骤和示例代码

《MySQL进行数据库审计的详细步骤和示例代码》数据库审计通过触发器、内置功能及第三方工具记录和监控数据库活动,确保安全、完整与合规,Java代码实现自动化日志记录,整合分析系统提升监控效率,本文给大... 目录一、数据库审计的基本概念二、使用触发器进行数据库审计1. 创建审计表2. 创建触发器三、Java

C++中全局变量和局部变量的区别

《C++中全局变量和局部变量的区别》本文主要介绍了C++中全局变量和局部变量的区别,全局变量和局部变量在作用域和生命周期上有显著的区别,下面就来介绍一下,感兴趣的可以了解一下... 目录一、全局变量定义生命周期存储位置代码示例输出二、局部变量定义生命周期存储位置代码示例输出三、全局变量和局部变量的区别作用域

C++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)

MySQL深分页进行性能优化的常见方法

《MySQL深分页进行性能优化的常见方法》在Web应用中,分页查询是数据库操作中的常见需求,然而,在面对大型数据集时,深分页(deeppagination)却成为了性能优化的一个挑战,在本文中,我们将... 目录引言:深分页,真的只是“翻页慢”那么简单吗?一、背景介绍二、深分页的性能问题三、业务场景分析四、

SpringBoot结合Docker进行容器化处理指南

《SpringBoot结合Docker进行容器化处理指南》在当今快速发展的软件工程领域,SpringBoot和Docker已经成为现代Java开发者的必备工具,本文将深入讲解如何将一个SpringBo... 目录前言一、为什么选择 Spring Bootjavascript + docker1. 快速部署与

linux解压缩 xxx.jar文件进行内部操作过程

《linux解压缩xxx.jar文件进行内部操作过程》:本文主要介绍linux解压缩xxx.jar文件进行内部操作,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、解压文件二、压缩文件总结一、解压文件1、把 xxx.jar 文件放在服务器上,并进入当前目录#

SpringBoot中如何使用Assert进行断言校验

《SpringBoot中如何使用Assert进行断言校验》Java提供了内置的assert机制,而Spring框架也提供了更强大的Assert工具类来帮助开发者进行参数校验和状态检查,下... 目录前言一、Java 原生assert简介1.1 使用方式1.2 示例代码1.3 优缺点分析二、Spring Fr

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

C++中NULL与nullptr的区别小结

《C++中NULL与nullptr的区别小结》本文介绍了C++编程中NULL与nullptr的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编... 目录C++98空值——NULLC++11空值——nullptr区别对比示例 C++98空值——NUL