Что эквивалентно статическим методам в ColdFusion? - PullRequest
11 голосов
/ 02 сентября 2011

В C # я создал статические методы, чтобы помочь мне выполнять простые операции.Например:

public static class StringHelper
{
    public static string Reverse(string input)
    {
        // reverse string
        return reversedInput;
    }
}

Тогда в контроллере я бы назвал его, просто используя:

StringHelper.Reverse(input);

Теперь я использую ColdFusion с Model Glue, и я хотел бысделать то же самое.Однако кажется, что в ColdFusion нет концепции статических методов.Если я создаю CFC следующим образом:

component StringHelper
{
    public string function Reverse(string input)
    {
        // reverse string
        return reversedInput;
    }
}

Можно ли вызвать этот метод только путем создания в контроллере экземпляра StringHelper, например:

component Controller
{
    public void function Reverse()
    {
        var input = event.getValue("input");
        var stringHelper = new StringHelper();
        var reversedString = stringHelper.Reverse(input);
        event.setValue("reversedstring", reversedString);
    }
}

Или естьгде-то, где я могу поместить «статические» CFC, чтобы фреймворк создавал экземпляр за кулисами, чтобы я мог использовать его, как если бы он был статическим, вроде как работает папка helpers?

Ответы [ 2 ]

16 голосов
/ 02 сентября 2011

Нет, вы правы, в ColdFusion нет понятия статических методов.Я думаю, что большинство решило бы эту проблему путем использования одноэлементных утилит в области приложения, которые создаются при запуске приложения.Таким образом, в вашем App.cfc при запуске onApplication вы можете иметь:

<cfset application.StringHelper = createObject("component", "path.to.StringHelper") />

Затем, когда вам нужно было позвонить из любого места, вы будете использовать:

<cfset reversedString = application.StringHelper.reverse(string) />

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

6 голосов
/ 02 сентября 2011

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

Вот быстрый фрагмент:

component name="Employee"
{
 public Employee function Init(){
  var metadata = getComponentMetaData("Employee"); 

  if(!structKeyExists(metadata,"myStaticVar")){

   lock name="metadata.myStaticVar" timeout="10"{
    metadata.myStaticVar = "Hello Static Variable."; 
   }
  }

  return this;
 }
}

Подробнее здесь: http://blog.bittersweetryan.com/2011/02/using-metadata-to-add-static-variables.html.

...