Что эквивалентно статическим методам в ColdFusion?
В С# я создал статические методы, чтобы помочь мне выполнить простые операции. Например:
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, чтобы структура создала экземпляр за кулисами, чтобы я мог использовать его, как если бы он был статичным, вроде как работает папка помощников?
Ответы
Ответ 1
Нет, вы правы, в ColdFusion нет понятия статических методов. Я думаю, что большинство из них решило бы эту проблему, используя утилиты singleton в области приложения, которые создаются при запуске приложения. Итак, в вашем приложении App.cfc в onApplication вы можете:
<cfset application.StringHelper = createObject("component", "path.to.StringHelper") />
Затем, когда вам нужно было позвонить из любой точки, вы будете использовать:
<cfset reversedString = application.StringHelper.reverse(string) />
Да, это не так чисто, как статические методы. Может быть, когда-нибудь у нас будет что-то похожее на них. Но сейчас я думаю, что это как можно ближе.
Ответ 2
Один из способов создания статики в 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.