Переваги класичного OOP над Go-подібною мовою


13

Я багато думав про дизайн мови та про те, які елементи будуть потрібні для "ідеальної" мови програмування, а вивчення Google Go Go спонукало мене до сумнівів у багатьох інакше загальних знаннях.

Зокрема, Go, здається, має всі цікаві переваги від об'єктно-орієнтованого програмування, не маючи насправді жодної структури об'єктно-орієнтованої мови. Не існує класів, лише структури; не існує спадкування класу / структури - лише вбудовування структури. Немає ніяких ієрархій, батьківських класів, явних реалізацій інтерфейсу. Натомість правила кастингу типу базуються на нещільній системі, подібній до типізації качок, так що якщо структура реалізує необхідні елементи "Reader" або "Request" або "Encoding", ви можете надати її та використати як один.

Чи є щось про OOP, як це реалізовано в C ++ та Java та C #, що за своєю суттю є більш здатним, більш доступним, якимось потужнішим, що вам доведеться відмовитися, переходячи до такої мови, як Go? Якої ви користі відмовитися, щоб отримати простоту, яку представляє нова парадигма?

EDIT
Видалено "застаріле" питання, яке, здавалося, читачам було надмірно затримане та розлючене.

Питання полягає в тому, що може запропонувати традиційна об'єктно-орієнтована парадигма (з ієрархіями тощо), що часто зустрічається в загальних мовних реалізаціях, що в цій простішій моделі неможливо зробити так просто? Або, інакше кажучи, якби ви сьогодні розробляли мову, є причина, яку ви хочете включити в поняття ієрархії класів?


1
Чи OOP зробив застаріле процедурне програмування? Я ненавиджу звучати педантично або про те, що я говорю з вами, але це було перше речення, яке прийшло в голову. Go надає нову (іш) парадигму. Експериментуючи, користувачі дізнаються, у чому це добре, а що не добре (як у всіх парадигмах та мовах), і ми закінчимося сотнями чудових продуктів (разом із неабиякою часткою поганих продуктів), написаних на Go . Принаймні, така моя думка
Джеймі Тейлор

1
Є кілька цікавих читань, коли Google для OOP мертвий . Я рекомендую, що Мережа вмре, коли OOP вмирає
Andomar

В OOP є така маленька цінність, що зовсім не варто витрачати свій час.
SK-логіка

1
Я згоден з попереднім коментарем, не зосереджуйтеся на OOP занадто багато. Крім того, OOP не означає C ++ або Java. Спробуйте прочитати abit на ltu.org
AndreasScheinert

C ++, Java та C # не є "класичними" мовами OOP. Якщо є класична мова OOP, я думаю, що це Smalltalk.
кевін клайн

Відповіді:


16

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

Багато мов, які надають ці функції, не мають аналога поняття класу - наприклад, Javascript та Common Lisp. Реалізація, що надається Java-подібними мовами (на основі класів, з єдиним успадкуванням, інтерфейсами, на основі типів), є лише однією з можливостей, не обов'язково найкращою.


11
+1 для "не обов'язково найкращого". Посилаючись на Алана Кей: "Я винайшов термін" Об'єктно-орієнтований ", і можу вам сказати, що я не мав на увазі C ++". (а також у нього не було C # та / або Java, я б покірно здогадався)
herby

1
@herby Я бачив, що це дозволяє припустити, що агентні системи (подібні до того, як працює Ерланг) ближче до можливого наміру Алана Кей щодо ООП.
CodexArcanum

2
Ер, у звичайного Ліспа безумовно є заняття. Але, як правило, клас CL містить дані та методи, визначені на "загальних функціях". Як побічний ефект, це дає вам зручний спосіб здійснення декількох відправлень, оскільки методи вже не тісно поєднані з "єдиним класом реалізації".
Ватін

Так, я мав на увазі те, що в ньому немає занять у сенсі Java
Андреа

5

Якої ви користі відмовитися, щоб отримати простоту, яку представляє нова парадигма?

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

Чи застаріла така система застарілу концепцію ООП?

Ні. Поки ви можете скласти програму з точки зору "об'єктів, які роблять речі", а не з переліком інструкцій, або заявленого набору правил, або каскадної серії функцій ... реалізація не має значення. Так само зміна системи типів не приводить до недійсності жодного із загальних принципів ОО.

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

Як мова дозволяє, це насправді не має значення.


Насправді, Go робить всі ці речі ООП простіше і додає кілька додаткових можливостей , як розширення типу , щоб забезпечити новий інтерфейс застосування існуючих екземплярів ( до тих пір , поки ви не потрібні нові елементи даних, звичайно).
Ян Худек

4

Я думаю, що Ваша ідея про ООП зовсім не така:

Я вигадав термін "Об'єктно-орієнтоване програмування", і це {Java і C ++} - це не те, що я мав на увазі.
- Алан Кей .

Вибір введення тексту (номінативний підтип, структурний підтипізація або типізація качок - або їх комбінація) значною мірою ортогональний для ООП. Успадкування та заняття повністю ортогональні для ООП. Якщо вам знадобиться якийсь час, щоб пограти з io, ви приїдете до цього.

Тепер ви можете запитати, який тип типів систем "кращий", а також які засоби повторного використання та комбінації коду. І спробуйте визначити переваги та недоліки між варіантами, зробленими в Simula (а пізніше здійсненими в C ++, Java та C #), та тими, які зроблені в Go. Але це все різні і чіткі питання.

Зрештою, OOP - це дуже розпливчаста концепція, і всі спроби її втілення мають різноманітні смаки. Але для дійсного спрощення речей я б сказав, що основна ідея OOP полягає у створенні систем підсистем SOLID . Тепер це абсолютно розмиває межу з іншими парадигмами, але я б припускав, що це причина, чому мови багатопарадигми останнім часом набули популярності і чому Google взяв власну думку з Go.


2
Питання стосується понять, а не термін. Якщо ви можете придумати кращу назву, ніж "OOP", щоб посилатися на концепцію ієрархій класів та всіх обрізків, що входять до неї, то ми можемо використовувати це замість цього.
tylerl

@tylerl: Ви плутаєте принаймні два запитання в одне. Одне полягає в тому, чи краще структурна підтипізація, ніж номінативна підтипізація. Інший - в основному, чи склад краще, ніж спадкування. Ці питання є взаємно ортогональними. Я думаю, що зрештою "найкраща" мова не робить для вас цього вибору. Я б припускав, що у Go просто є інший набір питань, але ми побачимо, додає Google ці функції "назад" чи ні.
back2dos

Я хотів би лише однієї мови, яка має більшість можливостей C ++, але була меншою та простішою. C ++ є єдиною мовою, крім C, реалістичною для ядер, і вона дає вам надзвичайно корисні інструменти, такі як деструктори та STL. І важливий принцип "якщо ти не використовуєш його, ти не платиш за нього". OO, правильно використаний, надзвичайно потужний. Але дженерики та інші концепції, що не належать до ОО, також життєво необхідні. C майже нічого не дам, і Go відкидає справжній OO за якісь дивні новомодні ідеї.
Ерік Алапяа

1

OOP не застаріло.

Як сказала Андреа, було запропоновано багато концепцій як альтернативу класам (наприклад, тип класу haskell). OOP має одну велику користь: її викладають у багатьох місцях, а культуру ООП багато в чому поділяють серед розробників.

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


1
Я думаю: в багатьох місцях відтанув. Насправді це не перевага.
AndreasScheinert

@AndreasScheinert чому б це не було перевагою?
Саймон Берго

Тому що для того, щоб зробити судження, ви повинні знати, якби не було 1 альтернативи однаково добре. Це питання звички, люди люблять перебувати в зоні комфорту, і це призводить до застою.
AndreasScheinert

@AndreasScheinert використовуйте правильний інструмент для роботи. Oop працює не для всіх сценаріїв .... не має нічого спільного з їх зоною комфорту
pqsk

1

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

Ви можете стверджувати, що це просто випадок висновку проти чіткого викладу, який є не що інше, як "нова парадигма" і справді просто зручніший.

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