В качестве способа понять различия между ООП и процедурными языками я искал пример программы, написанной на языках C и С++ или С# или Java. Я просто хочу увидеть различные подходы к одной и той же проблеме, чтобы помочь мне разобраться в реальных различиях. Кто-нибудь знает, где я могу найти учебник, подобный этому?
Я не думаю, что это, вероятно, научит вас многому. Программа должна иметь определенный размер до того, как действительно показывают различия между различными парадигмами программирования. И люди вряд ли будут писать одинаковые копии, если одна и та же программа на разных языках, если программа не является тривиальной.
Большинство реальных примеров также будут загрязнены большим количеством лишнего шума, что может быть сделано в стандартной библиотеке одного языка, но требует наличия сторонних библиотек в другом. И программист, который написал его, может быть более знаком с одним языком, чем другим, поэтому его реализация на некоторых языках не отражает того, как это должно быть сделано.
Вы, скорее всего, узнаете разницу между этими парадигмами обычным способом. Изучая то, что каждый означает, и как его использовать.
Я рекомендую 99 бутылок пива веб-сайт
Вы всегда можете посмотреть Project Euler. Люди решают одни и те же проблемы на разных языках. Большинство людей опубликуют свои решения, к которым вы можете получить доступ, после того как вы решите проблему.
Взгляните на Компьютерная игра Benchmarks Game. Он реализовал различные программы практически на каждом языке, который вы могли себе представить.
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, С#, HP48, Transact SQL, O'Caml, Rebol, Real Basic, Icon, Squeak, Haskell, JAVA, JavaScript, VBA, С++, Perl, Maple, Mathematica, Matlab, S-Plus, IDL, Pascal, Python, Fortran, Scheme, PHP, GNU, gnuplot.
Это может быть немного просто для ваших целей, но Hello World Collection всегда интересно просматривать.
Rosetta Code содержит множество данных, но очень малое из них связано с процедурным/объектно-ориентированным различием. Вы также должны увидеть свою коллекцию связанных сайтов.
Рассмотрим реализацию игр с змеями и лестницами
В процедурной конструкции мы можем написать такую функцию, как
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). Это имеет то преимущество, что
эта гибкость делает OO настолько мощным.
Кто-то отправил Evil Walrus/ReFactory на Reddit на днях: