Размер шрифта:
Является ли переменная объектом в ООП?
Play

Является ли переменная объектом в ООП?

Я, начинающий программист на C#, спорю сейчас с программистом на C++. Он утверждает, что в ООП переменная - это не объект, во всяком случае в C++. Я утверждаю, что переменная - это в корне тоже объект определенного типа в любом объктно-ориентированном языке. Кто из нас прав? Хотелось бы услышать мнение профессионалов.

12 ответов 12

В С это не так — там просто нет понятия "объект". =)

Объект отличается от не объекта тем, что он имеет сложное и активное внутреннее устройство.

Не объект всего лишь является отображением участка памяти. Будь то просто число, указатель, некий обычный массив или структура. Действия над ними — просто оперирование данными в памяти. Взял, изменил, положил обратно. Вне зависимости от содержимого участка памяти. И переменная эта никаких возмущений в эти действия не вносит.

Объект — это тоже отображение участка памяти. Но только доступ к нему осуществляется уже не напрямую, а через посредников — через свойства, методы класса и т.д. То есть в любом случае происходит вызов некоторой процедуры, реализующей метод класса, которой передаются указатель на объект и аргументы (или как-то похоже). Что в этой процедуре произойдёт — одному разработчику известно. Ну и документации.

Моё мнение — в компилируемом и статически типизируемом языке обычно (но вовсе не обязательно) простые переменные не являются объектами.

В C# практически любая переменная — объект (как справедливо заметили, за исключением указателей). Ввиду того, что типы int , string , char и все иные — это, так сказать, синонимы соответствующих классов: System.Int32 , System.String , System.Char . В С++ — нет.

А в динамически типизируемом языке у каждой переменной, как минимум, есть скрытые свойства - тип, например. И действия совершаются различные в зависимости от содержимого оного свойства. И оператор + числа сложит, строки склеит и т.д.

Он утверждает, что в ООП переменная - это не объект, во всяком случае в C.

В Си нету объектов, Си является процедурным языком. Если имели ввиду C++, то ответ тот же — значение переменной не обязательно является объектом.

Я утверждаю, что переменная - это в корне тоже объект определенного типа в любом объектно-ориентированном языке.

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

В C++ это так из-за того что он основан на Си и обязан играть по его правилам.

Во многих объектно-ориентированных языках это так. (Python, Ruby, Smalltalk). В Java также как и в C++ базовые типы ( int ) не являются объектами, но в случае Java для них есть объекты-аналоги( Integer ).

Ответ, выбранный лучшим, неверный. На самом деле, в нем попытались ответить на другой вопрос: являются ли значения, которые содержат переменные, ссылками на объекты, или примитивами. Оригинальный же вопрос был задан относительно переменных - слотов, временно или постоянно существующих в некоторых областях памяти: куче, стеке, регистрах CPU. Переменная является объектом тогда и только тогда, когда язык предоставляет программисту объектный интерфейс, состоящий из операций по управлению слотом этой переменной: создание нового слота, помещение значения в слот, удаление слота, извлечение текущего значения из слота, и т.д. Ни один из известных мне объектно-ориентированных языков программирования не предоставляет в явной форме такого объектного интерфейса для своих переменных. В этих языках операции создания слота (переменной), извлечения текущего значения и размещения нового реализуются специальными синтаксическими конструкциями языка, а не вызовом методов, как это могло бы быть:

А операция удаления слота и вовсе не доступна в явном виде программисту, как могла бы быть:

Чтобы лучше понять, как бы выглядела работа с переменными, будь они объектами, рассмотрим похожую проблему. Зададимся вопросом: а являются ли функции (или методы) объектами? Для Java/C#/C++ ответ отрицательный (если анонимные функции в C# имеют объектный интерфейс, просьба меня поправить). Но, скажем, в языке Scala, функции (и методы) и правда являются объектами, иными словами, они имеют объектные интерфейсы. К примеру, создадим новую функцию для двух аргументов, которую положим в переменную sum:

Созданная функция - объект, который является экземпляром некоторого класса:

Вызвать (применить) функцию можно традиционным способом:

А можно и с помощью объектного интерфейса:

Создадим еще одну функцию, на этот раз с помощью явного создания объекта на основе интерфейса Function2, представляющего функции для двух аргументов:

Полученная функция также является обычным объектом с методом apply:

Еще один полезный метод, который предоставляет объектный интерфейс для функций - это операция карирования функции, которая позволяет вытворять такие вещи:

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

📎📎📎📎📎📎📎📎📎📎