寻找一种纯面向对象的编程语言

19

我认为面向对象编程被高估了,但我想学习这种范式。我一直在尝试使用PHP 5和带有QT 4的C++进行学习。不幸的是,我倾向于以结构化的方式编程,我很少使用继承或多个实例。我认为我必须学习一种纯面向对象的语言,迫使我使用以上特性。

我认为最好的选择可能是学习Ruby。您能否确认或提供更好的替代方案?

我主要在x86-64 Linux上工作。


3
很遗憾,我往往以结构化的方式编程。面向对象编程如何不是结构化编程? - PatrikAkerstrand
2
@机器人,你看过一个“新手程序员”的Java代码吗? - Aiden Bell
5
你看过任何“初学者”程序员的代码吗? :) - willcodejavaforfood
2
机器:他可能是指他倾向于以过程化的方式编程。根据我的经验,面向对象编程和过程化编程采用了两种非常不同的问题解决方法,并产生了两种非常不同的代码类型。(顺便说一句,过程化编程有其优点,在我看来现在被低估了。) - Jason Orendorff
3
任何语言都可以编写糟糕的代码,没有哪种语言会强制你使用面向对象的原则和技术,也不会比其他任何语言更多地需要这种纪律。 - user177800
显示剩余2条评论
15个回答

36

面向对象编程并不只是语法问题,它是一种编程范式。

一种编程语言可能会强制你使用对象(例如如果所有内容都是对象),但使用这些语言并不会“迫使”你学习面向对象编程

我不太使用继承或多个实例

你必须学习何时以及为什么使用这些技术(数据抽象、封装、多态和继承)来从对象的角度思考问题。找一份良好的面向对象编程参考资料,并使用你最熟悉的支持面向对象编程的语言来应用这些技术。


2
"我发明了面向对象的术语,我可以告诉你C++不是我的初衷。" -> https://www.youtube.com/watch?v=oKg1hTOQXoY&t=634s - João Rebelo

23
如果你想要一种纯面向对象的语言,可以尝试Smalltalk。在Smalltalk中,一切都是对象。但Java不同,原始类型(如int、float)本身并非对象。
如果不需要“纯”面向对象的语言,Java是一个很好的选择,因为它更为主流。

2
是的,Smalltalk 是最严格的面向对象语言。据我所知,除了 self(在其他语言中相当于 this)和指向“静态”类成员的某些东西之外,没有运算符和命令。其他所有东西都是对象,真的是所有东西。这甚至包括代码块也是对象,你可以对其应用 IfElseIf 方法/消息。在进行算术运算时,您必须重新考虑,因为没有运算符优先级规则,例如 +* 是应用于数字对象的方法,因此按出现顺序进行评估。 - herzmeister
@michas Smalltalk 还会教你 MVC 模式,并且不会介绍 C++/PHP 类系统的疯狂。你可以尝试 Ruby,它会帮助你学习(特别是元编程部分),但如果你想知道如何进行面向对象设计,Smalltalk 库是你能得到的最好的选择。 - Tim Snowhite
我认为“纯粹”的面向对象编程(OOP)观点通常是无意义的,这些观点产生于狭隘的思维。从未有过名为“对象纯编程”(OPP)的发明,在Java中,你不能使用原始类型或运算符而不将它们包装在对象中。试试看吧,这是面向对象的。 - Roger F. Gay
Ruby 也很棒 ;) - 15 Volts

9

如果你想学习一门纯面向对象的语言,可以看看Smalltalk。我目前正在阅读相关内容。

希望这能帮到你。


8
问题并不在于语言,而在于你使用语言的方式。
我们使用面向对象的特性并不是因为它们很花哨,而是因为我们可以通过它们节省时间(当然也包括长远的时间)。
我建议你让其他程序员审查你的代码,并进行讨论。你可以审查他的代码吗?我认为这种反馈比独自阅读或编写代码更有帮助,这样你就不必在具体的代码上进行对抗或讨论了。

7

在Mono上尝试Java或C#。

原因:

  1. 我尊重Smalltalk,并且人们应该了解其概念以更好地理解OOP,但是我认为学习这种语言本身是不切实际的。

  2. 虽然Java和C#在OOP方面可能不是“绝对纯粹”的(例如它们已经吸收了一些函数式编程方法),但它们本质上是基于OOP的,它们是主流语言(因此具有更大的社区)并且比Smalltalk更容易学习。


5
Mono是一个框架,不是一种语言。我猜你指的是C#。 - 3Dave
2
@fortran:我们应该建议Michas先学习Smalltalk-80,然后再学习一些“有用”的东西吗? - Massimiliano
1
从技术上讲,您可以使用静态类/方法在C#/Java(不确定Smalltalk)中编写过程代码。 - Finglas
2
@FrustratedWithFormsDesigner,tommieb75 - 不,所有的C#类型(包括int,bool等)都派生自System.Object。 - mbeckish
3
同意。如果你想学习脚本语言,学Ruby就好了,但如果你想学习一个用于学习面向对象编程的实用语言,那么Java或C#是不错的选择。除了在学术界之外,Smalltalk和Eiffel并没有被广泛使用;Java/C#似乎是明显的赢家,因为它们有广泛的支持和问答网站。 - Dean J
显示剩余11条评论

7
很多人建议使用Smalltalk,但我想不同的建议一下Eiffel。 ;)
这是一门很好的学习面向对象原则的语言,还有像DBC(通过设计约束实现的编程)等很酷的东西。

Eiffel不是一种编程语言。 - Roger F. Gay
1
@RogerF.Gay:好的,你能解释一下它是什么吗? - FrustratedWithFormsDesigner

6
问题不在于语言。无论使用什么语言,你都可以在一个类中编写所有代码,或者使用类级别的方法,并最终编写结构化的代码。虽然纯面向对象的语言会使它更加困难,但我评分过很多试图将结构化编程塞入Java和C#中的学生。
我的建议是查看一些良好的面向对象编程示例,并查看面向对象如何适用于某些设计模式,这些模式真正展示了面向对象的强大之处,可以使用比结构化编程更少的代码来完成相同的事情,并且更易于其他程序员阅读。

好的建议,但我建议首先与同事或朋友交谈:这通常更有趣,也更好地利用了(可能有限的)时间。 - NVRAM
哦,当然,我忘记了与同事交流这一点。每当我做新事情时,这几乎总是我的第一步,而且这是一个如此显而易见的事情,以至于我忘记了它。 - user120587

5

阅读Daniel H. H. Ingalls编写并实现Smalltalk的《Smalltalk设计原则》一文,它阐述了面向对象编程的真正本质。


https://pharo.org Pharo是一种纯面向对象的编程语言和强大的环境,专注于简单性和即时反馈(想象一下IDE和操作系统合二为一)。Pharo是一种独立的语言。它不应该是Smalltalk-80或ANSI Smalltalk的实现。Pharo依赖于一个几乎完全用Smalltalk本身编写的虚拟机。它基于Smalltalk的一般概念,但不想受到它们的限制。 - Ahmad Ismail

4
我建议使用Python。它满足了一些人选择Smalltalk的“一切皆为对象=纯面向对象语言”标准。函数甚至Python空值(None)都是对象。
Python比Java更加面向对象(Java有int和Integer)。更重要的是,Python比Smalltalk更受欢迎,因此您更容易得到帮助。
Python还可以实现无需继承的多态(“鸭子类型”)和函数式编程,这两种方法在“主流”语言中变得越来越普遍。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接