Есть ли разница в изучении ООП на разных языках программирования? [закрыто]


9

Я хочу выучить ООП. Я знаю Python и очень мало знаю об ООП.

Но когда я искал «изучить ООП» на форумах, я увидел парня, который сказал, что «Python настолько нов, что вы не можете изучать ООП на Python. Вы должны изучить Java, а затем понять ООП на Java»

Это правда? Есть ли разница в понимании ООП на разных языках программирования? как узнать это на Java, C #, C ++, Perl или Python?


12
«Python настолько новый, поэтому вы не можете изучать ООП на Pyton. Вы изучаете Java, а затем понимаете ООП на Java». Это не имеет смысла для меня. Если вы хотите изучать ООП на Python, я не вижу причин, почему бы и нет. Действуй!
FrustratedWithFormsDesigner

13
Разве Python не старше Java? Я верю, что это так, но я могу быть через пару лет.
Джимми Хоффа

2
@JimmyHoffa Это действительно так. 91 против 95 согласно Википедии.
Evicatos

2
@JimmyHoffa: давай, это не может быть правдой, не так ли! Мы все знаем, что Java была первым языком OO. «Солнце громко возвещает новизну Java» ... - Что касается вопроса ... почему вы полны решимости изучать ОО? Это будет навязано вам достаточно скоро. Python является отличной отправной точкой для понимания преимуществ нескольких парадигм программирования.
оставил около

Ответы:


10

Объект как теоретическая конструкция очень прост: это структура, которая хранит данные, функции или и то, и другое. Идея состоит в том, что эти структуры имеют чувство «я», которое неявно присутствует в большинстве языков за пределами Python. Это называется «дескриптором» и дает объекту точку самоссылки, которая связывает данные (переменные или поля) и функции (обычно называемые методами) с конкретным объектом, о котором идет речь. Идея заключается в том, что вы специально используете переменную или метод, который принадлежит этому конкретному экземпляру (выделенному блоку памяти, как правило, ниже), а не какой-то более крупной, более общей конструкции.

Объектные системы имеют тенденцию варьироваться в отношении двух больших категорий: наследование и доступ.

В некоторых, например в Java или C ++, вы объявляете классы, которые действуют как «чертежи» для объектов, которые затем выделяются. Эти классы и их объекты не могут быть структурно изменены после создания экземпляра. Их содержимое может быть переопределено в том смысле, что переменные могут изменяться, но их структура является статической. Например, вы не можете добавлять новые методы в HashMap в Java. Вы можете расширить интерфейс (в основном частично реализованные классы, служащие контрактами) или создать подкласс, чтобы получить дополнительные методы или переменные, которые вам нужны, вместе со всеми исходными переменными и методами конкретного рассматриваемого класса.

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

Javascript еще слабее, объекты - это не что иное, как набор слотов для переменных или функций. Они могут быть изменены или перезаписаны всякий раз, когда программист чувствует необходимость в этом. Их можно даже произвольно клонировать как «прототипы» для других объектов, тем самым передавая все свои способности.

Контроль доступа является еще одной большой разницей между различными языками.

Некоторые языки, такие как Java, имеют очень строго обязательные модификаторы доступа, такие как «private» и «protected», которые точно определяют, какие классы и подклассы могут использовать данную переменную или метод.

Другие, такие как Python, менее формальны и используют соглашение о подчеркивании перед именем метода или переменной, чтобы указать, что оно является закрытым.

В конечном счете, Python является совершенно законным языком для программирования объектно-ориентированным способом, но он не обеспечивает его столь же строго, как некоторые другие.


Может быть, слишком техническим для этого вопроса.
Zeroth

@zeroth, и слишком конкретный тоже. Параметр self (или this) далеко не универсален.
Хавьер

@Javier Вот почему я сказал, что это явно в Python и неявно в другом месте.
Мировой инженер

Вопрос заключается в изучении ООП, и я думаю, что обсуждение того, как язык написан для реализации определенных концепций, таких как Encapsulation, где мы имеем privateдля Java, и подчеркивание ( __) для Python, является довольно важным. Я думаю, что уровень абстракции Python может сделать его немного более сложным для начинающего, но определенно не невозможным. Java излагает это для программиста, что может сделать некоторые концепции более легкими.
Дерек Вт

@WorldEngineer Я не говорю о явном / неявном (также Python не редкость в этом), а просто о существовании как концепции. Некоторые языки полиморфно распределяются по всем параметрам, а не только по первым. Некоторые используют другие подсказки для конкретной версии, и основной стиль может не давать аргументу права «this».
Хавьер

18

Изучение принципов ООП вообще не зависит от языка, поэтому, если под «изучать ООП» вы подразумеваете «узнать, что означает терминология, что такое ООП и почему я мог бы использовать ее», то язык не имеет значения.

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

«Python настолько новый, поэтому вы не можете изучать ООП на Pyton. Вы изучаете Java, а затем понимаете ООП на Java»

Это только делает мою голову болит. Столько неверно втиснуто в одно предложение.

Python датируется 1989 годом.

http://python-history.blogspot.com/2009/01/brief-timeline-of-python.html

Ява до 1995.

http://www.oracle.com/technetwork/java/javase/overview/javahistory-index-198355.html

Вы можете сделать свои собственные выводы о обоснованности этого совета ...


1
Да, но Python 1.0 не был до 1994 года. Java была в разработке довольно долго, прежде чем она также была выпущена. Но я согласен с тем, что в Python есть OO, и вы МОЖЕТЕ изучить его концепции. Абсурдно говорить иначе.
Chubbsondubs

2
@chubbsondubs Да, это все еще до Java! ;)
Изката

1
Чтобы просто обеспечить легкий контрапункт, ООП на основе классов (C ++, Java, Python и многие другие) довольно сильно отличается от ООП на основе прототипов (единственный известный мне язык JavaScript использует это). Они все еще ООП и имеют те же самые основы и служат многим тем же целям, но многие люди считают классы частью того, что они считают ООП, в то время как JavaScript не имеет их и определенно объектно-ориентирован.
KRyan

@KRyan: Если вам не все равно, есть еще один ОО-язык на основе прототипа, который называется Self.
Джерри Коффин

ActionScript имеет как прототипы, так и классы.
OrangeDog

8

Я думаю, что человек, которого вы цитируете, просто демонстрировал языковой шовинизм.

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

Многим программистам становится комфортно с несколькими подобными языками, поэтому им не нужно расширять свои возможности или страдать, если они не способны какое-то время.

Таким образом, вопрос сводится к тому, действительно ли Python научит вас концепциям ООП?

Я скажу, что вы можете, при условии, что у вас есть адекватная поддержка обучения, которая заставляет вас пробовать вещи, которые вы обычно не изучаете в процессе самостоятельного обучения. Лучше всего подойдет книга или какой-нибудь наставник. Марк Лутц пишет очень глубокие, очень подробные и очень отличные книги по Python, и я бы порекомендовал его книги, потому что они подтолкнут вас к тому, чтобы делать больше и узнавать больше.

То, что вы должны помнить, это то, что путь Python - это не Единственный и не Единственный правильный путь. Чем больше парадигм программирования вы освоите, тем лучше станете программистом. Python делает ООП не совсем так, как это делает C ++ или Java, но концепции хорошо переносятся.


4
С точки зрения ООП, Java и C ++ отличаются друг от друга так же, как и Python.
Gort the Robot

В некоторой степени, но это в значительной степени связано с изменением знаний о дизайне языка и различными ограничениями.
Zeroth

И, честно говоря, 90% концепций ООП хорошо передаются между ними, даже почти незаметно.
Zeroth

Да, я согласен. Мне немного смешно думать, что Java и C ++ "одинаковы" с точки зрения ООП.
Gort the Robot

4

Да, реализации ООП очень разные. Теория и принципы одинаковы, но так много людей считают, что Java и C ++ делают только "настоящий ООП", что вы получаете много ссылок, которые должны быть "независимыми от языка", но фактически предполагают основанные на классах языки со статической типизацией ,

Это не значит, что эти ссылки плохие или даже ограниченные; например, основополагающая книга «банды четырех» (GoF) «Шаблоны проектирования: элементы многоразового объектно-ориентированного программного обеспечения» является ярким примером великой работы, которая говорит «ООП», когда она действительно означает «ООП на основе статического класса».

Итак, на мой взгляд: да, вы можете выучить много ООП на Python, Javascript, C и многих других языках; но некоторые люди (возможно, будущий работодатель), когда спрашивают о «опыте ООП», имеют в виду Java / C ++ / C #. Так что было бы разумно проверить и эту другую точку зрения.

(и это не единственные два «типа» ООП ....)


2
По иронии судьбы статический ООП на основе классов - это не то, что Алан Ки первоначально предложил как ООП. Но большая часть «изучения» ООП связана с изучением дизайна / смысла кодирования, который строго не ограничен конкретной реализацией ООП
Даниэль Гратцер,

2
Также может иметь смысл взглянуть на CLOS: я не думаю, что многие языки / платформы предлагают мультиметоды.
Джорджио

2
@jozefg: верно, однажды Алан Кей сказал: «На самом деле я придумал термин« объектно-ориентированный », и я могу сказать, что я не имел в виду C ++».
Хавьер

1
@Giorgio На самом деле Дилан может предоставить немного более простую версию CLOS (невозможно указать, когда запускается мультиметод, но гораздо проще подходить)
Даниэль Гратцер,

4

Объектно-ориентированное программирование - это идея о том, как структурировать язык программирования для обеспечения слабой связи, сокрытия информации (иначе говоря, инкапсуляции), объединения данных и методов, которые оперируют этими данными, и повторного использования кода. Многие языки реализуют свои взгляды на эти идеи, поэтому существуют различия между языками относительно того, как они подходят к объектно-ориентированной. Например, Java только позволяет классу расширять 1 класс. Тем не менее, Python и C ++ позволяют расширять любое количество классов. У Java есть определенные причины для его ограничений. Ограничения, которые предназначены для исправления ошибок в C ++, а также потому, что Smalltalk поддерживает только один базовый класс.

ОО языки могут быть сгруппированы в две семьи. Семейство языков Smalltalk (или ООП на основе классов) включает в себя C ++, Java, Smalltalk, Ruby, C #, Python и многие другие (в этом семействе есть тонны). Это смесь языков статического и динамического типов, и хотя они немного отличаются по некоторым понятиям, они очень похожи в том, как они думают об ООП. Под этим я подразумеваю, как они подходят к связыванию, инкапсуляции, привязке данных и методов, повторному использованию кода и инструментам, которые они предоставляют для этого. Внутри этой семьи многие понятия одинаковы.

Другое семейство - ООП на основе прототипа. Эти языки выглядят очень по-разному в своей реализации ООП. Вероятно, наиболее известным примером этого является Javascript, но Javascript скопировал эти идеи из LISP Scheme и Object. Это менее известные языки и обычно динамически типизированные. Я не могу думать о статически типизированном языке, основанном на прототипах, но это не значит, что его нет. Вы можете прочитать об этом здесь: http://en.wikipedia.org/wiki/Prototype-based_programming . Дело в том, что они подходят к ООП совсем не так, как языки на основе классов. Это означает, что понятия не так переносимы между этими двумя семействами. То, что вы знаете ОО в одной семье, не означает, что вы легко перенесете эти идеи в другую семью.

Имейте в виду, что большинство языков программирования сочетают понятия с множеством идей. Python и Ruby включают идеи ООП и функционального программирования в свои языки. И вы можете смешивать ОО на основе прототипов с определенными расширениями для языков на основе классов, так что это еще более сложно.


Я бы не стал считать C ++ в семействе Smalltalk. Smalltalk основан на Simula, и Алан Кей сознательно проигнорировал большинство изменений в Simula-II, тогда как C ++ основан на этом. C # странно, он был разработан пользователями C ++ и дизайнерами Pascal как Java.
Йорг Миттаг

1

ООП - это принцип программирования - это принципиально идея. Реализация ООП варьируется в разных языках программирования - но столбы (абстракция, наследование, инкапсуляция и полиморфизм) ООП обычно присутствуют в той или иной форме.

Я скажу без предпочтения любого языка, что Java продвигает семантику немного сложнее для программиста, чем, скажем, Python.

Например,

Java-код: class Cat extends Animal {}

Немного более очевидно, что вы делаете с точки зрения ООП, чем:

Код Python: class Cat(Animal):

Конечно, они оба определяют иерархию классов, в которой Cat наследуется от Animal. Но я чувствую, что для программиста, только начинающего работать с ООП, применение и смысл идей ООП могли бы быть немного лучше в Java, так как он предназначен для программиста.


1

Вы явно спрашиваете, какой самый простой язык для изучения концепций ООП. Я думаю, что ответ ясен: питон .

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

Ява

На Java вы напишете класс Game.

public class Game {
    public int secretNumber;
    public int tries;

    public Game(int tries, int secretNumber) {
        this.tries = tries;
        this.secretNumber = secretNumber;
    }

    public void guess(int myNumber) {
        if(myNumber > secretNumber)
            System.out.println("Your guess is too high!");
        else if (myNumber < secretNumber)
            System.out.println("Your guess is too low!");
        else
            System.out.println("You win!!");
        tries = tries - 1;
        if(tries == 0) {
            System.out.println("No more tries: you lose :(");
        }
    }

    public static void main(String[] args) {
        Game game = new Game(10, 47);
        while(true) {
            // how do I read a newline again? Something with BufferedInputStreamReader?
            // how do I convert a String to a number?
        }
    }
}

Я опытный программист, и даже у меня возникают трудности. Кроме того, посмотрите, что вы должны объяснить будущему ученику для этой простой программы:

  • Статические методы
  • Видимость (публичный против частного). Вы должны всегда отмечать поля как частные.
  • this. нотация для ссылки на переменные, когда они маскируются другими
  • Конструктор напоминает метод, но не является методом.
  • System.outявляется выходным потоком. И да, это поле, но это staticполе.
  • Иногда вы можете опустить фигурные скобки, если есть только одно утверждение
  • String[]это массив. Это особый тип объекта, но опять же, не совсем.
  • intэто примитивный тип. Это особенное.
  • Вам нужно много каркасных методов

питон

Python намного «чище». Там нет примитивных типов. Конструктор не существует, есть только специальный метод, который вызывается при инициализации.

Вам не нужно взаимодействовать с консолью, так как у вас есть REPL. Вы можете просто играть в игру, используя g.guess(35)и возвращая строку.

Это облегчает изучение языка и понимание основных концепций ООП.


0

Основная идея в ООП заключается в инкапсуляции (что означает объединение или скрытие) переменных и методов вместе внутри классов (что Python абсолютно поддерживает). Речь идет о разработке вашего кода вокруг существительных. Тогда это отчасти продолжается.

Хотя есть различия в реализации (например, python не поддерживает видимость, как в Java) и синтаксические различия (в Javascript вы должны наследовать методы самостоятельно), базовый дизайн остается прежним.

Я действительно думаю, что изучать ООП легче на языке, подобном Java, тем не менее, потому что язык требует этого, и сообщество менее противно, чем, скажем, сообщество Python.

Но есть множество писем о дизайне и практиках ООП, и чтение это не напрасная работа. Даже когда я пишу на python (что очень много), я пишу много объектов и использую много объектов из сторонних библиотек.


Идея кода - передача сообщений. Также нет источника.
Пользователь

1
ООП не о классах.
Йорг Миттаг

1
@ Пользователь оригинальной идеи Алана Кея был об обмене сообщениями, но с тех пор практика ОО превратилась в дизайн по существительному или классам объектов. Например, доктор Кей также считает, что Java не является объектно-ориентированной, поскольку не поддерживает позднюю привязку. @ Jorg LOL YA YA
Роб

0

Когда вы изучаете ООП на языке, вы начинаете думать на этом языке. Язык влияет на то, что, как вы думаете, можно сделать и как, а также добавляет изюминку в ООП.

  • Должна ли быть сборка мусора?
  • Могу ли я добавить методы к целым числам?
  • Я использую классы или прототипы?
  • Как объекты отражаются на себе?

Некоторые люди не могут делать ООП без занятий. Некоторые должны убить свои объекты в процессе.

Существует ядро ​​ООП и оригинальные идеи о нем. Вы также можете взглянуть на Smalltalk, Self, Simula, LISP, Newspeak. А также взглянем на не-ООП языковые типы, такие как языки потока данных bash, APL, J. Logical, Prolog. Хаскель (тип занятий). Все они научат вас другому мышлению, и вы можете узнать, что

  • ООП не о императивных языках
  • ООП не о классах

И в конце вы можете увидеть, для чего ООП хорош. По крайней мере, у вас будет другое представление об этом. Я предлагаю найти беседы Алана Кея .


Если вы не смотрите на языки, этот пост бесполезен.

Как вы можете видеть здесь: мы не можем договориться о том, что такое ООП.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.