Почему утверждают, что люди на c # не получают объектно-ориентированного программирования? (против класса) - PullRequest
14 голосов
/ 09 сентября 2008

Это привлекло мое внимание прошлой ночью.

В последнем ALT.NET Podcast Скотт Беллвер обсуждает, как в отличие от Ruby, такие языки, как c #, java et al. на самом деле не объектно-ориентированные, а предпочитают фразу «класс-ориентированный». Они очень смутно говорят об этом различии, не вдаваясь в подробности и не обсуждая плюсы и минусы.

Какая здесь реальная разница и насколько это важно? Какие еще языки тогда являются «объектно-ориентированными»? Это звучало довольно интересно, но я не хочу изучать Ruby, просто чтобы знать, что, если что-то мне не хватает.

Обновление : После прочтения некоторых ответов ниже кажется, что люди обычно соглашаются с тем, что речь идет о наборе утки. Но я не уверен, что понимаю до сих пор, хотя это утверждение о том, что это в конечном итоге все так сильно меняет. Особенно, если вы уже делаете правильный тдд со слабой связью, бла-бла-бла. Может кто-нибудь показать мне пример удивительной вещи, которую я мог бы сделать с ruby, которую я не могу сделать с c #, и которая иллюстрирует этот другой упорный подход?

Ответы [ 14 ]

1 голос
/ 17 октября 2008

Я не думаю, что речь идет именно об утке. Например, C # уже поддерживает ограниченную типизацию утки - например, вы можете использовать foreach для любого класса, который реализует MoveNext и Current.

Концепция утиной типизации совместима со статически типизированными языками, такими как Java и C #, в основном это расширение отражения.

Это действительно случай статической и динамической типизации. И то, и другое - правильное, настолько, насколько это возможно. За пределами академии это действительно не стоит обсуждать.

Мусорный код может быть написан любым из них. Отличный код может быть написан на любом. Нет абсолютно никакой функциональности, которую может сделать одна модель, а другая - нет.

Реальная разница заключается в характере выполненного кодирования. Статические типы уменьшают свободу, но преимущество в том, что все знают, с чем имеют дело. Возможность менять экземпляры на лету очень мощная, но цена заключается в том, что становится трудно понять, с чем ты умрешь.

Например, для Java или C # intellisense очень просто - IDE может быстро создать список возможностей. Для Javascript или Ruby это становится намного сложнее.

Для определенных вещей, например, для создания API, с которым кто-то будет кодировать, есть реальное преимущество в статической типизации. Для других, например, для быстрого изготовления прототипов, преимущество заключается в динамике.

Стоит иметь понимание того и другого в вашем наборе навыков, но далеко не так важно, как понимание того, что вы уже используете в реальной глубине.

1 голос
/ 09 сентября 2008

Это был действительно абстрактный подкаст! ​​
Но я вижу, к чему они стремятся - они просто ослеплены Руби Спаркл. Ruby позволяет вам делать вещи, о которых даже программисты на C и Java даже не думают, а комбинации этих вещей позволяют вам достичь невиданных возможностей. Добавление новых методов во встроенный класс String, потому что вы чувствуете, что это происходит, передавая безымянные блоки кода для выполнения другими, смешивания ... Обычные люди не привыкли к объектам, меняющимся слишком далеко от шаблона класса. Это совершенно новый мир наверняка ..

Что касается C #, то ребята не достаточно OO ... не принимайте это близко к сердцу ... Просто примите это как материал, который вы говорите, когда вы ошеломлены словами. Ruby делает это для большинства людей.
Если бы мне пришлось рекомендовать один язык для изучения людьми в текущем десятилетии ... это был бы Ruby. Я рад, что я сделал .. Хотя некоторые люди могут требовать Python. Но это как мое мнение .. человек! : D

0 голосов
/ 09 сентября 2008

Вероятно, это сводится к тому, что эти люди видят, как другие делают в c # и java, в отличие от c # и java, поддерживающих ООП. Большинство языков можно использовать в разных парадигмах программирования. Например, вы можете написать процедурный код на c # и схему, и вы можете выполнять программирование в функциональном стиле на Java. Больше о том, что вы пытаетесь сделать, и о том, что поддерживает язык.

0 голосов
/ 09 сентября 2008

Я сделаю удар.

Python и Ruby напечатаны на утке. Чтобы сгенерировать любой поддерживаемый код на этих языках, вам в значительной степени придется использовать тестовую разработку. Таким образом, для разработчика очень важно легко вводить зависимости в свой код без необходимости создания гигантской вспомогательной среды.

Успешное внедрение зависимостей зависит от наличия довольно хорошей объектной модели. Эти две разновидности одной и той же монеты. Если вы действительно понимаете, как использовать ООП, то вам по умолчанию следует создавать проекты, в которые можно легко вводить зависимости.

Поскольку внедрение языков в динамически типизированных языках проще, разработчики Ruby / Python чувствуют, что их язык понимает уроки ОО гораздо лучше, чем другие статически типизированные аналоги.

...