如何正确构建 OOP 和多文件项目

How to properly structure OOP and multifile projects?

本文关键字:文件 项目 OOP 何正确 构建      更新时间:2023-10-16

作为一个初学者程序员,刚刚学习了OOP的基础知识,我在练习程序的基本包含结构方面遇到了许多问题。我一直在使用各种书面和在线资源自学编程。但是,这是我的问题(嗯,其中一个...

一方面,我理解抽象、封装和类之间低耦合的重要性,但另一方面,我一直在努力构建我的程序和设计我的类,以允许不同文件中的不同类相互了解。

当然,这是我的一个主要问题,它导致了草率、黑客代码,只有在我把每个基本的主体 OOP 扔出窗外并开始用全局变量填充我的代码并开始用全局变量填充我的代码,到处都是前向声明,并使类成员公开之后,它才能按照我想要的方式工作。

简单地说:我的编程一团糟...C++是我的第一门编程语言,即使我尽力以面向对象的方式设计/编写,我最终也会得到一堆丑陋的文件,几乎每个文件中 #including 所有内容,以及过程和 OOP 意大利面条代码的奇怪组合,很少起作用!

自称是编程新手,我接受学习如何构建程序需要时间,但我几乎已经走到了尽头!我知道我的问题源于我对OOP有一点了解的事实。我知道我想编写处理单个任务的独立类。但与此同时,我不明白如何正确地提醒每个类程序其他部分的存在。这有点像知道你应该吃什么样的食物,但不知道如何使用叉子......

简而言之,这就是我的问题。并进一步跟进我提出的一些更具体的问题:

  • C++多文件项目中,将main()函数放在自己的类中是否正常/需要?还是将main()留在全局范围内是标准的事情?

  • 在我用C++编写的以前的过程程序中,在全局范围内将常量变量或常量变量或 #defines 在 main.cpp 文件的顶部并不少见。例如,也许屏幕的尺寸或其他有用信息将在程序开始时定义。OOP 中会发生什么?这种做法是否要完全避免?还是我做一个主。H 文件并将其 #include 在项目中的所有其他标头中?我不知道该怎么办...

  • 在编写我的第一个中型实践 OOP 程序时,当我开始尝试编写 StateMachine 类时,我的工作戛然而止。我打算让 StateMachine 类包含程序将使用的所有可能的屏幕状态。但是,出现了一个问题,即我的 StateMachine 类似乎不知道我的其他一些 State 类,即使它们都是 #included 的。我以前见过人们做类的转发声明,有必要吗?我应该到处发送类的转发声明,还是代码异味?

  • 最后,#include 和转发声明命令的顺序是否重要?

我知道这可能是一个超级基本的问题,但在我从单文件过程 c++ 初学者程序过渡到多文件 OOP 编程的过程中,这个问题一直让我非常困难。是否有一些一般的经验法则来构建您的程序以使一切正常?我一直在使用包含保护,那么有什么理由不能只 #include 每个源文件中的每个标头吗?我应该在每个类的每个头文件中 #included 一个 common.h 文件吗?

我非常感谢社区可以给我的任何帮助/建议。我知道,在我开始发展我的OOP技能之前,这是一个简单但重要的障碍。我一直试图在我的大脑中钻研将类彼此分开的重要性,以至于我不确定如何以一种允许它们真正相互交互的方式真正设置我的类/文件!非常感谢您的帮助!

你不能把OOP看作是带有类的普通函数式编程。这是一种错误的方法,它会误导你。

设计应用程序的体系结构非常重要,有一整本书都写过。你设计应用的结构越好,你就越容易编码,你遇到的错误就越少。学习一些建模语言的基础知识是一个很好的建议,以便您更轻松地绘制和理解内容。UML是一个很好的选择。

设计大东西有两种方法。你可以下降,这意味着你从一个高层次的抽象开始,然后向下,缩小你的问题。或者你可以上升,从实现容易做的小事情开始,然后上升,将你的小模块连接到一个应用程序中。

您可以在网络上轻松找到很多相关信息。简而言之。现在,针对您的具体问题。

  1. 将 main 保留在全局范围内。就个人而言,我什至将其放在单独的main.cpp文件中以保持清洁,但将其放在哪里并不重要。

  2. 尽量避免全局变量。如果需要常量,可以定义它们。是的,您在单个头文件中包含所有定义的方法效果很好。但是,您可能希望按含义将它们分开,而不是将具有 10000 个定义的文件包含在只需要其中一个定义的.cpp中。

  3. 如果需要在声明类之前使用它,则必须向前声明它,否则编译器将不知道它的存在。

  4. 包含的顺序确实很重要,因为每个#include基本上都复制粘贴了相应文件的文本。因此,如果您在class.cpp#include class.h,则标头的文本将由预处理器复制粘贴到源文件中。只要您在第一次使用它之前向前声明内容,前向声明的顺序就无关紧要。

  • C++不仅仅是OOP,而是多范式。不要试图通过 OO 过滤器按所有内容,这C++有害。在一些地方,C++可以更优雅地做事,因为你仅限于"纯"OO。例如

  • main() 从不在类内,并且始终在全局范围内。

  • 最重要的规则是"一致性"和"可维护性"。想想你以后会如何看待这个程序,一旦它"完成",你想修复几个错误。在哪里可以找到常量并定义最简单的方法?

  • 如果#include的顺序很重要,则头文件已损坏。对于其中声明的内容,每个标头都应该(至少)自给自足。

  • 每个标头一个类
  • 声明,每个实现单元一个类定义。文件和类具有相同的名称。真的,这是我认为唯一不可谈判的规则。不得不grep有关类的信息比find类更不方便。

其余的,真的,可以在每本关于C++的好书中找到,你真的应该用一本书,而不是在教程和问答页面中穿梭。

好的...因此,主要问题似乎是保留文件的OO组织。首先,如果您还没有阅读Google C++风格指南,我会强烈建议您这样做。我也发现之前的这个答案相当清晰和简单

我希望这有帮助