Чи є різниця в навчанні OOP на різних мовах програмування? [зачинено]


9

Я хочу навчитися OOP. Я знаю Python і знаю дуже мало речей про OOP.

Але коли я шукав "Learn OOP" на форумах, я побачив хлопця, який сказав, що "Python настільки новий, тому ви не можете навчитися OOP на Python. Ви повинні навчитися Java, а потім зрозуміти OOP на Java"

Це правда? Чи є різниця в розумінні OOP на різних мовах програмування? як вивчити це на Java, C #, C ++, Perl чи Python?


12
"Python настільки новий, що тому ви не можете навчитись OOP на Pyton. Ви навчитесь Java, тоді зрозумієте OOP на Java" Це не має для мене сенсу. Якщо ви хочете навчитися OOP за допомогою Python, я не бачу причин, чому б ні. Дій!
FrustratedWithFormsDesigner

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

2
@JimmyHoffa Це справді. 91 проти 95 згідно Вікіпедії.
Евікатос

2
@JimmyHoffa: давай, це не може бути правдою, хіба що! Ми всі знаємо, що Java була першою мовою ОО. "Сонце голосно віщує новину Яви" ... - Що стосується питання ... чому ви вирішили навчитися ОО? Це скоро буде вимушено. Python - це відмінна відправна точка, щоб зрозуміти переваги численних парадигм програмування.
Ліворуч близько

Відповіді:


10

Об'єкт як теоретична конструкція дуже простий: це структура, яка зберігає дані, функції або те і інше. Ідея полягає в тому, що ці структури мають відчуття «самості», яке мається на увазі у більшості мов поза Python. Це називається "дескриптором" і надає об'єкту точку самопосилання, яка пов'язує дані (змінні або поля) та функції (зазвичай називаються методами) до конкретного конкретного об'єкта. Ідея полягає в тому, що ви спеціально використовуєте змінну або метод, що належить до цього конкретного примірника (виділений блок пам'яті, як правило, під ним), а не якусь більшу, більш загальну конструкцію.

Об'єктні системи, як правило, відрізняються від двох великих категорій: Спадщина та Доступ.

Деякі, наприклад, Java або C ++, ви оголошуєте класи, які діють як "креслення" для об'єктів, які потім виділяються. Ці класи та їх об'єкти не можуть бути структурно модифіковані одноразово. Їх вміст може бути перекрито, оскільки змінні можуть змінюватися, але їх структура є статичною. Наприклад, ви не можете додавати нові методи до HashMap на Java. Ви можете розширити інтерфейс (в основному частково реалізовані класи, що виконуються як контракти) або скласти підклас, щоб отримати необхідні вам додаткові методи або змінні разом із усіма оригінальними змінними та методами відповідного класу.

Інші мови, що базуються на класах, найчастіше цитується як Ruby, дозволяють легко відкривати існуючий клас та просто додавати методи, як вважаєте за потрібне. Це кістка суперечки і багато хто вважає її дуже і дуже небезпечною.

Javascript навіть втрачає більше, об'єкти - це не що інше, як сукупність слотів для змінних чи функцій. Вони можуть бути змінені або перезаписані, коли програміст відчує потребу в цьому. Вони навіть можуть бути довільно клоновані як "прототипи" для інших об'єктів, тим самим передаючи всі свої здібності.

Контроль доступу - це інша велика різниця між різними мовами.

Деякі мови, такі як Java, мають суворо застосовані модифікатори доступу, такі як "приватний" та "захищений", які точно визначають, для яких класів та підкласів можна використовувати певну змінну чи метод.

Інші, наприклад, Python, є менш формальними, використовуючи умову підкреслення перед методом або ім'ям змінної, щоб вказати, що воно є приватним.

Зрештою, Python - це цілком законна мова для програмування об'єктно-орієнтованим способом, вона просто не застосовує її настільки суворо, як деякі інші.


Може бути трохи надто технічним для цього питання.
Зерот

@zeroth, і занадто конкретний теж. Параметр "Я" (або "цей") далеко не універсальний.
Хав'єр

@Javier Тому я сказав, що це явно в Python, а в інших місцях неявне.
Світовий інженер

Питання полягає у вивченні OOP, і я думаю, що обговорення того, як написана мова для виконання певних понять, таких як інкапсуляція, де у нас є privateJava та підкреслення ( __) для Python, є досить важливим. Я думаю, що рівень абстракції Python може зробити його трохи складнішим для початківця, але, безумовно, не неможливо. Java роз'яснює це для програміста, що може зробити деякі концепції трохи легшими.
Дерек Ш

@WorldEngineer Я не говорю про те, щоб бути явним / неявним (також, Python у цьому не є незвичайним), а про просто існуюче як поняття. Деякі мови виконують поліморфну ​​розсилку за всіма параметрами, а не лише на першій. Деякі використовують інші підказки для конкретної версії, і основний стиль може не привілейовувати аргумент як "цей".
Хав'єр

18

Вивчення принципів OOP взагалі не є специфічним для мови, тож якщо під «вивчити OOP» ви маєте на увазі «дізнатися, що означає термінологія, що таке OOP і чому я можу захотіти ним використовувати», то мова не має значення.

Якщо ви маєте на увазі «навчитися розвивати за допомогою OOP», то так, різні мови обробляють це по-різному, але всі вони поділяють один і той же набір принципів. Якщо ти схожий на мене, ти найкраще вчиш це, просто зробивши це. Виберіть об'єктно-орієнтовану мову з хорошим підручником або книгою, яка охоплює об'єктно-орієнтовані аспекти та має на ній. Якщо у вас є принципи об'єктно-орієнтованого дизайну, ви зможете використовувати їх у будь-якій іншій мові ОО.

"Python настільки новий, що тому ви не можете вивчити OOP на Pyton. Ви дізнаєтеся Java, потім зрозумієте OOP на Java"

Це просто болить голова. Стільки неправильного забито в одному реченні.

Пітон датується 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 має ОО, і ви МОЖЕТЕ вивчити поняття ОО. Абсурдно говорити інакше.
кругляки

2
@chubbsondubs Так, це ще перед Явою! ;)
Ізката

1
Просто забезпечити легку зустрічну точку, на основі класу OOP (C ++, Java, Python та багато інших) досить відрізняється від протоколу OOP на основі прототипу (JavaScript є єдиною мовою, якою я знаю, що це використовує). Вони все ще OOP і мають однакові основи і служать безлічі одних і тих же цілей, але багато людей вважають класи частиною того, що вони вважають OOP, тоді як JavaScript їх не має і, безумовно, орієнтований на об'єкти.
KRyan

@KRyan: Якщо ви небайдужі, є ще одна мова, заснована на прототипі ОО, яка називається Self.
Джеррі Коффін

ActionScript має як прототипи, так і класи.
OrangeDog

8

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

Насправді існує різниця між концепціями ООП та реалізацією ООП. Поетично це найкраще зрозуміти, коли ви краще зрозумієте деякі концепції OOP.

Багатьом програмістам стає комфортно лише декілька подібних мов, тому їм не доведеться розширювати свої можливості або страждати від того, що вони не здатні на час.

Отже, питання зводиться до того, чи дійсно Python навчить вас поняттям OOP?

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

Що вам потрібно пам’ятати, це те, що шлях Пітона не є Єдиним Шляхом, а також не Єдиним правильним. Чим більше парадигм програмування ти засвоїш, тим кращим програмістом станеш. Те, як Python робить OOP - це не зовсім те, як це робить C ++ або Java, але концепції передаються добре.


4
Що стосується OOP, Java та C ++ відрізняються одна від одної настільки ж, наскільки відрізняються від Python.
Gort the Robot

Певною мірою, але це багато в чому пов'язано зі зміною знань з мовного дизайну та різними обмеженнями.
Зерот

І, чесно кажучи, 90% концепцій ООП добре переносяться між ними, майже непомітно.
Зерот

Так, я згоден. Мені здається трохи смішним думати про те, що Java та C ++ є "однаковими" щодо OOP.
Gort the Robot

4

Так, реалізація OOP дуже відрізняється. Теорія та принципи однакові, однак так багато людей вважають лише "справжнім OOP" те, що роблять Java та C ++, що ви отримуєте багато посилань, які повинні бути "агностичними мовами", але насправді припускають, що на основі класів є статично типові мови .

Це не означає, що ці посилання погані або навіть обмежені; наприклад, семінарна книга "банди чотирьох" (GoF) "Шаблони дизайну: елементи багаторазового використання об'єктно-орієнтованого програмного забезпечення" - це чудовий приклад чудового твору, який говорить "OOP", коли він насправді означає "OOP на базі статичного класу".

Отже, на мій погляд: так, ви можете дізнатися багато OOP на Python, Javascript, C та багатьох інших мовах; але деякі люди (можливо, майбутній роботодавець), коли запитують "досвід OOP", означають Java / C ++ / C #. Отже, було б розумно перевірити і інший погляд.

(і це не єдині два "типи" OOP ....)


2
Як не дивно, статичний OOP на основі класу - це не те, що Алан Кій спочатку пропонував як OOP. Але багато "OOP" OOP стосується вивчення дизайну / кодування-сенсу, яке не обмежується певним втіленням OOP
Daniel Gratzer

2
Це також може мати сенс подивитися на CLOS: я не думаю, що багато мов / фреймворків пропонують багатометоди.
Джорджіо

2
@jozefg: правильно, Алан Кей одного разу сказав: "Насправді я склав термін" об'єктно-орієнтований ", і я можу вам сказати, що я не мав на увазі C ++".
Хав'єр

1
@Giorgio Насправді Dylan може запропонувати дещо простішу версію CLOS (жодного способу не вказати, коли запускається мультиметод, але набагато простіше підходити)
Daniel Gratzer

4

Об'єктно-орієнтоване програмування - це уявлення про те, як структурувати мову програмування для сприяння низькому з’єднанню, приховуванню інформації (також інкапсуляція), об'єднанню даних та методам, які працюють на цих даних разом, та повторному використанні коду. Багато мов реалізовують свої ідеї, тому між мовами існують варіації того, як вони наближаються до орієнтації на об'єкт. Наприклад, Java дозволяє лише класу розширити 1 клас. Однак Python та C ++ дозволяють розширити будь-яку кількість класів. У Java є конкретні причини його обмежень. Обмеження, призначені для виправлення речей із C ++, але також тому, що Smalltalk підтримує лише один базовий клас.

Мови ОО можна об'єднати у дві сім'ї. Мови сімейства Smalltalk (або OOP на основі класу) включають C ++, Java, Smalltalk, Ruby, C #, Python, щоб назвати декілька (у цій сім'ї є тонни). Це поєднання мов статичного та динамічного типу, і хоча вони дещо відрізняються від деяких понять, вони дуже схожі в тому, як вони думають про OOP. Що я маю на увазі під цим, це те, як вони підходять до з'єднання, інкапсуляції, прив'язки даних та методів, повторного використання коду та інструментів, які вони надають вам для цього. У цій сім'ї багато понять однакові.

Інша сім'я - це прототип, заснований на прототипі. Ці мови виглядають дуже різними у впровадженні OOP. Напевно, найвідоміший приклад цього - Javascript, але Javascript скопіював ці ідеї з LISP Scheme and Object LISP. Це менш відомі мови і, як правило, динамічно набираються. Я не можу думати про статично типізовану мову на основі прототипу, але це не означає, що її немає. Про це можна прочитати тут: http://en.wikipedia.org/wiki/Prototype-based_programming . Справа в тому, що вони підходять до ООП зовсім іншим чином, ніж мови, що базуються на класах. Це означає, що поняття не є такими портативними між цими двома сім'ями. Тільки тому, що ви знаєте ОО в одній родині, не означає, що ви легко перейдете ці ідеї на іншу сім’ю.

Майте на увазі, що більшість мов програмування поєднують поняття з безлічі ідей. Python та Ruby включають як OOP, так і функціональні ідеї програмування у свої мови. І ви можете змішати прототип на основі прототипу з певними розширеннями до мов на основі класів, щоб це було ще складніше.


Я б не зараховував C ++ до родини Smalltalk. Smalltalk заснований на Simula, і Алан Кей навмисно ігнорував більшість змін у Simula-II, тоді як C ++ базується на цьому. C # дивно, його розробили користувачі C ++ та дизайнери Pascal, щоб бути схожим на Java.
Йорг W Міттаг

1

OOP - це принцип програмування - це принципово ідея. Реалізація OOP різниться в різних мовах програмування - але стовпи (абстракція, спадкування, інкапсуляція та поліморфізм) OOP зазвичай є певним або певним чином.

Я скажу, не віддаючи переваги жодній мові, що Java натискає семантику трохи сильніше на програміста, ніж скажімо Python.

Наприклад,

Код Java: class Cat extends Animal {}

Трохи очевидніше, що ви робите в точці зору OOP, ніж:

Код Python: class Cat(Animal):

Звичайно, вони обидва визначають ієрархію класів, в якій Кіт успадковує від Animal. Але я відчуваю, що для програміста, який тільки починається в OOP, застосування та наслідки ідей OOP можуть трохи краще триматися на Java, оскільки це написано для програміста.


1

Ви чітко запитуєте, якою найпростішою мовою є вивчення понять OOP. Я думаю, що відповідь ясна: пітон .

Щоб показати, чому це так, давайте подивимося на типову програму для початківців у Java проти Python. Давайте зробимо просту гру з більш високим догадом.

Java

На Java ви напишете Ігровий клас.

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є примітивним типом. Це особливе.
  • Вам потрібно багато рамкових методів

Пітон

Пітон набагато «чистіший». Примітивних типів немає. Конструктора не існує, існує лише спеціальний метод, який викликається при ініціалізації.

Вам не потрібно взаємодіяти з консоллю, як у вас є REPL. Ви можете просто грати в гру, використовуючи g.guess(35)і повертаючи рядок.

Це полегшує вивчення мови та розуміння основних понять OOP.


0

Основна ідея OOP - це інкапсуляція (що означає поєднання чи приховування) змінних та методів разом у класах (що абсолютно підтримує python). Йдеться про створення коду навколо іменників. Тоді воно звідти продовжується.

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

Я думаю, що простіше вивчити OOP на такій мові, як Java, оскільки мова цього вимагає, а спільнота є менш несприятливою для неї, ніж, скажімо, спільнота python.

Але є багато записів про дизайн та практику ООП, і читання цього не витрачається даремно. Навіть коли я пишу python (що багато), я пишу багато об’єктів, і я використовую багато об’єктів із сторонніх бібліотек.


Ідея коду - це передача повідомлення. Також немає джерела.
Користувач

1
OOP - не про заняття.
Йорг W Міттаг

1
Первісна ідея @Aser Alan Kay стосувалася повідомлень, але з тих пір практика ОО переросла в дизайн за іменником або класами об'єктів. Наприклад, доктор Кей також висловив думку про те, що Java не орієнтована на об'єкти, оскільки вона не підтримує пізнього прив'язки. @ Jorg lol ya ya
Роб

0

Коли ви вивчаєте OOP мовою, ви починаєте думати цією мовою. Мова впливає на те, що ви думаєте, що можна зробити, і як, а також додає аромат OOP.

  • Чи повинен бути збір сміття?
  • Чи можна додати методи до цілих чисел?
  • Чи використовую класи чи прототипи?
  • Як об’єкти відображають себе?

Деякі люди не можуть обійтися ООП без занять. Деякі повинні вбивати свої об'єкти в процесі.

Існує серцевина ООП та оригінальні ідеї про нього. Ви також можете подивитися на Smalltalk, Self, Simula, LISP, Newspeak. А також подивіться на такі типи мов, що не є OOP, такі як bash languages, APL, J. Logical onih Prolog. Haskell (типи класів). Усі вони навчать вас різному мисленню, і ви цього можете навчитися

  • OOP не про імперативні мови
  • OOP - не про заняття

Зрештою, ви можете побачити, для чого хороший OOP. Принаймні, у вас буде інше уявлення про це. Я пропоную знайти переговори Алана Кей .


Якщо ви не дивитесь на мови, ця публікація марна.

Як ви бачите тут: Ми не можемо домовитися про те, що таке OOP.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.