代码之家  ›  专栏  ›  技术社区  ›  Alexander Rafferty

我的API应该使用非成员函数来处理对象,还是让函数成为对象的公共函数?

  •  1
  • Alexander Rafferty  · 技术社区  · 14 年前

    最近我学到了OOP的许多好处(包括漂亮的代码)。

    所以,现在我正在尝试编写一个小的物理API供我个人使用,也许可以放在一些小游戏中。这主要是因为我喜欢练习编码,我喜欢我的物理。

    但问题是,许多API都有这样的接口(包括Windows API):

    // In this case, Object is just a plain data container without a constructor.
    Object object = NewObject(...);
    DoSomething(object);
    DoAnotherThing(object,...);
     ... and so on
    

    应该 或者有更多OO风格的事情,比如:

    Object object(...);
    object.DoSomething(...);
    object.DoAnother(otherObj,...);
    otherObject.attachNode(object);
     ... and so on again
    

    我希望你明白我的意思。所以,通过问题总结一下,哪种方法更受欢迎,为什么我看到了很多第一个例子,尽管它美化了OOP(尽管参考中的这些API可能只是旧的,像windowsapi)。

    顺便说一下,你觉得WindowsAPI怎么样?在我看来只是有点。。。不对。

    8 回复  |  直到 13 年前
        1
  •  5
  •   Stack Overflow is garbage    14 年前

    一个API可以以任何方式显示。如果你想制作一个C++ API,那么你可以尽可能多地使用成员函数。使用Win32 API,微软必须做出可以从C(以及各种其他语言)以及C++访问的东西,因此他们必须使用普遍可访问的特征来表达所有的东西。这意味着它们不能使用类(或扩展名、成员函数)、命名空间、重载、模板和各种其他C++特性。

    然后,他们采用了相当合理的前提,构建了最丑陋、最不一致的API。

    如果你的API打算从C++代码中使用,那么你可以使用你喜欢的所有C++特性。

    另一方面,即使在C++中,使所有成员都成为成员函数并不一定是更好的。 默认情况下,可以使用非成员函数 a very good idea ,即使是在面向对象的代码中,尽管原因与微软在其API中的不同。

        2
  •  2
  •   fredoverflow    14 年前

    do_something(object) 实际上是 更多OO object.do_something() ,而很多官员似乎根本不明白这一点。

    How Non-Member Functions Improve Encapsulation 详情。

        3
  •  1
  •   ereOn    14 年前

    我认为这是一个非常主观的话题。

    而我更喜欢 object.DoSomething()

    我相信真正重要的是你的API保持一致。

    通常,当选定的样式不合适时,您会注意到它,因为有些事情似乎是错误的。

        4
  •  1
  •   Ivo    14 年前

        5
  •  1
  •   thorsten    14 年前

    这份文件可能不是100%适合这个问题,但仍然密切相关。 scottmeyers讨论了问题中提到的两种风格。 Scott Meyers: How Non-Member Functions Improve Encapsulation

        6
  •  0
  •   Goz    14 年前

        7
  •  0
  •   alxx    14 年前

    如果不受某些性能约束的约束,请使用对象方法。在这种情况下,方法的选择是有限的,在C风格中,您可以选择所有可能的方法。人类的记忆是有限的,所以把所有的东西都分成小块(而且是可测试的!)部分。

        8
  •  0
  •   MSalters    14 年前

    你不应该把拼写和设计混为一谈。

    object.Foo() 只是一种拼写方法,表示您正在调用对象上的Foo方法。另一种OO语言可以使用拼写 CallMethod(object, Foo) Foo(object) 语法。

    现在windowsapi是一个API,它的目的是被OO和非OO语言使用。您似乎正在使用windowsapi的C绑定,即您从中获得的绑定 #include <windows.h> windows.h 从C++的角度来看,它看起来不像是一个OO API。