Приводит ли ООП с одной парадигмой к инверсии абстракции?

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

По вашему мнению, неизбежно ли приводит к инверсии абстракции программирование на языке ООП с одной парадигмой, где все должно быть частью класса, а такие вещи, как указатели, не отображаются, например, Java или C#? Если да, то в каких случаях?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
724
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

В Java и C# есть статические методы, которые эквивалентны функциям, поэтому язык ничего вам не навязывает.

Тем не менее, как только я действительно получил OO, у меня не было никакого желания переходить к другому стилю программирования.

Если ваш простой объектно-ориентированный слой покрывает что-то сложное, я предполагаю, что проблема, вероятно, связана с вашим кодом. Если объектно-ориентированный подход выполнен правильно, он должен быть простым, вплоть до металла.

Я согласен с вашим утверждением "до металла". С другой стороны, меня беспокоит, что объектно-ориентированный подход стал почти самоцелью. Я видел слишком много красиво созданных, но слишком сложных, объектно-ориентированных приложений.

Mike Dunlavey 20.11.2008 00:04

Я не буду заходить так далеко, чтобы сказать, что слишком много OO - это плохо, но я с радостью признаю, что это довольно большой молоток, которым можно размахивать разными способами, и без раздумий большинство из них не очень полезны.

Bill K 20.11.2008 00:11

Статические методы рассматриваются только как «эквивалентные» простым функциям, потому что другого способа сделать это нет. Когда решается, что все отверстия должны быть круглыми, чтобы удовлетворить королевское чувство эстетики, вы в конечном итоге делаете некоторые действительно уродливые вещи со всеми квадратными колышками, которые продолжают выскакивать. Вскоре вы повсюду будете использовать уродливые статические методы, потому что существует так много концепций, которые просто не соответствуют «объектной» парадигме.

Mason Wheeler 29.04.2009 16:43

Или вы не знаете, как сопоставить свои концепции с объектной парадигмой. Все, что я сказал, это то, что у меня никогда не было проблем с кодированием как объектно-ориентированным, но если вы не можете найти способ сопоставить вашу конкретную проблему, возможно, вам больше подходит другой язык. Я также не предполагал, что статические методы - хорошее решение - я сказал, что они указывают на то, что вы не получаете объектно-ориентированного подхода - возможно, вы просто не думаете в объектно-ориентированном стиле, а думаете в функциональном. У меня противоположная проблема, я не знаю, как нарисовать достойную, понятную конструктивную схему большой функциональной системы.

Bill K 29.04.2009 20:58

настоящие программисты могут писать FORTRAN на любом языке

Другими словами, это не язык, это программист

Я не думаю, что язык, такой как Java или C#, страдает от этого хоть сколько-нибудь ощутимым образом, просто потому, что библиотеки, сопровождающие фреймворк, настолько богаты, что необходимость перехода в другую парадигму на самом деле не требуется для общего программирования.

Тем не менее, сами богатые библиотеки могут страдать от инверсии абстракции, однако, поскольку внутренние реализации часто скрыты или ключевые классы запечатаны, разработчики, пытающиеся расширить эти библиотеки, часто вынуждены повторно реализовывать / реплицировать функциональность, чтобы успешно использовать точки расширения. предоставляется библиотекой базовых классов - это не столько языковая проблема, сколько сознательный выбор, сделанный разработчиком библиотек базовых классов, чтобы избежать раскрытия функциональности, которая может быть хрупкой или часто изменяться с новыми выпусками .Net Framework / JDK.

Кроме того, поскольку .Net Framework / Java Runtime позволяют взаимодействовать с другими языками, находящимися поверх общей среды выполнения, возможность нацеливания на другие парадигмы (например, функциональное программирование, динамические языки и т. д.) Также может предоставить другой путь к отказу от единой парадигмы. ограничения.

Ответ принят как подходящий

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

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

Независимо от вашей парадигмы, как только вы начнете писать нетривиальный код для решения реальных проблем, вы столкнетесь с некоторыми вещами, которые просто не очень хорошо соответствуют парадигме. Если вы заявляете, что одна парадигма - это все, что есть, тогда все становится некрасиво.

Чтобы смешать пару метафор, когда все, что у вас есть, это молоток, все начинает выглядеть как колышек, и если все ваши отверстия круглые, и вы внезапно получаете несколько квадратных колышков, а у вас нет пил (просто молотки ,) у вас есть проблема.

Бесплатного обеда нет. Все - компромисс. Чем легче становится писать код, тем труднее кому-то читать и поддерживать или вам или кому-либо еще отлаживать, когда проблемы возникают ниже того уровня абстракции, на котором вы работаете. (И они в конечном итоге сделают это, потому что нет идеальной абстракции.

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

Другие вопросы по теме