代码之家  ›  专栏  ›  技术社区  ›  Rob P.

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

  •  16
  • Rob P.  · 技术社区  · 17 年前

    我倾向于以非常程序化的程序结束,但偶尔会有一些对象被很好地抛进去……或者以他们正在做的事情来说,程序看起来长得可笑,复杂得离谱……一切都是一个对象;但是有很多很多的对象,继承树变得又长又丑。

    我一直试图找到的是一些非常好设计的OOP源代码的非平凡示例(我见过很多涉及猫、狗和动物的一次性/伪代码……但当我真的试图编写一些需要做的事情时,它们似乎没有帮助)。理想情况下,我正在寻找一些可以帮助我完成思考过程的东西。比如“好的-这里有一些程序代码,可以执行XYZ。现在,这里有一些非常棒的OOP代码,它们也可以做同样的事情。

    4 回复  |  直到 17 年前
        1
  •  10
  •   Godeke    17 年前

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

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

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

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

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

    最终,您将拥有一组自包含的对象,这些对象与您从设计中的对象开始时所做的几乎没有相似之处,但至少您可以继续使用新对象进行重构。我的下一步通常是发现通过这种重构创建的对象有很多责任。此时,可能已经检测到一些公共线程,您应该创建对象来将这些公共思想重构为。如果我们有BankAccount,我们可能会有其他帐户类型,如果我们调整所有这些帐户类型的方法,我们可以使account成为实现所有共享功能的基类,而BackAccount、SavingsAccount和其他实现细节的类。

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

    有一件事可以让这一切变得合理,那就是进行良好的单元测试。在进行从过程到面向对象的转换时,我经常将旧代码作为“基线”保留,以便进行测试。也就是说,测试可以对照旧程序系统的结果进行验证。如果你不匹配,最好找出原因。我发现经常有一个bug。。。但有时,新的更干净的代码实际上是在做一些过去错误的事情。

    关于创建“太深”的对象树:这可能是过于执着于继承的结果。我发现复合通常是一个更好的主意,在这里您实现了 倍数 对象,而不是尝试将所有这些特征放入单个父对象中。如果您发现自己创建的父对象仅仅是特征集的混合体,请考虑通过简化每个特征集的接口并实现这些接口来简化。

        2
  •  3
  •   Robert Cartaino    17 年前

    程序程序员在开始面向对象编程时经常遇到的问题是 试着 . 那不行。

    不同的设计方法 ; 思考问题的另一种方式 角色和责任 您可以在整个代码中分发,而不仅仅是一种不同的编码方法。

    当你忘记了“狗是哺乳动物”的比喻(它永远不会转化为真正的应用),我会推荐你 书: Object Design: Roles, Responsibilities, and Collaborations . 这是我在那里读的第一本书 最后 明白了为什么我必须停止查看(在我的例子中)C++作为“C类被抛出”。

        3
  •  2
  •   Mark Rushakoff    17 年前

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

    在C API中,每个函数的第一个参数都是数据库的“句柄”。在C++ API中,我们使用数据库连接 对象

    看一个非常具体的示例,要在生成查询后执行查询,我们使用C:

    mysql_query(conn, "create database testdb")
    

    在C++中:

    query.execute();
    

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

        4
  •  1
  •   Joseph Yaduvanshi    17 年前

    我知道这是标记为.net的,但PHP就是一个很好的例子。在PHP5之前,PHP只是部分面向对象的。许多PHP开发人员在掌握OOP方面也有同样的问题。

    Zend有一篇很好的文章 here . 这应该很容易理解。

    Foundations of Software Engineering (课堂讲稿2)或类似的东西。