Держите ее возле себя! Когда следует выражать свое мнение
Вопрос помогает оценить сильные и слабые стороны, а так же мотивацию конкретного кандидата. Основная задача — помочь определить тип референции у кандидата. От анг. reference – ссылка. Тип референции определяет, как соотносится личное мнение конкретного кандидата и внешнее мнение при самооценке и при принятии какого-либо решения.
Я знаю, что я хорошая или я плохая, потому что мне об этом говорят, потому что я делаю так же как все, это — внешняя референция.
Я знаю, что я хорошая или плохая, потому что я собой довольна или не довольна, я считаю, что я права или не права, и это — внутренняя референция.
Зачем нам это знать?
Сотрудники с внешней референцией хорошие исполнители, склонны подстраиваться под руководителя, команду, клиента. У них нет четко выраженной своей точки зрения, они стремятся быть в большинстве. Люди с таким типом хорошо подходят на должность секретаря, помощника, продавца, исполнителя. Они с легкостью принимают стандартизированную работу по инструкции, более того, им необходима четкая вводная, план и алгоритм работы. Сотрудники с внешней референцией в отличие от данного типа, склонны нарушать данные алгоритмы работы, адаптировать под себя моменты, идущие в разрез с собственным мнением.
У человека есть своя точная четкая позиция, которую он готов отстаивать, своя четкая система ценностей, он не готов ей жертвовать, это говорит о внутреннем типе референции. Такие люди подойдут на руководящие позиции, на позиции экспертов. При этом важно, что бы его ценности совпадали с корпоративной культуре компании, что легко проверить с помощью проективных вопросов.
На многие позиции больше подходят люди со смешанной системой референции. К примеру, менеджер по работе с ключевыми клиентами. С одной стороны он должен уметь подстроиться под клиента, быть ему удобным, с другой стороны он должен уметь убедить клиента, настоять на своем и отстоять интересы компании.
Итак, мы выяснили для чего знать тип референции, теперь перейдем к следующему вопросу.
Как узнать тип референции у кандидата?
Конструкция вопросов для определения типа референции такова:
Любой вопрос на самооценку:
«Вы хороший специалист?»,
«Вы хороший коллега?»,
«Вы хороший подчиненный?»,
«Вы хороший руководитель?»,
«Вы хорошо продаете?»,
«Вы хорошо ведете переговоры?»,
« Вы хорошо водите авто?»,
«Вы хорошо мотивируете на работу подчиненных?»
вопрос «Почему Вы так считаете?»
По большому принципу, не интересует, ответит кандидат «хорошо» или «плохо», нам важнее оценить его ответ на вопрос «Почему Вы так считаете?»
Если кандидат ссылается на внешнее мнение, например:
- руководство меня ценит,
- меня хвалят,
- клиенты мной довольны,
- я выполняю план,
- у меня получается не хуже чем у других
Тип его референции внешний. То есть оценка действий происходит из вне.
Если кандидат отвечает:
- я считаю себя,
- я думаю,
- я уверен,
- я доволен тем, что я делаю.
Слова, указывающие на собственное я, на самостоятельную оценку своих действий. Мы видим, что у кандидата есть собственное мнение, собственная позиция, значит речь идет о внутреннем типе референции.
Что бы правильно определить тип референции кандидата, необходимо получить не менее 5 индикаторов и тогда Вы увидите, к чему ближе кандидат, к внешней референции, или к внутренней референции или он находится где-то посередине.
Итак, тип референции дает нам представление о сильных и слабых сторонах и дает информацию о мотивации человека.
Внешняя референция – потребность в похвале, внимании, важен статус, важно, как называется должность.
Внутренняя референция – удовольствие от работы, собственное мнение, самостоятельность, свобода действий, свобода в принятии решений.
Таким образом, проективные вопросы на оценку типа референции помогают нам оценить не только профпригодность, но и способы управления конкретным сотрудником в дальнейшем.
Источник
ТОП-5 метапрограмм для HR и рекрутера
Речь человека – один из самых надежных способов определить его характер и тип мышления. Обращая внимание на структуру фраз и смысловые акценты, можно провести беспристрастный анализ, не попав в западню “социально-желательных ответов”: когда человек понимает, какого ответа от него ждут. Именно таким анализом занимаются метапрограммы. Мы собрали пять сценариев, которые можно применять в работе уже сегодня.
Тип референции
Эта метапрограмма позволяет определить, чье мнение приоритетно для человека, когда он принимает решение: свое или чужое? Внутренняя референция указывает на перевес собственного мнения, тогда как внешняя − маркер того, что каждое действие работник будет делать с оглядкой на других.
Как проверить, к какому типу референции относится ваш сотрудник? Задайте ему вопрос: как вы определяете, что задача выполнена успешно?. Если ответ будет в духе “никто не жаловался и клиент остался доволен” − вам попался “внешний” вариант. А вот “я несколько раз сверился с заданием и уверен в точности его выполнения” − напротив, “внутренний” вариант, и в дальнейшем такой сотрудник вполне может дорасти до руководителя.
Процесс VS результат
На первый взгляд кажется, что все мы работаем ради результата: большой зарплаты, новой престижной должности или хотя бы уважения коллег. В некоторых профессиях так и есть: активные продажи, к примеру, невозможны без радужной перспективы выполнить план и получить бонус к ежемесячному заработку. Однако бухгалтер или секретарь – персонажи совсем другой истории. Их работа – “забег на длинную дистанцию”, где цель часто так далека, что оглядываться на нее нет смысла.
“Процессники” ориентируются на стабильность и плавное течение жизни, где все идет равномерно и по плану.Конечно, далеко не каждый кандидат, отправляя свое резюме, осознает существенность такого различия. Потому задача рекрутера и HR – быть внимательным к деталям.
Как проверить, “результатник” перед вами или “процессник”? Спросить работника, как он видит свой идеальный отпуск. Ответ “много ярких впечатлений и красивые фотографии на фейсбуке” – признак человека, которому важен финальный плод работы. А вот “хочу увидеть много красивых мест и поесть средиземноморской кухни” – маркер “процессника”, который наслаждается моментом гораздо больше, чем дальнейшим подведением его итогов.
Процедуры VS возможности
Эта метапрограмма частично похожа на предыдущую, однако, в отличии от “Процесс – результат”, позволяет определить не вектор мотивации человека, но тот путь, которым он идет, решая поставленную перед ним задачу.
Как определить, “человек возможностей” перед вами – или “процедурник”? Спросите сотрудника, как он обычно готовится к важным переговорам. Как и все предыдущие, этот вопрос с подвохом: “процедурник” сразу вспомнит, что для любых переговоров написана служебная инструкция − вначале узнать побольше о партнере, потом подготовить доклад, потом презентацию…
“Человек возможностей”, напротив, начнет импровизировать. Что это за компания? Наша инструкция написана для горной промышленности, а это медицина. Значит, нужно все переделать!
Важно понимать: ни одна из характеристик не является негативной. Главная цель, которую преследуют метапрограммы – сделать так, чтобы человек получил ту должность, где он будет максимально полезен и счастлив.
Вот как распределяются профессии на полюсах “Возможности – Процедуры”:
Сходство VS различие
Данная метапрограмма позволяет легко определить, как человек воспринимает жизнь и работу: проводя параллели между сходными вещами, или постоянно отмечая различия.
Склонные к “сходству” люди легко решают конфликты, ведь суть их мышления – видеть общие интересы и стремиться продолжать общение. Они без проблем выполняют работу, с которой хотя бы частично сталкивались раньше, однако в принципиально новые проекты вводить их проблематично.
Любящие “различия” сотрудники часто сложно сходятся с коллегами, но привычка не ставить знак “равно” между составляющими окружающей реальность играет на руку их изобретательности – таких людей много среди представителей творческих профессий
Вопрос для проверки: ваш диплом специалиста чем-то помог в реальной работе? “Ничем не помог”, ответит сотрудник, мышление которого направлено на различия. И начнет долгий рассказ о том, как сильно отстало университетское образование от настоящей работы. “Частично да, вот к примеру мы проходили точно такие же механизмы…” — скажет тот, кто мыслит категориями сходства. И вы уже будете знать, какая работа подходит каждому из них.
Содержание VS окружение
С чем комфортней работать сотруднику: цифры и данные, или люди? Определить с первого взгляда не так уж просто. Ведь умный кандидат, претендующий на место (к примеру) аудитора, на прямой вопрос непременно выберет вариант “цифр”. Но так ли это?
Будьте хитрее. Спросите: что вам больше всего понравилось на прошлой работе? Анализируя ответ, обращайте внимание на то, насколько в нем присутствуют люди – коллектив, клиенты, ученики, и сколько внимание при этом уделяется содержанию. Это позволит определить, сможет ли сотрудник работать на предложенном месте долгое время, или уволится через несколько месяцев.
Можно ли научиться мыслить другими метапрограммами? Иногда — да. В сущности, это такой же навык, как и умение говорить на другом языке. Однако помните, что “родные” метапрограммы, сформировавшиеся еще в детстве, в любом случае будут преобладать в вашем мышлении. Потому подбирайте сотрудников “по способностям”, а тех из них, кого нужно обучить, грамотно мотивируйте — как это делать, можно почитать в нашей статье “Кнут и пряник корпоративного обучения”.
Автор: Анастасия Косодий
типов значений и ссылочных типов — Visual Basic
Редактировать Твиттер LinkedIn Фейсбук Электронная почта- Статья
В Visual Basic есть два типа типов: ссылочные типы и типы значений. Переменные ссылочных типов хранят ссылки на свои данные (объекты), а переменные значимых типов непосредственно содержат свои данные. При использовании ссылочных типов две переменные могут ссылаться на один и тот же объект; следовательно, операции с одной переменной могут повлиять на объект, на который ссылается другая переменная. При использовании типов значений каждая переменная имеет собственную копию данных, и операции над одной переменной не могут влиять на другую (за исключением случая использования модификатора ByRef для параметров).
Типы значений
Тип данных является типом значения , если он содержит данные в своем собственном распределении памяти. Типы значений включают следующие:
Все числовые типы данных
Булево значение
,Символ
иДата
Все структуры, даже если их элементы являются ссылочными типами
Перечисления, поскольку их базовый тип всегда
SByte
,Short
,Integer
,Long
,Byte
,UShort
,UInteger
илиULong
Каждая структура является типом значения, даже если она содержит элементы ссылочного типа. По этой причине такие типы значений, как Char
и
, реализуются структурами . NET Framework.
Вы можете объявить тип значения, используя зарезервированное ключевое слово, например, Decimal
. Вы также можете использовать Новое ключевое слово
для инициализации типа значения. Это особенно полезно, если у типа есть конструктор, принимающий параметры. Примером этого является конструктор Decimal(Int32, Int32, Int32, Boolean, Byte), который создает новое значение Decimal
из предоставленных частей.
Ссылочные типы
Ссылочный тип хранит ссылку на свои данные. Типы ссылок включают следующие:
Строка
Все массивы, даже если их элементы являются типами значений
Типы классов, такие как форма
Делегаты
Класс A является ссылочным типом . Обратите внимание, что каждый массив является ссылочным типом, даже если его элементы являются типами значений.
Поскольку каждый ссылочный тип представляет базовый класс . NET Framework, при его инициализации необходимо использовать ключевое слово New Operator. Следующий оператор инициализирует массив.
Dim totals() As Single = New Single(8) {}
Элементы, не являющиеся типами
Следующие программные элементы не квалифицируются как типы, поскольку вы не можете указать ни один из них в качестве типа данных для объявленного элемента:
Пространства имен
Модули
События
Свойства и процедуры
Переменные, константы и поля
Работа с объектом Тип данных
Переменной с типом данных Object
можно присвоить либо ссылочный тип, либо тип значения. Переменная Object
всегда содержит ссылку на данные, а не на сами данные. Однако, если вы присваиваете тип значения переменной Object
, она ведет себя так, как если бы она содержала свои собственные данные. Дополнительные сведения см. в разделе Тип данных объекта.
Вы можете узнать, действует ли переменная Object
как ссылочный тип или тип значения, передав ее методу IsReference в классе Information пространства имен Microsoft.VisualBasic. Information.IsReference возвращает True
, если содержимое переменной Object
представляет ссылочный тип.
См. также
- Типы значений, допускающих значение NULL
- Преобразование типов в Visual Basic
- Заявление о структуре
- Эффективное использование типов данных
- Тип данных объекта
- Типы данных
Обратная связь
Просмотреть все отзывы о странице
терминология — Тип значения/ссылки, объект и семантика
Примечание. — Значение «семантики значений» в контексте программирования изменилось, о чем свидетельствуют определения, представленные в приложении. Далее следует моя попытка разобраться во всем этом.
- Семантика значений не зависит от экземпляра.
- Типы с семантикой значений — это типы с семантикой значений.
- Семантика ссылок — это взаимозависимость экземпляров.
- Ссылочно-семантические типы — это типы со ссылочной семантикой.
- Переменные типа значения содержат экземпляры.
- Переменные типа ссылки содержат ссылки на экземпляры.
- Объекты являются экземплярами классов.
- Объекты-значения имеют равенство на основе значений.
- Объекты значений должны иметь семантику значений.
- Объекты значений могут быть экземплярами либо типов значений, либо ссылочных типов.
- Ссылочные объекты имеют равенство на основе идентичности.
- Ссылочные объекты могут быть экземплярами типов значений или ссылочных типов.
- Сущности — это справочные объекты, имеющие ценность.
- Услуги — это справочные объекты, не имеющие ценности.
- Семантика значений может быть заархивирована:
- Полная копия. Который может быть заархивирован:
- Поверхностное копирование типов значений без полей ссылочного типа.
- Глубокая копия.
- Глубокая копия изменяемых полей и поверхностная копия неизменяемых полей.
- Неизменяемые типы.
- Реализация копирования при записи.
- Полная копия. Который может быть заархивирован:
- Ссылочная семантика заархивирована по… не имеющей семантики значения.
Пространства в памяти
Информация хранится в промежутках памяти, где их можно использовать повторно. В памяти есть три пробела:
- Стек (например, аргументы, локальные переменные).
- Куча (например, глобальные переменные, статические поля).
- Относительный (например, элементы массива, поля экземпляра).
Пробелов каждого вида в памяти может быть несколько. Например, несколько аргументов. Каждый пробел в памяти.
Язык/среда выполнения/платформа могут иметь или не иметь ничего из этого. Например, у некоторых нет стека. Некоторые не имеют массивов или составных типов. А у некоторых нет кучи. Однако все они будут иметь как минимум кучу или стек.
Мы не будем говорить об именованных константах, литералах, непосредственных значениях или различиях между l-значениями и r-значениями.
Переменные
В большинстве языков мы даем имена пространствам в памяти. Это облегчает их использование. Мы называем эти именованные пространства в памяти «переменными».
В дальнейшем мы будем называть информацию, хранящуюся в пространстве памяти, названном переменной, содержимым переменной.
Также стоит отметить, что имена переменных могут существовать или не существовать во время выполнения (например, отражение), а также, если они существуют, информация об их статическом типе может существовать или не существовать во время выполнения (например, стирание типа).
Кроме того, может измениться положение именованной переменной в памяти.
Примечание. — То, что я называю здесь содержанием, другие авторы называют ценностью. Я не называю это ценностью, потому что использую определение ценности Лакоша. Однако я согласен с тем, что содержимое переменной является значением. Физическая ценность. В то время как ценность, о которой говорит Лакош, является ценностью платонической логики.
Типы и экземпляры
Тип — это набор макетов памяти. Мы будем ссылаться на каждый из возможных макетов памяти данного типа, которые фактически существуют в памяти, как на экземпляры. Экземпляры могут перекрываться в памяти.
Эти макеты памяти будут определять содержимое переменной, которая содержит указанные экземпляры. См. «Типы значений и ссылочные типы» ниже.
Переменные и типы
В языке с динамической типизацией содержимое переменных может быть любого типа.
С другой стороны, в статически типизированных языках переменные имеют тип, и этот тип определяет возможное содержимое переменной.
Примечание. — Некоторые языки со статической типизацией поддерживают ввод переменной как динамической. То есть тип переменной — «заглянуть в содержимое переменной, чтобы выяснить тип».
Примитивные типы и составные типы
Составные типы — это типы, построенные из других типов. Что неверно для примитивных типов.
Не путайте примитивные типы со встроенными типами. Это набор типов, предоставляемых языками. Поскольку в настоящее время многие языки предоставляют составные типы. Вместо этого примитивные типы неделимы в рамках ограничений языка.
Равенство
Рассматривая экземпляры типа, мы можем или не можем заботиться о концепции равенства для этих экземпляров. То есть равенство может быть или не быть частью спецификации/требований для типа.
Нас интересует равенство только тогда, когда тип имеет понятие «значение».
Значения
Для типов, имеющих концепцию значения, значение выводится из содержимого экземпляров. Или, скорее, я должен сказать, что содержимое представляет ценность.
Однако содержимое не является значением. Я имею в виду, что равенство экземпляров не означает равного представления в памяти. Это связано с тем, что в памяти может быть несколько представлений одного и того же значения. Учтите, например, что в некоторых типах существует несколько способов представления значения в памяти, и поэтому потребуется канонизация/нормализация (например, строки, дата, десятичные числа с плавающей запятой).
Таким же образом мы можем сказать, что значения, хранящиеся в разных типах, имеют одно и то же значение, т. е. равны (например, 5, хранящиеся в коротком целом, и 5, хранящиеся в длинном целом).
Имея дело с составными типами, мы говорим о существенных атрибутах.
Из книги Джона С. Лакоса Large-Scale C++ Volume I: Process and Architecture :
Выдающийся атрибут семантического типа значений — это один из его (обычно наблюдаемых) атрибутов, который вносит вклад в общее значение самого объекта.
Доберется до «значительно-семантического типа».
Только значимые атрибуты считаются частью значения типа, и какие атрибуты являются значимыми, определяется спецификацией/требованиями для этого типа, а не представлением в памяти.
Ссылки
Ссылки — это переменные, содержимое которых относится к экземпляру, а не является экземпляром. То есть содержимое будет иметь позицию в памяти, где находится экземпляр, вместо непосредственного содержания экземпляра.
То, что я определил выше, будет указателями в C++. Мы не говорим о различии указателей и ссылок в С++.
На некоторых платформах есть сборщик мусора, который может перемещать экземпляры. Когда это происходит, сборщик мусора также должен обновить ссылки на них.
Из-за состава у нас могут быть экземпляры со ссылками.
Копирование и перемещение
Поскольку каждая переменная имеет место в памяти, когда мы присваиваем одну переменную другой (предполагая, что их типы совместимы), нам нужно скопировать содержимое. См. «Типы копирования» ниже.
Если типы переменных несовместимы. Конверсия необходима. Один особый случай — это присваивание ссылке.
В некоторых случаях мы знаем, что переменная перестанет существовать. Например, локальная переменная при возврате из подпрограммы выходит за пределы области видимости. Если мы возвращаем локальную переменную и присваиваем возвращаемое значение другой переменной, компилятор может решить не копировать ее, а вместо этого переместить. Перемещение сюда означает изменение места в памяти, названного переменной.
Так как перемещение происходит только тогда, когда переменная перестает существовать. Нам не нужно беспокоиться о переезде.
Передача по ссылке и передача по значению
Параметром подпрограммы является переменная. Когда мы вызываем подпрограмму, параметры назначаются. Если параметры являются типами и являются ссылками, то мы передаем экземпляры по ссылкам. В противном случае они передаются по значению. И да, это копия.
Типы копирования
Неглубокое копирование ограничивается копированием содержимого переменной. С другой стороны, глубокая копия будет следовать за ссылками и копировать их тоже. То есть глубокая копия рекурсивна по отношению к ссылкам.
Обратите внимание, что это не единственные варианты копирования экземпляров. Мы еще вернемся к этому.
Для содержимого, не содержащего ссылок, поверхностная копия является полной копией. Однако для содержимого, которое включает ссылки, необходима глубокая копия, чтобы получить полную копию.
Под полной копией будем понимать копию всей схемы памяти экземпляра. Если мы не копируем целиком, то это неполная копия. Если макет памяти не имеет ссылок и существует только в содержимом переменной, то поверхностная копия является полной копией. В противном случае поверхностная копия является неполной копией.
Неглубокая копия используется по умолчанию.
Примечание. — Содержимое переменной может быть дескриптором ресурса. Это могут быть внешние ресурсы, такие как дескриптор объекта окна или ключ строки в таблице базы данных. Это также может быть внутренний ресурс, такой как индекс массива (см. Entity-Component-System). Это не ссылки, как определено выше, однако их можно рассматривать как таковые (мы могли бы сказать, что указатель — это физическая ссылка, а дескриптор — логическая ссылка). Если ресурсы, на которые делается ссылка, не копируются, они могут предоставить экземплярам возможность влиять друг на друга. См. «Правило трех» ниже . Вас также может заинтересовать RAII. Мое личное мнение, что мы не должны пытаться архивировать семантику значений с включенными дескрипторами внешних ресурсов, и если бы мы это сделали, потребовалось бы также скопировать эти ресурсы.
Типы значений и ссылочные типы
Мы находим в справочнике по языку C# :
Переменная типа значения содержит экземпляр типа. Это отличается от переменной ссылочного типа, которая содержит ссылку на экземпляр типа.
Ссылочные типы — это такие типы, переменные которых являются ссылками на экземпляр. Эта структура памяти для ссылочных типов определяет, что переменные содержат ссылку на экземпляр.
В C++ только указатели и ссылки являются ссылочными типами. Однако мы находим множество ссылочных типов в других языках. Например, классы Java и .NET являются ссылочными типами. Структуры C#, кстати, являются типами значений.
С другой стороны, типы значений — это такие типы, что переменные этого типа не являются ссылками. Другими словами, содержимое переменной является экземпляром.
Не путайте типы значений и ссылочные типы со семантическими типами значений и ссылочными семантическими типами. Также не путайте типы значений с примитивными типами.
Теперь, поскольку переменные ссылочных типов являются ссылками. И мелкая копия по умолчанию. Присвоение ссылочных типов приводит к неполной копии… если только значение по умолчанию не переопределено.
Для типов значений присваивание приводит к полной копии, если и только если они не являются составными типами, содержащими ссылки. См. также Структуры могут содержать поля ссылочных типов (C#).
Типы семантики значения и семантики ссылки
Тип семантики значения — это тип, копия которого обеспечивает независимость экземпляра. То есть результат копирования не должен использоваться для изменения оригинала. Акцент на тексте. Это не о том, чтобы сделать ссылку.
Соответствует игре «Мутация» Алексис Галлахер.
Это можно сделать двумя простыми способами:
- Предоставление полной копии. Как мы видели ранее, у нас может быть полная копия с типом значения, не включающим поля ссылочного типа, или переопределение копии по умолчанию глубокой копией.
- Сделать тип неизменяемым. С неизменяемым типом поверхностная копия обеспечит независимость экземпляра независимо от того, содержит ли экземпляр ссылки или нет… Причина в том, что вы все равно не сможете изменить оригинал. Это также означает, что неизменяемые экземпляры могут совместно использовать память.
Однако, как правило, вы должны предоставить копию, которая копирует каждую часть экземпляра, которая не является неизменной. Если тип неизменяем, то поверхностной копии достаточно. Если тип не имеет неизменяемых частей (и это ссылочный тип или тип значения, который включает ссылки), необходимо предоставить глубокую копию. Если некоторые части являются неизменяемыми, а некоторые нет, то вы можете заархивировать семантику значений, выполнив глубокую копию изменяемых частей (и поверхностную копию неизменяемых частей, разделив их). Что, кстати, не является ни поверхностной копией, ни глубокой копией, а смесью.
Примечание. — Бьерн Страуструп рассматривает только глубокое и поверхностное копирование при определении семантики значений в Programming: Principles and Practice Using C++ .
Если у нас есть ссылочный тип, который содержит только поле неизменяемого ссылочного типа. Тогда достаточно скопировать эту ссылку. Нет необходимости копировать неизменяемый экземпляр. Затем при реализации операций мутации замените эту ссылку новой. Это копирование при записи.
Ценные объекты
Из книги Проектирование, управляемое предметной областью: устранение сложностей в основе программного обеспечения Эрика Эванса (который ввел термин «объект ценности»):
Представляет ли объект что-то с непрерывностью и идентичностью — что-то, что отслеживается в разных состояниях или даже в разных реализациях? Или это атрибут, описывающий состояние чего-то еще? Это основное различие между СУЩНОСТЬЮ и ОБЪЕКТОМ-ЗНАЧЕНИЕМ.
Эванс также интересовался семантикой значений:
Нам все равно, какой у нас экземпляр ОБЪЕКТА ЗНАЧЕНИЕ. Это отсутствие ограничений дает нам свободу проектирования, которую мы можем использовать для упрощения дизайна или оптимизации производительности. Это включает в себя принятие решений о копировании, совместном использовании и неизменяемости.
Мы видим то же определение и ту же озабоченность по поводу семантики значений, повторенную другими авторами.
Из книги Patterns of Enterprise Application Architecture Мартина Фаулера и др.:
Ключевое различие между объектами ссылки и объекта значения заключается в том, как они работают с равенством. Ссылочный объект использует идентичность как основу для равенства […]. Объект-значение основывает свое понятие равенства на значениях поля внутри класса. Таким образом, два объекта даты могут быть одинаковыми, если их значения дня, месяца и года совпадают. […] В большинстве языков нет специальных средств для объектов-значений. Чтобы в таких случаях объекты-значения работали должным образом, рекомендуется сделать их неизменяемыми, то есть после создания ни одно из их полей не изменится. Причина этого заключается в том, чтобы избежать ошибок псевдонимов. Ошибка псевдонимов возникает, когда два объекта совместно используют один и тот же объект значения, и один из владельцев изменяет значения в нем.
См. также Объект значения.
Стоит отметить, что Эванс также описывает Сущности, которые представляют собой объекты, имеющие значение, изменяемые и обладающие идентичностью.
Помимо этого, Эванс также описывает Услуги, которые являются объектами, не имеющими ценности и связанными с поведением. Многие потоковые конструкции являются службами. Например, блокировка чтения-записи. Блокировка чтения-записи не является значением.
Примечание. — Я говорю, что объекты значений не подразумевают семантику значений, а только равенство значений. Однако семантика значений является желательной характеристикой объектов значений. Можно сказать, что объекты-значения без семантики значений плохо спроектированы.
Bonus Chatter
Правило трех
Это характерно для C++.
Допустим, нам нужна семантика значений, и у нас есть тип значения, который не имеет полей ссылочного типа. Для этого достаточно мелкой копии по умолчанию.
Теперь предположим, что мы добавляем поле ссылочного типа к нашему типу. Таким образом, наша неглубокая копия приводит к двум экземплярам с полями, указывающими на один и тот же экземпляр ссылочного типа.
Чтобы избежать поверхностного копирования, нам нужно переопределить оператор присваивания и реализовать глубокое копирование. Однако, если мы не присваиваем значение существующей переменной, а инициализируем новую, оператор присваивания не вызывается, а вызывается конструктор копирования (опять же, по умолчанию используется поверхностное копирование). Таким образом, нам также нужно переопределить конструктор копирования.
Мы столкнулись с похожей проблемой с деструктором по умолчанию. Это не будет следовать ссылке. То есть глубокого разрушения он делать не будет. Это означало бы, что у нас будет утечка экземпляра поля ссылочного типа. Таким образом, нам также необходимо переопределить деструктор по умолчанию.
Таким образом, мы хотим переопределить оператор присваивания, конструктор копирования и деструктор. Это невозможно на большинстве языков.
См. также Правило трех.
О ссылках и семантике значений
Мы не должны требовать концепции ссылок или указателей для определения семантики значений. Языки, в которых нет этих понятий, все же могут иметь семантику значений.
Существует еще одна концепция, связанная с объектами-значениями, о которой нам нужно поговорить: объекты передачи данных. DTO предназначены для пересечения границ. Они могут перейти к другому процессу, даже к другой машине. Они не могут. При пересечении этих границ ссылки не работают. Таким образом, DTO должны избегать ссылок.
DTO не должны иметь поведения и иметь семантику значений.
DTO часто путают с объектами-значениями. Мартин Фаулер:
Обычно вы не можете отправить сам объект домена, потому что он связан с сетью мелких локальных межобъектных ссылок. Таким образом, вы берете все данные, которые нужны клиенту, и упаковываете их в определенный объект для передачи — отсюда и термин «объект передачи данных». (Многие люди в корпоративном сообществе Java используют для этого термин «объект-значение», но это приводит к конфликту с другими значениями термина «объект-значение»).
Объекты
Если вы вернетесь к определению объекта (согласно Грэди Бучу), вы обнаружите, что объекты имеют идентичность (а также состояние и поведение, которых может не быть). Однако мы игнорируем это определение, вместо этого мы говорим, что объекты являются экземплярами классов.
Кроме того, я бы сказал, что на объект значения имени влияет тот факт, что Эванс работал на Java и, следовательно, не мог определять пользовательские типы значений. Повторим еще раз: объекты-значения в Java относятся к ссылочным типам.
Безопасность потоков
Другим аргументом в пользу семантики значений является безопасность потоков.
Обратите внимание, что если мы передаем ссылки, даже константные ссылки, которые могут быть изменены другим потоком за кулисами, у нас возникнут проблемы. Таким образом, любая ссылка должна относиться к неизменяемому типу или к потокобезопасному типу.
является ли объект типа значения объектом значения?
Объекты значений могут относиться к типам значений или ссылочным типам.
является ли объект ссылочного типа ссылочным объектом?
Экземпляры ссылочных типов будут ссылочными объектами, если только они не переопределяют равенство.
имеет ли объект типа значения семантику значения?
Если он не имеет полей ссылочного типа или если он переопределяет копию по умолчанию для обеспечения семантики значений.
имеет ли объект ссылочного типа ссылочную семантику?
Если он не является неизменным и не переопределяет копию по умолчанию для обеспечения семантики значений.
1998
Эта версия шаблона List включает универсальный итератор и семантику значений для хранения общих данных. Семантика значений означает, что List хранит экземпляры объектов , а не указатели на объекты. Во время операций вставки Список сохраняет копии значений данных вместо хранения указателей. Хотя контейнеры с семантикой значений позволяют приложениям легко управлять небольшими объектами и встроенными типами, многие приложения не могут мириться с накладными расходами на копирование объектов.
— Пол Андерсон, Гейл Андерсон — Навигация по C++ и объектно-ориентированное проектирование
2004
Контейнеры STL являются семантическими значениями. Когда объект задачи добавляется в контейнер STL, вызывается распределитель объекта задачи и конструктор копирования для клонирования оригинала. Точно так же, когда объект задачи удаляется из контейнера STL, вызывается средство освобождения объекта задачи для удаления копии. Семантика значений может влиять на производительность, особенно если производители и потребители часто добавляют задачи в очередь и удаляют задачи из очереди.
— Тед Юань — Библиотека шаблонов параллелизма производитель-потребитель C++
2004
ValueSemantic для объектов по значению сохраняется путем копирования значений между объектами. ValueSemantics для объектов по ссылке сохраняется с помощью механизма CopyOnWrite. Я всегда думал, что на этом история закончилась. Являются ли ValueObjects просто объектами, сохраняющими ValueSemantics, или у них есть нечто большее?
— PhilGoodwin — объекты-значения могут изменяться
2014
Типы, обеспечивающие поверхностное копирование (например, указатели и ссылки), как говорят, имеют семантику указателя или семантику ссылки (они копируют адреса). Говорят, что типы, обеспечивающие глубокое копирование (например, string и vector ), имеют семантику значений (они копируют значения, на которые указывают указатели). С точки зрения пользователя типы с семантикой значений ведут себя так, как будто не используются никакие указатели — только значения, которые можно скопировать. Один из способов думать о типах с семантикой значений состоит в том, что они «работают точно так же, как целые числа» в том, что касается копирования.
— Бьерн Страуструп — Программирование: принципы и практика с использованием C++ одно и то же значение сегодня, и мы применяем ту же существенную операцию (под существенной я имею в виду операцию, которая предназначена для аппроксимации платоновского типа, который живет вне процесса, который мы используем в качестве нашей модели), затем после того, как эта операция применяется к обоим объектов они снова будут иметь то же значение или никогда не имели, и это ключевое свойство семантики значений.
Другой способ сказать это так: если два объекта имеют одинаковое значение, то не существует отличительной последовательности существенных операций, из-за которой они больше не будут иметь одинаковое значение.
– Джон Лакос – Интервью с Джоном Лакосом
2016
Семантика значений сводится к гарантии независимости значений переменных.