Проблема с неявными средствами доступа ColdFusion - PullRequest
0 голосов
/ 21 января 2019

Проблема с неявными средствами доступа

Наша команда разработчиков недавно обнаружила, что мы получаем несколько ошибок при использовании неявного метода доступа get (person.firstName) вместо сгенерированного метода доступа get (person.getFirstName ()).Вот инструкции по воспроизведению ошибки:

  1. Создайте новое приложение ColdFusion со следующими файлами:

Application.cfc:

component {
    this.invokeImplicitAccessor = true;
}

Person.cfc:

component accessors=true {
    property firstName;
}

index.cfm:

local.person = new Person();
local.person.firstName = "Zachary";

for( local.i = 0; local.i lt 1000; local.i++ ) {
    local.j = local.person.firstName;
}

index2.cfm:

local.person = new Person();
local.person.firstName = "Zachary";

for( local.i = 0; local.i lt 1000; local.i++ ) {
    local.j = local.person.getFirstName();
}

Протестируйте index.cfm с помощью JMeter, используйте 2000 потоков, период разгона 10 с и число циклов 1 (план тестирования: https://pastebin.com/nBtpL4zP)

В наших тестах страница всегда дает сбойс тем же сообщением об ошибке:

Элемент PERSON.FIRSTNAME не определен в LOCAL.

Ошибка%, которую мы получаем с вышеуказанными настройками, обычно падает где-то между 8 и 10%, что означает, что 160-200 запросов из> 2000 запросов завершаются неудачно.

Когда index2.cfm тестируется с теми же настройками, мы не получаем никаких ошибок

Вот некоторые подробности о тестовой среде:

ОС: Windows Server 2016Стандартный ColdFusion: Adobe ColdFusion 2018, выпуск JMeter 5.0 (https://jmeter.apache.org/download_jmeter.cgi)

Кто-нибудь знает, почему это происходит? Существуют ли какие-то настройки ColdFusion, которые мы могли бы настроить? Пример приложения выше очень минимален, и мы неделать что-то особенное, поэтому я не вижу никаких причин, по которым неявные средства доступа должны давать сбои, особенно когда генерируемые средства доступа, кажется, проходят тот же тест без каких-либо проблем.

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

EDIT: исправлено использование index2.cfm для использования метода get () вместо неявного средства доступа.

EDIT2:Полное сообщение об ошибке / страница: https://pastebin.com/budqiV1m

EDIT3: Я создал отчет об ошибке для этого: https://tracker.adobe.com/#/view/CF-4203997

1 Ответ

0 голосов
/ 24 января 2019

Средства доступа являются функциями.Если у вас есть

  component accessors=true {
    property name="foo";
  }

Правильный способ использования неявных методов доступа: this.getFoo () или просто getFoo () (внутри компонента) или myComponent.getFoo () вне компонента.

this.getFoo - это указатель на получатель, а не сам получатель.В вашем примере local.j = local.person.firstName; устанавливает j для указателя на получатель, а не для значения свойства;это должно быть person.getFirstName () , если вы действительно хотите использовать неявный метод доступа.

Уже много лет не так, что явные методы получения или установки быстрее (в любомАКФ или Люси).Конечно, вы все равно можете писать их, если они вам нужны, и они перезаписывают неявные функции.

Хотя этот пример взят из документов Adobe ORM, он лучше иллюстрирует, как следует использовать неявные средства доступа:

https://helpx.adobe.com/coldfusion/developing-applications/coldfusion-orm/working-with-objects/generated-accessors.html

Вот более полное объяснение - несмотря на то, что это для Lucee, оно также работает в ACF:

https://rorylaitila.gitbooks.io/lucee/content/properties.html

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

...