Зразок коду для пояснення проблеми «Джунглями бананової мавпи» Джо Армстронга [закрито]


14

У книзі Кодери на роботі Джо Армстронг заявив, що:

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

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



Шкода, що це закрилося - це дало добрі дискусії. Подивіться на функції першого класу як на стартері.
Роббі Ді

1
@Euphoric Обговорення типу дійсно дозволено, але які питання є суб'єктивними, можуть бути ... суб'єктивними.
Роббі Ді

2
Я вважаю, що це інтерв'ю було проведено ще до того, як Джо Армстронг написав кандидатську дисертацію. Під час написання докторської дисертації Армстронг дізнався про реальне визначення ОО і зрозумів, що Ерланг насправді ретельно об'єктно-орієнтований, насправді, з усіх сучасних основних мов, Ерланг - це, мабуть, найбільш об'єктно-орієнтована мова! Він би не робив цього твердження таким чином, якби знав, що Ерланг насправді є мовою ОО. Те, про що він говорить, - це влада навколишнього середовища , яка абсолютно відзначає, що стосується ОО.
Йорг W Міттаг

1
Привіт, моє запитання полягає у наданні зразкового коду, який допомагає мені (та іншим) зрозуміти проблему краще. Будь-який фрагмент коду, який демонструє проблему, є прийнятним, а не лише думкою.
Kha Nguyễn

Відповіді:


16

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

public class Banana
{
    public Monkey Owner {get;}
}

public class Monkey
{
    public Jungle Habitat {get;}
}

public class Jungle
{
}

Якщо ви використовуєте Banana, транзитивно необхідно також залежати від Monkeyі Jungle.

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

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

Можливою абстракцією може бути:

public class Banana
{
    public IBananaOwner Owner {get;}
}

public interface IBananaOwner
{
}

public class Monkey : IBananaOwner
{
    public Jungle Habitat {get;}
}

public class Jungle
{
}

Таким чином, ви знаєте, що Bananaмає власника, але це не повинно бути Monkey. Це може бути що завгодно. І це обмежує те, що може Bananaробити власник лише операціями, визначеними IBananaOwner, що спрощує міркування.


І навпаки, хоча функціональні мови підтримують функції першого класу поза рамками - це не означає, що функцію X можна спокійно споживати функцією Y без побічних ефектів.
Роббі Ді

Незважаючи на те, що ви чудово відмічаєте, я думаю, що ви можете трохи піти звідси. Цитата прямо вказує на оточення, а не на те, як був розроблений код.
Роббі Ді

@RobbieDee Monkeyі Jungleє середовищем для Banana. Вводячи подібну абстракцію IBananaOwner, середовище стає явним. І як сконструйовано це середовище, - в чому полягає його проблема.
Ейфорія

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

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

13

Горили - не мавпи!

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

Це надзвичайний приклад і не завжди буде таким поганим. Але не рідкість опинитися в такій системі ОО. І тому, щоб перевірити цей getBananaметод, мені потрібно придумати чи знущатися над цілим лісом.


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