Для someObj.someName != someObj.someName
вполне приемлемо быть правдой, как это ни странно может показаться.
Причина (как на это ссылались другие) заключается в том, что атрибуты соответствуют реальным функциям RPC. В случае атрибутов readonly
они просто отображаются на сеттер, а для атрибутов, не предназначенных только для чтения, есть сеттер и геттер, неявно созданные для вас при компиляции IDL. Но важно знать, что атрибут IDL имеет динамическое, определяемое сервером, RPC-управляемое значение .
IDL определяет контракт для распределенных взаимодействий, который может быть заключен во время выполнения между независимыми, разъединенными объектами. Почти каждое взаимодействие с типом на основе IDL приведет к вызову RPC, и любое возвращаемое значение будет зависеть от того, что сервер решит вернуть.
Если атрибут, скажем, currentTime
, то, возможно, вы будете получать текущее время сервера на каждом извлечении значения. В этом случае someObj.currentTime != someObj.currentTime
, скорее всего, всегда будет истинным (при условии, что используемая гранулярность времени меньше, чем объединенное время приема-передачи для двух вызовов RPC).
Если вместо этого атрибута currentBankBalance
, вы можете иметь значение someObj.currentBankBalance != someObj.currentBankBalance
, которое может быть истинным, потому что могут быть другие клиенты, работающие в других местах, которые постоянно изменяют атрибут с помощью функции сеттера, поэтому вы имеете дело с условием гонки. тоже.
С учетом всего вышесказанного, если вы посмотрите очень формально на спецификацию IDL, он не содержит языка, который фактически требует, чтобы установка / доступ к атрибуту приводил к вызову RPC серверу. Может обслуживаться клиентским ORB. Фактически, это то, что некоторые поставщики ORB воспользовались еще во времена расцвета CORBA. Раньше я работал на Orbix ORB , и у нас была функция, называемая Smart Proxies - то, что позволяло бы разработчику приложения перегружать предоставляемые ORB клиентские прокси по умолчанию (которые всегда переадресовывать все вызовы атрибутов на сервер, на котором размещен целевой объект) с пользовательскими функциями (например, для кэширования значений атрибутов и возврата локальной копии без нагрузки на сеть или сервер).
Таким образом, вы должны быть очень четкими и точными в том, что вы пытаетесь проверить формально. Учитывая динамический и недетерминированный характер значений, которые они могут возвращать (и тот факт, что клиентские ORB могут вести себя по-разному друг от друга и при этом оставаться совместимыми со спецификацией CORBA) вы можете только надежно ожидать, что атрибуты IDL будут сопоставлены с получателями и сеттеры, которые можно использовать для получения или установки значения . Просто не существует предсказуемости, связанной с возвращаемыми фактическими значениями.