我应该学习在C中实现OOP吗? 是否有在C中使用OOP的项目?

最近,我用几乎所有的练习和例子读完了K&R。 我打算转到“加速C ++”,我遇到了Axel Schreiner用ANSI-C 编写的 OOP 书 。

我很好奇,想要学习它。 但是在投入时间之前,我想知道在C中实施OOP的价值。这样我就可以决定花多少时间在它上面。

  1. 在C中实现OOP,它真的被使用了吗? 还是只是为了心理锻炼?
  2. 他们的任何现有C项目是否使用OOP?
  3. 什么时候在C中使用OOP是个好主意?
  4. 我应该把时间花在它上面吗?

我认为我在这里提到我的背景是合适的,这样你们就可以更好地指导我了。 我大约一年前完成了C,C ++,Java和OOP理论,也找到了工作。 但是后来乔尔的博客和SO让我意识到我缺少很多东西。 所以我再次拿起书,开始正确研究它们。

K&R,Accelerated C ++,C ++算法和其他一些书籍是我努力提高自己的技能。 我不是OOP的新手。
那么你会建议什么?

谢谢你的时间。

根据需要经常在C中使用OO。 一般来说,我不同意这样的观点,即只要你提供了一组在OOP上给定类型的函数,就不能在C中做OOP。 例如,您决定创建数据结构。 如果您提供创建,添加,删除和查找数据结构元素的函数,那么它就是OO。 通常,其他语言通过自动暗示实例变量并自动在该实例的各种属性中作用域来提供语法糖。

  1. 至于“它是否真的被使用”,答案是肯定的。 这不是心理锻炼,它是C语言中的有效范例。
  2. 想到的最好的例子是GObject ,由GLib,GTK +和许多与GNOME无关的项目使用。 GObject提供了一种用C语言构建对象的方法。但是没有必要使用第三方支持在C中使用OO。许多现有项目都有它,虽然它可能不存在于界面中(在我看来是一件好事),以及内部用于各种目的(清洁度,数据保护,所有通常的OO理由)。
  3. 每当您发现需要对行为和/或数据进行分组时,最好在C中使用OOP。 当您可以certificate在使用对象界面时花费额外的语法费用,以及未实际完成解决方案所花费的时间。 不要偏离。
  4. 你不应该浪费时间学习OO,因为你认为它是优越的,而不是它应该补充你未来的解决方案,你应该将它添加到你的工具包中。 在看起来正确的事情时使用它。 熟悉如何在C中执行OO,最好的方法是做一些C ++,或者检查使用一点C风格的OO的任何好项目。 在那之后你会觉得很自然。

在C中实现OOP,它真的被使用了吗? 还是只是为了心理锻炼?

是的,它确实被使用了,但不出所料,它并不像专为它设计的语言那样普遍。

他们的任何现有C项目是否使用OOP?

我记得使用一对夫妇:

  • GLib GObject系统
  • GTK + GUI框架

什么时候在C中使用OOP是个好主意?

OOP很好地模拟了一些问题。 例如,GUI通常设计为在窗口类型之间inheritance,使用多态来覆盖和专门化行为。

每当问题有一个漂亮的OOP解决方案时,你应该使用OOP。 使用脚注,您不应该在15000行项目中粘贴100行OOP代码,只是因为它是“kewl”! 🙂

我应该把时间花在它上面吗?

这真的取决于你打算用它做什么。 我从不主张不学习任何东西 – 了解如何,为何以及何时使用它是很好的。 很高兴看到一种不是为OOP支持OOP而设计的语言。 你读过这本书,所以我认为你对C有一些亲和力,对OOP很感兴趣。 试一试,也许把GTK +中的一些GUI应用程序放在一起。 另一方面,如果您希望成为下一个设计模式的主Web开发人员,它可能不是最好的方法,您可以考虑更专注于该领域的其他语言。

那么你会建议什么?

我建议您使用最适合您正在尝试解决的问题的工具。 决定你要解决的问题。 GUI桌面应用程序,Web服务器,游戏,cmd行实用程序……一旦您确定了问题,您将能够更好地确定哪种技术适合开发解决方案。 我发现你不能用“玩具”来掌握任何东西,所以你需要做一些真实的事情。

我有过几个高级C项目的经验,这些项目至少使用了一些OOP。 最着名的是Linux内核。

内核完全是C(除了用于硬件接口的程序集中的平台特定部分)。

内核在很多地方大量使用带有函数指针的结构。 首先想到的是文件系统。 驱动程序使用对其特定实现的回调来填充file_operations结构(以及许多其他结构)。

内核也大量使用goto语句,在某些情况下可以将其视为基本的throw语句,在函数末尾引导标签进行一些清理和退出。 (虽然它们也使用goto而不仅仅是error handling,它也只用于函数中的“exception”,而不是用于将它们传递到外部。)

有人说你可以用任何语言编写面向对象的代码,也有人说你可以用任何语言编写可怕的非结构化代码。

真正的“OO”语言为您提供了一些实现OO设计的机制:语言具有对象和/或类的内置概念,用于使用数据封装代码,用于inheritance等。 C基本上没有这个,但是没有什么可以阻止你在C中进行OO编程,给定一些技巧和自律(正如你的书肯定告诉你的那样)。

但是你想要吗?

我的观点是这样的:如果你只是学习做OO编程,那么通过一种已经深深融入概念的语言“掌握”来学习这一点可能更有意义。 一个结构良好,简单和交互式的语言对此很好:如果有自由选择,我会推荐Ruby,Python或Groovy。 鉴于一种具有内置OO“魔力”的语言,当你做OO事情时,以及当你只是在结构化,纪律严明和组织良好时,这一点变得非常明显。 从C语言转换到另一种语言时,可能还需要学习一些东西:共性,差异。

有些人会建议学习C ++作为C语言的自然OO进展。我并不全心全意地支持这一点,因为我认为C ++对于一种已经比“优雅”更“实用”的语言的OO能力相当丑陋。 当从“标准”C编程转向OO编程时,我认为程序员应该考虑从指针的直接操作中脱离出来,当然,我发现必须为我的数据管理内存很麻烦。 现代OO语言使这种语言自动化,以便程序员有更多的脑细胞可以用于更高级别的任务。 当然,C ++的吸引力在于原始速度。 因为它可以降到与C相同的近金属级别,所以它通常是OO语言中“最快”的。

所有这一切:如果你有一个大项目,所需的语言是C,你想使用和练习OO技术,那么一定要继续! 如果没有,您可能会受益于在鼓励和支持这一点的环境中学习OO,并且可能随后在您了解OO的情况下回到C. 书中教授的技巧对你来说是有意义的,你将能够更好地决定你是否真的想用C或“真正的”OO语言来做这件事。

它可以,但没有其他OOP语言提供的销毁时间函数调用,它没有那么有用。 此外,如果您需要OOP,那么总会有C ++,您的代码几乎可以立即移植到它。