首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在哪里可以找到转换为目标代码的过程代码示例

在哪里可以找到转换为目标代码的过程代码示例
EN

Stack Overflow用户
提问于 2009-08-28 16:01:01
回答 4查看 2.8K关注 0票数 17

我正试着用面向对象的编程来包装我的大脑。但我遇到了一些麻烦。我(认为)我理解了OOP是一个“好”设计的一般概念和争论。当我坐下来尝试编写面向对象的代码时,我的问题就来了。

我倾向于得到这样的程序,它们要么非常过程化,但偶尔会有一些对象被扔进好的measure....or程序中,这些程序看起来长得离谱而且复杂,因为doing....everything是一个对象;但是有很多很多对象,继承树变得又长又丑陋。

我一直在努力寻找一些设计得很好的OOP源代码的例子(我见过很多关于猫、狗和animals....but的丢弃/伪代码,当我真正尝试编写一些需要做的事情时,它们似乎没有帮助)。理想情况下,我正在寻找一些能让我逐步完成思考过程的东西。就像“好吧--这是一些做XYZ的过程性代码。现在,这是一些做同样事情的非常棒的OOP代码!”

谢谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-08-28 16:26:12

事实上,这样的转换通常不是好的面向对象的代码。为什么?因为面向对象的代码不是简单地将函数移动到方法中,将数据移动到成员中。

相反,一个好的对象应该负责它的所有数据,并且只接受那些定义将要操作的数据的方法参数。

这意味着从过程函数和过程数据结构到面向对象的映射不是1:1的映射。

环顾四周,我没有在网上找到任何我关心的例子,所以我将简单地给出我的重构规则,将过程代码转换为OOP。

第一步是将每个模块简单地打包为一个对象。换句话说,只需创建一个保存数据和函数的对象。对于一个纯粹主义者来说,这是可怕的,但你必须从某个地方开始。例如,如果您有一个BankAccount模块,那么您现在将拥有一个BankAccount对象。

显然,这些函数的数据是从外部调用传入的。在这里,您正在寻找如何内部化该数据并使其尽可能私有。目标应该是将数据放入构造函数(至少是起始点),并删除用于手动接收数据的参数,并将它们替换为对现在私有数据的引用。使用BankAccount对象,对account的所有访问现在都是通过对象上的方法进行的,并且实际的account数据已经内部化。

您的许多函数可能会返回数据结构的修改版本:停止直接返回该数据,并将这些修改保留在私有结构中。创建访问器属性,在必要时返回您现在的私有数据,并将其标记为“过时”(您的目标是使对象成为其数据的主控,并且只返回结果,而不返回内部数据)。使用BankAccount对象,我们不再返回实际的帐户数据,但我们有CurrentBalance的属性和AverageBalance(int Day)等方法来查看帐户。

最终,你将拥有一组自包含的对象,它们仍然与你在设计中从对象开始所做的事情没有什么相似之处,但至少你可以继续用你的新对象进行重构。我的下一步通常是发现通过这样的重构创建的对象有很多职责。在这一点上,可能已经检测到一些共同的线程,您应该创建对象来重构这些共同的想法。如果我们有BankAccount,我们可能还有其他的account类型,如果我们调整所有这些account类型的方法,我们可以将Account作为实现所有共享功能的基类,而BackAccount、SavingsAccount和其他实现细节。

一旦类结构开始形成,就是时候对转换感觉更好了。重构是一个过程,而不是一个端点,所以我通常发现我的类结构在继续发展。走到这一步的好处之一是,您的数据是私有的,并通过方法进行操作,因此随着您的进展,您可以越来越自由地重构内部结构。

要做到这一点,有一件事是可行的,那就是拥有良好的单元测试。在进行从过程到OOP的转换时,我经常保留旧代码作为“基线”,这样我就可以对其进行测试。也就是说,测试可以对照旧的程序系统的结果进行验证。如果你不匹配,找出原因是个好主意。我发现经常会有一个bug...但有时你的新代码实际上是在做一些过去错误的正确的事情。

关于创建对象树的“太深”:这可能是对继承过于执着的结果。我发现组合通常是一个更好的想法,在这种情况下,您实现了多个对象的接口,而不是试图将所有这些功能集成到单个父对象中。如果您发现自己正在创建简单的混合功能集的父对象,请考虑通过为每个功能集创建一个接口并实现这些接口来简化。

票数 10
EN

Stack Overflow用户

发布于 2009-08-28 16:17:05

程序型程序员在开始面向对象编程时经常遇到的问题是,他们不断地设计过程对象,并试图将它们组织成。这不管用。

面向对象编程( Object-oriented programming,not )是一种不同的设计方法论;一种不同的思考角色和职责的方式,而不仅仅是一种不同的编码方法论。

当你通过“狗是哺乳动物”的比喻(这些比喻永远不会转化为真正的应用)时,我会推荐这本书:Object Design: Roles, Responsibilities, and Collaborations。这是我读到的第一本书,在这本书中我终于明白了为什么我不得不停止(在我的例子中)将C++视为"C加类“。

票数 3
EN

Stack Overflow用户

发布于 2009-08-28 16:18:28

从C应用程序接口到C++应用程序接口的一种非常直观的转换经常发生在数据库中;因此,在本例中,我们将快速了解一下使用MySQL API的区别。

我不确定是否可以从这些站点复制代码(不知道它是什么许可证),但是在C语言演示中使用the section labeled "Creating a Database",在C++中使用Sample #1;这两个步骤都是通过编程方式创建MySQL数据库。

在C API中,每个函数的第一个参数是数据库的“句柄”。在C++应用程序接口中,我们使用一个数据库连接对象,该对象使用其私有句柄隐式调用C应用程序接口。

为了查看一个非常具体的示例,在生成查询后执行查询,我们在C中有:

代码语言:javascript
运行
复制
mysql_query(conn, "create database testdb")

在C++中:

代码语言:javascript
运行
复制
query.execute();

这里最大的区别是,C++绑定只显示您需要看到的内容,而在C中,您必须非常明确地说明每一个小细节。

我认为数据库API是通过示例学习一些OOP原则的好方法,所以希望它们也能帮助您。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1347944

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档