В чем разница между объектом и структурой в ООП? - PullRequest
31 голосов
/ 23 декабря 2010
  • Что отличает и объект от структуры?
  • Когда и почему мы используем объект, а не структуру?
  • Чем массив отличается от обоих, и когда и почему мы будем использовать массив, а не объект или структуру?

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

Ответы [ 10 ]

31 голосов
/ 23 декабря 2010

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

Поскольку классы могут использоваться для представления классических структур данных, таких как массивы, хэш-карты, деревья и т. Д., Вы часто видите их как отдельные элементы в блоке структурированных данных.

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

В качестве рекомендаций:

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

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

10 голосов
/ 23 декабря 2010

Вообще говоря, , объекты предоставляют полную объектно-ориентированную функциональность (методы, данные, виртуальные функции, наследование и т. Д. И т. Д.), Тогда как структуры - это просто организованная память.Структуры могут иметь или не иметь поддержку методов / функций, но обычно они не поддерживают наследование и другие полные функции ООП.

Обратите внимание, что я сказал в общем случае ... отдельные языкиможно перегружать терминологию по своему усмотрению.

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

6 голосов
/ 23 декабря 2010
  • Что отличает и объект от структуры?

В ООП нет понятия "структура". Определение структур зависит от используемого языка. Например, в C ++ классы и структуры одинаковы, но члены класса являются закрытыми по умолчанию, в то время как члены структуры общедоступны, чтобы поддерживать совместимость со структурами C. С другой стороны, в C # struct используется для создания типов значений, а класс - для ссылочных типов. C имеет структуры и не является объектно-ориентированным.

  • Когда и почему мы используем объект, а не структуру?

Опять же, это зависит от используемого языка. Обычно структуры используются для представления POD (Plain Old Data), что означает, что они не определяют поведение, которое воздействует на данные и в основном используются для представления записей, а не объектов. Это всего лишь соглашение и не применяется в C ++.

  • Чем массив отличается от обоих, и когда и почему мы будем использовать массив в отличие от объекта или структура

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

5 голосов
/ 23 декабря 2010

Краткий ответ: Структуры являются типами значений. Классы (объекты) являются ссылочными типами.

3 голосов
/ 23 декабря 2010

По своей природе объект имеет методы, а структура - нет.

(ничто не мешает вам иметь объект без методов, так как ничто не мешает вам, скажем, хранить целое число в floatпеременная)

2 голосов
/ 23 декабря 2010

Массивы представляют собой упорядоченную коллекцию элементов, которые (как правило) относятся к одним и тем же типам.Элементы могут быть доступны по индексу.Классические массивы допускают только целочисленные индексы, однако современные языки часто предоставляют так называемые ассоциативные массивы (словари, хеши и т. Д.), Которые позволяют использовать, например, строки в качестве индексов.

Структура - это коллекция именованных значений (полей), которые могут бытьразличных типов (например, поле a содержит целочисленные значения, поле b - строковые значения и т. д.).Они (а) группируют логически связанные значения и (б) упрощают изменение кода, скрывая детали (например, изменение структуры структуры не влияет на сигнатуру функции, работающей с этой структурой).Последнее называется «инкапсуляция».

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

Разные объекты могут демонстрировать разное поведение в ответ на одни и те же сообщения (при вызове одних и тех же методов), что называется «полиморфизм».

Во многих (но не во всех) языках объекты принадлежат к некоторым классам, и классы могут образовывать иерархии (что называется «наследованием»).

Поскольку методы объекта могут работать со своими полями напрямую, поля могут быть скрыты от доступа любым кодом, кроме этих методов (например, помечая их как private).Таким образом, уровень инкапсуляции для объектов может быть выше, чем для структур.

Обратите внимание, что разные языки добавляют разные семантики к этим терминам.

Например:

  • inЯзыки CLR (C #, VB.NET и т. Д.) struct s размещаются в стеке / в регистрах, а объекты создаются в куче.

  • в C ++ struct s имеют все поля public по умолчанию, и объекты (экземпляры классов) имеют все поля private.

  • в некоторых динамических языках объекты являются просто ассоциативными массивами, в которых хранятся значения и методы.

1 голос
/ 03 мая 2014

Я также думаю, что стоит упомянуть, что концепция структуры очень похожа на «объект» в Javascript, который определяется совсем иначе, чем объекты в других языках.На них ссылаются как на "foo.bar", а данные структурированы аналогично.

1 голос
/ 25 декабря 2013

Когда и почему мы используем объект, а не структуру?

Это ключевой вопрос. Я использую структуры и модули процедурного кода, чтобы обеспечить большую часть преимуществ ООП. Структуры предоставляют большую часть возможностей хранения данных объектов (кроме свойств только для чтения). Процедурные модули обеспечивают завершение кода, аналогичное тому, которое предоставляется объектами. Я могу ввести module.function в IDE вместо object.method. Полученный код выглядит так же. Большинство моих функций теперь возвращают структуры, а не отдельные значения. Влияние на мой код было впечатляющим: читаемость кода возросла, а количество строк значительно уменьшилось. Я не знаю, почему процедурное программирование, которое широко использует структуры, не является более распространенным. Почему бы просто не использовать ООП? Некоторые из языков, которые я использую, являются только процедурными (PureBasic), а использование структур позволяет ощутить некоторые преимущества ООП. Другие языки допускают выбор процедурного или ООП (VBA и Python). В настоящее время мне проще использовать процедурное программирование, и в своей дисциплине (экологии) мне очень трудно определять объекты. Когда я не могу понять, как сгруппировать данные и функции вместе в объекты в философски последовательной коллекции, у меня нет основы для создания классов / объектов. Со структурами и функциями нет необходимости определять иерархию классов. Я свободен перетасовывать функции между модулями, что помогает мне улучшить организацию моего кода на ходу. Возможно, это предвестник выхода на ОО.

Код, написанный со структурами, имеет более высокую производительность, чем код на основе ООП. ООП-код имеет инкапсуляцию, наследование и полиморфизм, однако я думаю, что процедурный код на основе структуры / функции часто разделяет эти характеристики. Функция возвращает значение только вызывающей стороне и только в области видимости, тем самым достигая инкапсуляции. Точно так же функция может быть полиморфной. Например, я могу написать функцию, которая вычисляет разницу во времени между двумя местами с двумя внутренними алгоритмами, один, который учитывает международную линию дат, а другой - нет. Наследование обычно относится к методам, наследуемым от базового класса. Существует своего рода наследование функций, которые вызывают другие функции и используют структуры для передачи данных. Простой пример - передача сообщения об ошибке через стек вложенных функций. Когда сообщение об ошибке передается, оно может быть добавлено вызывающими функциями. В результате получается трассировка стека с очень описательным сообщением об ошибке. В этом случае сообщение наследуется через несколько уровней. Я не знаю, как описать наследование снизу вверх (программирование на основе событий?), Но это особенность использования функций, которые возвращают структуры, отсутствующие в процедурном программировании с использованием простых возвращаемых значений. На данный момент я не встречал ситуаций, в которых ООП был бы более продуктивным, чем функции и структуры. Удивительно для меня то, что очень мало кода, доступного в Интернете, написано таким образом. Это заставляет меня задуматься, есть ли причина для этого?

1 голос
/ 25 декабря 2013

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

Если для замены объектов используются структуры, то можно использовать функции для предоставления эквивалента методов.По крайней мере, в моем коде структуры часто используются для возврата данных из пользовательских функций в модулях, которые содержат бизнес-логику.Структуры и функции так же просты в использовании, как и объекты, но функциям не хватает поддержки XML-комментариев.Это означает, что мне постоянно приходится смотреть на блок комментариев в верхней части функции, чтобы увидеть, что именно делает функция.Часто мне приходится читать исходный код функции, чтобы увидеть, как обрабатываются крайние случаи.Когда функции вызывают другие функции, мне часто приходится гоняться за чем-то на нескольких уровнях, и становится трудно разобраться.Это приводит к другому преимуществу ООП против структур и функций.ООП имеет XML-комментарии, которые отображаются как подсказки в IDE (в большинстве, но не во всех языках ООП), а в ООП также есть определенные интерфейсы и часто объектная диаграмма (если вы решите их создать).Мне становится ясно, что определяющим преимуществом ООП является возможность документировать, что код делает, что и как он связан с другим кодом - интерфейсом.

1 голос
/ 23 декабря 2010
  • На мой взгляд, объект на базовом уровне - это число переменных и ряд методов, которые манипулируют этими переменными, в то время как структура, с другой стороны, представляет собой только число переменных.
  • Я использую объект, когда вы хотите включить методы, я использую структуру, когда я просто хочу передать набор переменных.
  • Массив и структура в принципе похожи, они оба являются множеством переменных. Как бы то ни было, лучше написать myStruct.myVar, чем myArray [4]. Вы можете использовать enum для указания индексов массива, чтобы получить myArray [indexOfMyVar] и в основном получить ту же функциональность, что и структура.

Конечно, вы можете использовать константы или что-то еще вместо переменных, я просто пытаюсь показать основные принципы.

...