Простая функция, чтобы включить такие объекты в массив пар ключ-значение


У меня есть приложение, которое имеет много очень сложных объектов, которые в большинстве случаев мне нужно только получить доступ к идентификатор значение и значение имени. Я бы хотел, чтобы снизить издержки сериализации этих крупных объектов в JSON. Это простая функция, которую я создал, которая принимает массив объектов, а возвращает массив структур, содержащий только два ключа, идентификатор и значение. Это также должен быть совместим с серверами cf8 же.

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

<cffunction name="toKeyValuePairArray" returntype="Array" output="false" access="public">
    <cfargument name="theArray" type="Array" required="true" hint="an array of objects" />
    <cfargument name="idGetterFunctionName" type="string" />
    <cfargument name="valueGetterFunctionName" type="string" />
        <cfset var local = structNew() />
        <cfset var retArray = [] />
        <cfset var obj = {} />
        <cfloop array="#arguments.theArray#" index="local.theComponent">
            <cfset obj = {} />
            <cftry>
                <cfinvoke component="#local.theComponent#" method="#arguments.idGetterFunctionName#" returnvariable="local.id" />
                <cfinvoke component="#local.theComponent#" method="#arguments.valueGetterFunctionName#" returnvariable="local.value" />

                <cfset obj.id = local.id />
                <cfset obj.value = local.id />

                <cfset arrayAppend(retArray,obj) />
            <cfcatch></cfcatch>
            </cftry>
        </cfloop> 

        <cfreturn retArray />
</cffunction>


1453
2
задан 3 октября 2011 в 02:10 Источник Поделиться
Комментарии
3 ответа

Райан

Вот как я бы это сделал. Поскольку вы делаете что-то обратная совместимость с cf8 же, который явно не имеет "местных" масштабах, а вы уже объявили его через 'ВАР', потом кладем все остальные функции локальных переменных внутри этой структуры, и возвращать только то, что нужно.

<!--- 
* FUNCTION toKeyValuePairArray
* Method to create a simple object reference array to reduce overhead and improve performance.
* This assumes that your objects have Getters for their primary properties.
* (no need to instantiate every object, every time, when all you need is a number or a name)
*
* @theArray (array) - an array of objects
* @idGetterFunctionName - Function name for getter function that pulls the object's id
* @valueGetterFunctionName - Function name for getter function that pulls the object's name
--->
<cffunction name="ToKeyValuePairArray" returntype="array" output="false" access="public">
<cfargument name="theArray" type="Array" required="true" hint="an array of objects" />
<cfargument name="idGetterFunctionName" required="true" type="string" hint="Function name for getter function that pulls the object's id" />
<cfargument name="valueGetterFunctionName" required="true" type="string" hint="Function name for getter function that pulls the object's name" />

<cfset var LOCAL = StructNew() />
<cfset LOCAL.retArray = ArrayNew(1) />

<cfloop array="#ARGUMENTS.theArray#" index="LOCAL.theComponent">
<cfset LOCAL.tmpObjVals = StructNew() />
<cftry>
<cfinvoke component="#LOCAL.theComponent#" method="#ARGUMENTS.idGetterFunctionName#" returnvariable="LOCAL.id" />
<cfinvoke component="#LOCAL.theComponent#" method="#ARGUMENTS.valueGetterFunctionName#" returnvariable="LOCAL.value" />

<cfset LOCAL.tmpObjVals["id"] = LOCAL.id />
<cfset LOCAL.tmpObjVals["value"] = LOCAL.value />

<cfset ArrayAppend(LOCAL.retArray,Duplicate(LOCAL.tmpObjVals)) />
<cfcatch><!--- Empty Catch ---></cfcatch>
</cftry>
</cfloop>

<cfreturn LOCAL.retArray />
</cffunction>

Так как мы 'ВАР' один основной переменной (создавая нашу собственную функцию локальной области, так сказать) у нас больше нет чтобы объявить объект ТЭМП в верхней части метода, поскольку вы сбросить его в любом случае в верхней части каждой итерации цикла. Я также стандартизованную структуру и инициализация массива в метод, чтобы утверждать, что обратной совместимости (и стандартизации форма-это просто хорошая практика).

Вы на самом деле не делая каких-либо дополнительной обработки на возврат переменные называет свой 'добытчик', поэтому я применил их прямо в tempObj, чтоб не создавать лишних переменных. Вам не придется верхний имена областей делу. Я делаю это, чтобы сделать их лучше, когда глядя на код. Я сделал заглавные имена функций. Это просто то, что я получил от колледжа: начать прописные вызовов функций, и начать строчные буквы в именах переменных, то регистр остатка.

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

2
ответ дан 3 октября 2011 в 02:10 Источник Поделиться

Несколько вещей:


  1. Какая цель попробовать/поймать других, чем прятаться ошибка? Это понимать, что вы можете иметь объекты, которые не имеют соответствующего удостоверения и функций? Если да, то нужно ли их как-то попадает в ваше возвращение?

  2. Я бы изменил ваш объект obj имя переменной, так как не представляют, что возвращенные структуры объектов, поскольку они не :). Возможно, objValues вместо?

  3. Я бы изменить конечный arrayAppend использовать дублирующие функции, чтобы предотвратить проблемы ссылок.


Кроме этого, я не вижу никаких проблем с кодом.

2
ответ дан 3 октября 2011 в 02:10 Источник Поделиться

Я буду задавать очевидные/тупой вопрос. Вы можете получить доступ к этой информации из базы данных?

Простой запрос на ID и название будет легче работать.

1
ответ дан 4 октября 2011 в 06:10 Источник Поделиться