سؤال

في رمز شركتي ، غالبًا ما رأيت ملفات المكونات المستخدمة عن طريق تهيئة كائن من هذا المكون واستدعاء الأساليب من الكائن. ومع ذلك ، يبدو لي أكثر وضوحًا إلى حد ما لاستخدام طريقة CFInvoke ، خاصة عند استخدام طريقة واحدة فقط من ملف المكون. ما هي الاختلافات بين هاتين الطريقتين لاستدعاء وظيفة المكون وما هي إيجابيات/سلبيات كل منها؟ متى يجب أن أستخدم أي؟

هل كانت مفيدة؟

المحلول

يمكن استخدام cfinvoke فقط في العلامات.

يمكن استخدام CreateObject في كل من العلامات و cfscript ويميل إلى أن يكون أقل حجماً / أسهل في قراءة IMO.

حتى وقت قريب ، تجنبت استخدام Cfinvoke لأنني وجدت أنه "ضخم" ولكن من المحترف منه هو أنه يمكنك حزمة ديناميكي على الطرق داخل CFC. في createBject لا يمكنك.

لذلك ، على سبيل المثال ، لدي CFC يحتوي على الطرق - Method1 ، Method2 ، Method3 ، Method4. يمكنني حلقةهم مثل هكذا:-

<cfloop from="1" to="4" index="element">
   <cfif structKeyExists(this,'getMethod#element#')>
<cfinvoke component="#this#" method="getLine#local.element#" returnVariable="methodValue"></cfinvoke>
<cfset arrayAppend(myArray,methodValue) />
   </cfif>

--

شيء آخر يجب ملاحظته هو أن بعض المضيفين المشاركة يغلقون على CreateBject. ويرجع ذلك أساسا إلى الوصول الذي يعطيه إلى جافا المسطحة.

نصائح أخرى

فائدة أخرى من استخدام createObject() هل يمكنك سلسلة من init() الطريقة ، على سبيل المثال

<cfset myObject = createObject("com.path.MyObject").init() />

وإذا كان الخاص بك init() عائدات this يمكنك الذهاب إلى أبعد من ذلك وسلسلة الطريقة إذا لم تكن بحاجة إلى استخدام الكائن مرة أخرى:

<cfset functionResults = createObject("com.path.MyObject").init().myFunction() />

تجدر الإشارة إلى أنه في CF 9 يمكنك استخدام الجديد (مهم) new بناء الجملة لإنشاء كائنات. على سبيل المثال لإنشاء نفس الكائن على النحو الوارد أعلاه واتصل به init() أستطيع أن أكتب:

<cfset myObject = new com.path.MyObject() />

إنه أنيق وأحب خيار القيام بذلك. CF يتحرك في الاتجاه الصحيح في رأيي مع ميزات مثل هذا.

لقد أجبت على ذلك بنفسك تقريبًا: على السطح ، يمكن للمرء أن يقول إنه إذا كنت ستتصل بأسلوب واحد فقط على صفحة ، فإن القيام به في ضربة واحدة في Cfinvoke (الذي يقوم بتثبيت CFC وتدعو الطريقة المسماة) أمر منطقي . وبالتأكيد إذا كنت ستتصل بأكثر من طريقة واحدة من CFC على صفحة ما ، فإن فصل الخطوات أمر منطقي (إنشاء CFC مع وظيفة CreateObject أو علامة cfobject ، ثم استدعاء الأساليب كما هو موجود في هذا الكائن ، مؤشر إلى CFC) ، بحيث لا تدفع تكلفة هذا التكلفة أكثر من مرة.

ولكن ضع في اعتبارك أنه إذا تم استدعاء الصفحة في كثير من الأحيان ، فقد يكون من المنطقي أيضًا توفير هذه النتيجة لتشكيل CFC ، بحيث يمكن إعادة استخدامها بناءً على طلب لاحق إلى الصفحة. ستفعل ذلك عن طريق تخزينه (نتيجة CFObject/CreateObject) ليس في متغير محلي ولكن بدلاً من ذلك في نطاق مشترك: ما إذا كان الخادم أو التطبيق أو الجلسة ، استنادًا إلى "من" سيستفيد من مثل هذا إعادة الاستخدام. بالطبع ، يتعين عليك ذلك للتعامل برمجيًا/تحديد المدة التي يتم فيها حفظ مثيل CFC "المخزن مؤقتًا".

كما هو مهم ، عندما تقوم بحفظ مثيل CFC بهذه الطريقة ، تصبح أكثر عرضة لـ "علة Var Scope Bug" ، وهو ما يجب أن تكون أكثر حذراً في أي متغيرات محلية تقوم بإنشائها في CFC. بدلاً من محاولة توضيح المزيد حول ذلك ، سأشير إلى موارد ميتا قمت بإنشائها على ذلك:

http://www.carehart.org/blog/client/index.cfm/2010/3/4/resources_on_the_var_scope_problem

امل ان يساعد.

بدلاً من ذلك ، أعد صياغة هذه المناقشة ، سأوجهك نحو Google:

http://www.google.com/search؟q=cfinvoke+vs+CreateBject

هناك بعض الاختلافات الدقيقة (أي: <cfinvoke> قادر على التعامل مع أسماء الطرق الديناميكية) ولكنه في الأساس يتلخص في التفضيل الشخصي. حسنًا ، هذا وحقيقة أنه لا يمكنك استخدامه <cfinvoke>عبر <cfscript>.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top