HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Это перевод статьи Джо Армстронга Why OO Sucks, повествование ведётся от имени автора оригинальной публикации.</p>
1 <p>Это перевод статьи Джо Армстронга Why OO Sucks, повествование ведётся от имени автора оригинальной публикации.</p>
2 <p>Когда я впервые познакомился с объектно-ориентированным программированием (ООП), мне не понравилась эта идея. Не знаю, почему именно - просто почувствовал, что здесь что-то не так. После появления ООП эта парадигма стала очень популярной, а её критика считалась дурным тоном. Объектная ориентированность стала чем-то, что должно обязательно быть в каждом "нормальном" языке программирования.</p>
2 <p>Когда я впервые познакомился с объектно-ориентированным программированием (ООП), мне не понравилась эта идея. Не знаю, почему именно - просто почувствовал, что здесь что-то не так. После появления ООП эта парадигма стала очень популярной, а её критика считалась дурным тоном. Объектная ориентированность стала чем-то, что должно обязательно быть в каждом "нормальном" языке программирования.</p>
3 <p>Когда Erlang стал популярным, у нас часто спрашивали, относится ли он к объектно-ориентированным языкам. Правдивый ответ на этот вопрос должен быть таким: "Конечно, нет, Erlang не объектно-ориентированный язык". Но мы не хотели акцентировать на этом внимание, поэтому придумали уловку. Мы говорили вслух, что Erlang в некотором роде является объектно-ориентированным языком. Такой ответ удовлетворял тех, кому везде нужна объектная ориентированность. Но вдумчивый собеседник слышал в этом ответе правильный посыл: "Erlang - не совсем объектно-ориентированный язык".</p>
3 <p>Когда Erlang стал популярным, у нас часто спрашивали, относится ли он к объектно-ориентированным языкам. Правдивый ответ на этот вопрос должен быть таким: "Конечно, нет, Erlang не объектно-ориентированный язык". Но мы не хотели акцентировать на этом внимание, поэтому придумали уловку. Мы говорили вслух, что Erlang в некотором роде является объектно-ориентированным языком. Такой ответ удовлетворял тех, кому везде нужна объектная ориентированность. Но вдумчивый собеседник слышал в этом ответе правильный посыл: "Erlang - не совсем объектно-ориентированный язык".</p>
4 <p>В такие моменты я вспоминал слова руководителя подразделения IBM во Франции, которые он сказал на открытии конференции IEEE Logic в Париже. В языке Prolog разработчики IBM добавили много объектно-ориентированных расширений. На вопрос "зачем это сделано" руководитель ответил: "Наши потребители хотели, чтобы Prolog был объектно-ориентированным, поэтому мы сделали его объектно-ориентированным".</p>
4 <p>В такие моменты я вспоминал слова руководителя подразделения IBM во Франции, которые он сказал на открытии конференции IEEE Logic в Париже. В языке Prolog разработчики IBM добавили много объектно-ориентированных расширений. На вопрос "зачем это сделано" руководитель ответил: "Наши потребители хотели, чтобы Prolog был объектно-ориентированным, поэтому мы сделали его объектно-ориентированным".</p>
5 <p>Я тогда подумал: "Как всё просто объясняется, и никаких сомнений и колебаний, никаких вопросов насчёт того, действительно ли нужно делать Prolog объектно-ориентированным языком".</p>
5 <p>Я тогда подумал: "Как всё просто объясняется, и никаких сомнений и колебаний, никаких вопросов насчёт того, действительно ли нужно делать Prolog объектно-ориентированным языком".</p>
6 <h2>Содержание</h2>
6 <h2>Содержание</h2>
7 <ul><li><a>Так почему же объектно-ориентированное программирование - это плохо?</a></li>
7 <ul><li><a>Так почему же объектно-ориентированное программирование - это плохо?</a></li>
8 <li><a>Возражение 2: всё есть объект</a></li>
8 <li><a>Возражение 2: всё есть объект</a></li>
9 <li><a>Возражение 3: в объектно-ориентированных языках определения типов данных распространяются везде</a></li>
9 <li><a>Возражение 3: в объектно-ориентированных языках определения типов данных распространяются везде</a></li>
10 <li><a>Возражение 4: у объектов есть приватное состояние</a></li>
10 <li><a>Возражение 4: у объектов есть приватное состояние</a></li>
11 <li><a>Почему же ООП популярно?</a></li>
11 <li><a>Почему же ООП популярно?</a></li>
12 </ul><h2>Так почему же объектно-ориентированное программирование - это плохо?</h2>
12 </ul><h2>Так почему же объектно-ориентированное программирование - это плохо?</h2>
13 <p>Моя оценка ООП касается основных принципов этой парадигмы. Мои возражения против некоторых из них приводятся ниже.</p>
13 <p>Моя оценка ООП касается основных принципов этой парадигмы. Мои возражения против некоторых из них приводятся ниже.</p>
14 <h3>Возражение 1: структуры данных и функции не должны быть связанными друг с другом</h3>
14 <h3>Возражение 1: структуры данных и функции не должны быть связанными друг с другом</h3>
15 <p>Объекты связывают функции и структуры данных в неделимые единицы. Я думаю, что это фундаментальная ошибка, так как объекты и функции принадлежат разным мирам. Почему?</p>
15 <p>Объекты связывают функции и структуры данных в неделимые единицы. Я думаю, что это фундаментальная ошибка, так как объекты и функции принадлежат разным мирам. Почему?</p>
16 <p>Функции что-то делают. Они что-то принимают и что-то возвращают. То, что они принимают и возвращают - структуры данных, которые меняются с помощью функций. В большинстве языков программирования функции состоят из последовательностей команд - сделай это, а затем сделай то. Чтобы понять функции, нужно понять, в какой последовательности выполняются команды. В функциональных языках программирования с ленивыми вычислениями и в логических языках программирования последовательность играет меньшее значение.</p>
16 <p>Функции что-то делают. Они что-то принимают и что-то возвращают. То, что они принимают и возвращают - структуры данных, которые меняются с помощью функций. В большинстве языков программирования функции состоят из последовательностей команд - сделай это, а затем сделай то. Чтобы понять функции, нужно понять, в какой последовательности выполняются команды. В функциональных языках программирования с ленивыми вычислениями и в логических языках программирования последовательность играет меньшее значение.</p>
17 <p>В свою очередь, структуры данных просто существуют. Они не выполняют действий и они изначально декларативны. Понять структуры данных намного проще, чем понять функции.</p>
17 <p>В свою очередь, структуры данных просто существуют. Они не выполняют действий и они изначально декларативны. Понять структуры данных намного проще, чем понять функции.</p>
18 <p>Функции можно представить в виде чёрных ящиков, которые принимают что-то на вход, выполняют действия и возвращают что-то. Если я понимаю, что функция принимает и возвращает, я понимаю функцию. Но это не значит, что я могу её написать.</p>
18 <p>Функции можно представить в виде чёрных ящиков, которые принимают что-то на вход, выполняют действия и возвращают что-то. Если я понимаю, что функция принимает и возвращает, я понимаю функцию. Но это не значит, что я могу её написать.</p>
19 <blockquote><p>Подробнее о представлении функции как ящика можно узнать из нашего бесплатного курса<a>"Введение в программирование"</a>.</p>
19 <blockquote><p>Подробнее о представлении функции как ящика можно узнать из нашего бесплатного курса<a>"Введение в программирование"</a>.</p>
20 </blockquote><p>Обычно "понимание" ограничивается наблюдением, что функция - это часть вычислительной системы, чья работа - изменять структуры данных типа Т1 в структуры данных типа Т2.</p>
20 </blockquote><p>Обычно "понимание" ограничивается наблюдением, что функция - это часть вычислительной системы, чья работа - изменять структуры данных типа Т1 в структуры данных типа Т2.</p>
21 <p>Так как функции и структуры данных имеют разную природу, не надо считать их одинаковыми и работать с ними как с одинаковыми сущностями.</p>
21 <p>Так как функции и структуры данных имеют разную природу, не надо считать их одинаковыми и работать с ними как с одинаковыми сущностями.</p>
22 <h2>Возражение 2: всё есть объект</h2>
22 <h2>Возражение 2: всё есть объект</h2>
23 <p>Представьте себе<em>time</em>. В объектно-ориентированном языке<em>time</em>должно быть объектом. В Smalltalk даже число 3 - объект. Но в языках, которые не относятся к объектно-ориентированным,<em>time</em>- экземпляр типа данных. Например, в Erlang есть много разных вариантов времени, которые можно чётко и однозначно определить.</p>
23 <p>Представьте себе<em>time</em>. В объектно-ориентированном языке<em>time</em>должно быть объектом. В Smalltalk даже число 3 - объект. Но в языках, которые не относятся к объектно-ориентированным,<em>time</em>- экземпляр типа данных. Например, в Erlang есть много разных вариантов времени, которые можно чётко и однозначно определить.</p>
24 <p>Эти определения не принадлежат какому-то объекту. Они универсальные, и их можно использовать без ограничений. Любая функция может управлять структурами данных, которые представляют время. Здесь нет связанных методов.</p>
24 <p>Эти определения не принадлежат какому-то объекту. Они универсальные, и их можно использовать без ограничений. Любая функция может управлять структурами данных, которые представляют время. Здесь нет связанных методов.</p>
25 <h2>Возражение 3: в объектно-ориентированных языках определения типов данных распространяются везде</h2>
25 <h2>Возражение 3: в объектно-ориентированных языках определения типов данных распространяются везде</h2>
26 <p>В объектно-ориентированных языках определения типов данных принадлежат объектам. Поэтому невозможно найти все определения типов данных в одном месте. В Erlang или C можно определить все типы в одном включаемом файле или словаре данных. В объектно-ориентированном языке такое невозможно - определения распространяются везде.</p>
26 <p>В объектно-ориентированных языках определения типов данных принадлежат объектам. Поэтому невозможно найти все определения типов данных в одном месте. В Erlang или C можно определить все типы в одном включаемом файле или словаре данных. В объектно-ориентированном языке такое невозможно - определения распространяются везде.</p>
27 <p>Вот пример. Допустим, я хочу определить структуру данных в глобальной области видимости. Глобальный тип данных - такой тип, который доступен из любой точки в системе.</p>
27 <p>Вот пример. Допустим, я хочу определить структуру данных в глобальной области видимости. Глобальный тип данных - такой тип, который доступен из любой точки в системе.</p>
28 <p>Программисты Lisp давно знают, что лучше иметь меньше глобальных типов данных и больше функций, которые работают с ними, чем иметь много типов данных и мало функций для работы с ними.</p>
28 <p>Программисты Lisp давно знают, что лучше иметь меньше глобальных типов данных и больше функций, которые работают с ними, чем иметь много типов данных и мало функций для работы с ними.</p>
29 <p>Глобальный тип может быть связанным списком, массивом, хэш-таблицей или более сложным объектом.</p>
29 <p>Глобальный тип может быть связанным списком, массивом, хэш-таблицей или более сложным объектом.</p>
30 <p>В объектно-ориентированном языке мне придётся выбирать объект, в котором я определю глобальный тип. Все остальные объекты, которые захотят использовать эту структуру данных, должны наследовать этот объект. Допустим, я хочу создать объект<em>time</em>, в котором определяется эта структура данных, и в котором... Это очень сложно.</p>
30 <p>В объектно-ориентированном языке мне придётся выбирать объект, в котором я определю глобальный тип. Все остальные объекты, которые захотят использовать эту структуру данных, должны наследовать этот объект. Допустим, я хочу создать объект<em>time</em>, в котором определяется эта структура данных, и в котором... Это очень сложно.</p>
31 <h2>Возражение 4: у объектов есть приватное состояние</h2>
31 <h2>Возражение 4: у объектов есть приватное состояние</h2>
32 <p>Состояние - корень всех зол. В частности, нужно избегать функций с побочными эффектами.</p>
32 <p>Состояние - корень всех зол. В частности, нужно избегать функций с побочными эффектами.</p>
33 <p>Если в языках программирования состояния нежелательны, то в реальном мире они распространены. Я сильно интересуюсь состоянием своего банковского счёта. Когда я пополняю его или трачу с него деньги, всегда рассчитываю, что состояние корректно обновится.</p>
33 <p>Если в языках программирования состояния нежелательны, то в реальном мире они распространены. Я сильно интересуюсь состоянием своего банковского счёта. Когда я пополняю его или трачу с него деньги, всегда рассчитываю, что состояние корректно обновится.</p>
34 <p>С учётом того, что в реальном мире состояния распространены, какие условия должен обеспечить язык программирования для работы с состояниями?</p>
34 <p>С учётом того, что в реальном мире состояния распространены, какие условия должен обеспечить язык программирования для работы с состояниями?</p>
35 <ul><li>Объектно-ориентированные языки говорят "прячьте состояние от программиста". Состояние скрывается, и доступ к нему можно получить с помощью функций.</li>
35 <ul><li>Объектно-ориентированные языки говорят "прячьте состояние от программиста". Состояние скрывается, и доступ к нему можно получить с помощью функций.</li>
36 <li>Обычные языки программирования, например, C или Pascal, говорят, что состояние переменных контролируется правилами области видимости языка.</li>
36 <li>Обычные языки программирования, например, C или Pascal, говорят, что состояние переменных контролируется правилами области видимости языка.</li>
37 <li>Чистые декларативные языки говорят, что состояния не существует. Глобальное состояние системы передаётся во все функции и выходит из всех функций. Механизмы типа монад в функциональных языках и DC-грамматики в логических языках программирования используются, чтобы спрятать состояние от программистов. Поэтому программисты могут работать так, как будто состояние не имеет значение, но при этом у них может быть доступ к состоянию системы, если это необходимо.</li>
37 <li>Чистые декларативные языки говорят, что состояния не существует. Глобальное состояние системы передаётся во все функции и выходит из всех функций. Механизмы типа монад в функциональных языках и DC-грамматики в логических языках программирования используются, чтобы спрятать состояние от программистов. Поэтому программисты могут работать так, как будто состояние не имеет значение, но при этом у них может быть доступ к состоянию системы, если это необходимо.</li>
38 </ul><p>Объектно-ориентированные языки выбрали опцию "прятать состояние от программиста". Это худший вариант из возможных. Вместо того, чтобы работать с состоянием и минимизировать неудобства, они просто прячут его.</p>
38 </ul><p>Объектно-ориентированные языки выбрали опцию "прятать состояние от программиста". Это худший вариант из возможных. Вместо того, чтобы работать с состоянием и минимизировать неудобства, они просто прячут его.</p>
39 <h2>Почему же ООП популярно?</h2>
39 <h2>Почему же ООП популярно?</h2>
40 <ol><li>Считалось, что объектно-ориентированное программирование проще изучать.</li>
40 <ol><li>Считалось, что объектно-ориентированное программирование проще изучать.</li>
41 <li>Считалось, что в ООП проще переиспользовать код.</li>
41 <li>Считалось, что в ООП проще переиспользовать код.</li>
42 <li>ООП было на волне хайпа.</li>
42 <li>ООП было на волне хайпа.</li>
43 <li>ООП создало целую индустрию программного обеспечения.</li>
43 <li>ООП создало целую индустрию программного обеспечения.</li>
44 </ol><p>Я не вижу доказательств первых двух пунктов. Похоже, движущей силой популярности ООП остаются пункты 3 и 4. Если технология или язык настолько плохи, что вокруг них вырастает целая индустрия, которая решает их же проблемы, то это хорошая возможность для людей, которые ориентируются в первую очередь на зарабатывание денег.</p>
44 </ol><p>Я не вижу доказательств первых двух пунктов. Похоже, движущей силой популярности ООП остаются пункты 3 и 4. Если технология или язык настолько плохи, что вокруг них вырастает целая индустрия, которая решает их же проблемы, то это хорошая возможность для людей, которые ориентируются в первую очередь на зарабатывание денег.</p>
45 <p>Вот где реальная причина популярности ООП.</p>
45 <p>Вот где реальная причина популярности ООП.</p>
46 <p>Адаптированный перевод статьи<a>Why OO Sucks</a>by Joe Armstrong. Мнение администрации Хекслета может не совпадать с мнением автора оригинальной публикации.</p>
46 <p>Адаптированный перевод статьи<a>Why OO Sucks</a>by Joe Armstrong. Мнение администрации Хекслета может не совпадать с мнением автора оригинальной публикации.</p>