вопрос об имени конструктора компонента ColdFusion - PullRequest
6 голосов
/ 10 июля 2009

У меня есть несколько вопросов о конструкторах в ColdFusion:

  1. я должен использовать имя init в качестве имени конструктора?
  2. если я создаю экземпляр компонента без вызова метода init, что возвращается?

    Экземпляр = CreateObject ( "компонент", "cfcName"); // какое значение сейчас содержит экземпляр

  3. Могу ли я взять код в методе init и удалить метод init, затем вставить код в заголовок компонента, имеет ли он тот же эффект, что и конструктор init?

большое спасибо.

Ответы [ 3 ]

14 голосов
/ 10 июля 2009

я должен использовать имя init в качестве имени конструктора?

Нет, вы можете назвать функцию инициализации так, как вам нравится. init() это просто соглашение. И это не настоящий конструктор, так как он не вызывается автоматически.

если я создаю экземпляр компонента без вызова метода init, что возвращается?

Экземпляр компонента возвращается, как и следовало ожидать. Наличие или отсутствие функции init() совершенно не имеет значения. В компонентах ColdFusion нет статических функций, вы всегда получаете полностью сконструированный экземпляр из GetObject("component", ...). (Это не так для объектов Java, которые создаются непосредственно перед первым использованием, если вы забыли / не делали это вручную.)

Могу ли я взять код в методе init и удалить метод init, а затем вставить код в заголовок компонента, это имеет тот же эффект, что и конструктор init?

Да, пока метод init() не принимает никаких параметров, разницы нет.

Однако принято иметь метод с именем init(), который возвращает экземпляр компонента. Даже если он ничего не делает 1025 *, кроме "<cfreturn this>". Я бы оставался последовательным и добавлял один к каждому компоненту, даже если это не было строго необходимо.

10 голосов
/ 10 июля 2009

Tomalak ответ правильный для ColdFusion 8; однако с ColdFusion 9 ситуация немного меняется, выход которой ожидается в конце этого года. (Для полноты картины я скопирую ответ Томалака и откорректирую его соответствующим образом, поэтому спасибо за быстрый старт.))


Должен ли я использовать имя init в качестве имени конструктора?

CF8: Нет, вы можете назвать функцию инициализации как угодно - «init» - это просто соглашение. И это не настоящий конструктор, так как он не вызывается автоматически.

CF9: Ответ по-прежнему "нет", вам не нужно . Но, возможно, вам следует: Это относится к созданию объектов в cfscript (или компонентах только для сценариев, которые также входят в CF9). Добавляются ключевые слова import и new, и вы сможете создать экземпляр объекта следующим образом:

import model.security.*;
userObj = new User();

Предполагается, что у вас есть User.cfc в папке model/security/. Кроме того, CF9 будет искать наличие метода с именем «init» или метода с тем же именем, что и у объекта (в данном случае «User»), и неявно вызывать его как конструктор.

Я не уверен, будет ли передача аргументов директиве new перенаправлять их в конструктор, как вы видели бы в Java / C. Я предполагаю, что так и будет, но я еще не видел ни презентаций, ни примеров кода, которые бы указывали так или иначе; и сам не проверял, потому что это пришло мне в голову, когда я писал это. ;) (Другая идея: мне интересно, будут ли поддерживаться несколько конструкторов с разными наборами аргументов. Я сомневаюсь в этом, но это хорошая идея.)

Я предполагаю, что есть некоторый смысл, что подобная функциональность может проявляться в CFML (язык на основе тегов, отдельный от cfscript), но на данный момент об этом ничего не сказано.

Если я создаю экземпляр компонента без вызова метода init, что возвращается?

Экземпляр компонента возвращается, как и следовало ожидать. Наличие или отсутствие функции init () совершенно не имеет значения. В компонентах ColdFusion нет понятия статических функций, вы всегда получаете полностью сконструированный экземпляр из GetObject («component», ...). (Это не так для объектов Java, которые создаются непосредственно перед первым использованием, если вы забыли / не делали этого вручную.)

Могу ли я взять код в методе init и удалить метод init, а затем вставить код в заголовок компонента, это будет иметь тот же эффект, что и конструктор init?

Да, если , если метод init () не принимает никаких параметров, разницы нет.

Однако принято иметь метод init (), который возвращает экземпляр компонента («this»). Даже если он ничего не делает, кроме "return this;". Я остался бы последовательным и добавил бы один к каждому компоненту, даже если это не было строго необходимо.

1 голос
/ 12 июля 2009

Некоторые сторонние библиотеки / фреймворки могут ожидать, что init будет функцией конструктора (очевидно, до CF9). Например, я считаю, что ColdSpring ищет метод с именем init при попытке передать аргументы конструктора.

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

Ссылка на презентацию Шона Корфилда о наборе утки: http://corfield.org/articles/ducktyping_cfunited.pdf

...