作为了解 OOP 和过程语言之间差异的一种方式,我一直在寻找用 C 和 C++ 或 C# 或 Java 编写的示例程序。我只是想看看解决同一问题的不同方法,以帮助我了解真正的差异。有谁知道我在哪里可以找到这样的教程?
10 回答
我不认为这可能会教给你很多东西。在不同编程范式之间的差异真正显示出来之前,程序必须具有一定的大小。如果同一个程序用不同的语言编写,人们不太可能写出相同的副本,除非该程序是微不足道的。
大多数现实生活中的例子也会被很多额外的噪音污染,这些事情可以在一种语言的标准库中完成,但需要另一种语言的第三方库。编写它的程序员可能更熟悉一种语言而不是另一种语言,因此他在某些语言中的实现并不代表它“应该”如何完成。
您更有可能以通常的方式了解这些范式之间的区别。通过了解每个含义以及如何使用它。
我推荐99瓶啤酒网站
您可以随时查看Project Euler。人们用许多不同的语言解决同样的问题。大多数人会发布他们的解决方案,您也可以在解决问题后访问这些解决方案。
看看计算机语言基准游戏。它以您能想象到的几乎所有语言实现了各种程序。
对于您的目的来说,这可能有点简单,但Hello World Collection总是很有趣。
Rosetta Code拥有丰富的数据,但与过程/面向对象的区别相关的数据很少。您还应该看到他们收集的相关网站。
多种语言的 Black Scholes有很多 Black-Scholes 公式的实现。该公式在 Objective-C/iPhone、F#、Autoit、Fortress、Lua、APL、SAS、Mathcad、J、MEL、Postscript、VB.NET、Clean、Ruby、Lisp、Prolog、PL/SQL、LyME、ColdFusion 中实现, K, C#, HP48, Transact SQL, O'Caml, Rebol, Real Basic, Icon, Squeak, Haskell, JAVA , JavaScript, VBA, C++, Perl, Maple, Mathematica, Matlab, S-Plus, IDL, Pascal, Python 、Fortran、Scheme、PHP、GNU、gnuplot。
前几天有人在 Reddit 上发布了 Evil Walrus / ReFactory:
考虑蛇和梯子游戏的实现
在程序设计中,我们可能会编写如下函数
function move(int n) {
pos += n;
switch(pos) {
case 6: pos = 10; break;
case 12: pos = 4; break;
case 15: pos = 32; break;
case 16: pos = 8; break;
// ...
}
}
在对象设计语言中,我们将创建一个实例链接列表,Square
其中一些实例分支到其他方块。Ladder
Snake
class Square
def initialize(next)
@tokens = []
@next = next
end
def next(n)
n == 0 ? self : next.next(n-1)
end
def move(token,n)
tokens.remove(token)
target = self.next(n)
target.tokens << token
end
end
class SnakeOrLadder < Square
def initialize(next,branch)
super(next)
@branch = branch
end
def next(n)
# goes to branch when landing on this square!
n == 0 ? @branch : next.next(n-1)
end
end
如您所见,我们在对象中实现游戏规则以及它们的组合方式(而不是在 switch case 语句中)。这样做的好处是
- 在开发时添加新的游戏规则很简单,您只需编写一个新的 Square 子类
- 在运行时更改游戏布局很简单(对于游戏来说可能听起来很奇怪,但对于您的普通商业应用程序来说,这就是您想要的)
这种灵活性使 OO 如此强大。