نتائج البحث

اذهب إلى التنقل اذهب إلى البحث

الاستخدام الخطأ لمبادئ البرمجة كائنية التوجه (Object-Orientation Abusers)

من مشاكل الشيفرات أيضًا التطبيقُ الخطأ وغير المكتمل لمبادئ البرمجة كائنية التوجّه (Object-Oriented)، مثل: استخدام الأصناف البديلة (alternative) ذات الواجهات (interfaces) المختلفة المشكلة: التطابق بالمهام ما بين صنفين ولكن بأسماءٍ مختلفةٍ لتوابعهما. الحل: حذف أحد الصنفين بعد تنفيذ إحدى الحلول الآتية: إعادة تسمية التوابع (methods) لتصبح متطابقةً بكافّة الأصناف البديلة، أو توحيد التوقيع (signature) وتعريف الاستخدام ما بين التوابع (إمّا بنقل التابع أو إضافة المعاملات أو دمج التوابع عبر المعاملات)، أو استخراج صنفٍ أعلى وجعلهما صنفين فرعيين له (إن كان التطابق جزئيًا). الوراثة الفائضة (refused bequest) ...

نقل الميزات ما بين الكائنات (Moving Features between Objects)

تساعد عملية إعادة التصميم (refactoring) في توزيع المهام بشكل مثاليّ على الأصناف (classes) المختلفة في الشيفرة، وتضمن تقنيات الحل هذه طريقةً آمنةً لنقل المهام (functionality) ما بين الأصناف، وإنشاء أصناف جديدة وحماية تفاصيل عملية التنفيذ (implementation) من الوصول العام (public access)، وهذه التقنيات تشمل: نقل التابع (Move Method) المشكلة: استخدام التابع (method) في صنفٍ (class) ما أكثر من استخدامه في صنفه الأساسيّ. الحل: إنشاء تابعٍ جديدٍ في الصنف الأكثر استخدامًا لذلك التابع ونقل شيفرته إلى التابع الجديد، ثم تحويل الشيفرة ...

نقل الميزات ما بين الكائنات (Moving Features between Objects)

تساعد عملية إعادة التصميم (refactoring) في توزيع المهام بشكل مثاليّ على الأصناف (classes) المختلفة في الشيفرة، وتضمن تقنيات الحل هذه طريقةً آمنةً لنقل المهام (functionality) ما بين الأصناف، وإنشاء أصناف جديدة وحماية تفاصيل عملية التنفيذ (implementation) من الوصول العام (public access)، وهذه التقنيات تشمل: نقل التابع (Move Method) المشكلة: استخدام التابع (method) في صنفٍ (class) ما أكثر من استخدامه في صنفه الأساسيّ. الحل: إنشاء تابعٍ جديدٍ في الصنف الأكثر استخدامًا لذلك التابع ونقل شيفرته إلى التابع الجديد، ثم تحويل الشيفرة ...

تبديل قيم البيانات إلى كائنات (Replace Data Values with Objects)

المشكلة وجود حقلٍ (field) مٌخصَّص للبيانات في صنفٍ (class) ما (أو في عددٍ من الأصناف)، ولهذا الحقل بياناته وسلوكه (behaviour) المرتبط به. الحل إنشاء صنفٍ جديدٍ ليُوضَع فيه الحقل (field) بالإضافة إلى سلوكه المرتبط به، وتخزين كائنٍ (object) من هذا الصنف الجديد في الصنف الأصليّ للحقل. مثال قبل إعادة التصميم يحتوي الصنف Order على الحقل customer الذي يحتوي بيانات نصيّة (من النوع String) كما هو واضح في مخطط الأصناف الآتي: الصنف Order يحتوي على الحقل customer الذي يحتوي بيانات نصيّة. ...

تقديم الكائن الفارغ (Introduce Null Object)

المشكلة تؤدي إعادة بعض التوابع للقيمة null بدلًا من الكائنات الحقيقية إلى امتلاء الشيفرة البرمجية بالعديد من نقاط التحقق من القيمة null. الحل إعادة كائن فارغ يظهر السلوك الافتراضي بدلًا من null. مثال قبل إعادة التصميم وجودة نقطة تحقق شرطية من الكائن customer لاتخاذ إجراء مناسب إن كانت قيمته null: في لغة Java: if (customer == null) { plan = BillingPlan.basic(); } else { plan = customer.getPlan(); } في لغة C#‎: if (customer == null) { plan = BillingPlan.Basic(); } else { ...

الحفاظ على الكائن كاملًا (Preserve Whole Object)

المشكلة جلب عدة قيم من أحد الكائنات، ثم تمريرها كمعاملات إلى أحد التوابع. الحل حاول تمرير الكائن بالكامل بدلًا من ذلك. مثال قبل إعادة التصميم جلب قيمة درجة الحرارة المنخفضة low والمرتفعة high من الكائن daysTempRange ثم تمريرهما إلى التابع ()withinTange: في لغة Java: int low = daysTempRange.getLow(); int high = daysTempRange.getHigh(); boolean withinPlan = plan.withinRange(low, high); في لغة C#‎: int low = daysTempRange.GetLow(); int high = daysTempRange.GetHigh(); bool withinPlan = plan.WithinRange(low, high); في لغة PHP: $low = $daysTempRange->getLow(); $high = $daysTempRange->getHigh(); $withinPlan = $plan->withinRange($low, $high); في لغة Python: ...

تعريف كائن المُعامل (Introduce Parameter Object)

المشكلة تحتوي التوابع على نفس المجموعة المتكررة من المعاملات. الحل استبدال هذه المعاملات بكائنٍ واحد. مثال قبل إعادة التصميم تمرير نفس مجموعة المعاملات إلى توابع الصنف Customer: تحتوي التوابع على نفس المجموعة المتكررة من المعاملات. بعد إعادة التصميم تبديل كائن واحد بتلك المعاملات وتمريره إلى توابع الصنف Customer التي تشترك بنفس مجموعة المعاملات: استبدال هذه المعاملات بكائنٍ واحد. لم إعادة التصميم؟ غالبًا ما تُصادَف مجموعات متطابقة من المعاملات داخل العديد من التوابع. الأمر الذي يؤدي إلى تكرار الشيفرة البرمجية للمعاملات ...

الكائن Object في JavaScript

الدالة البانية Object تُنشِئ كائنًا. البنية العامة // الشكل المختصر لتهيئة الكائن { [ nameValuePair1[, nameValuePair2[, ...nameValuePairN] ] ] } // استدعاء الدالة البانية new Object([value]) nameValuePairN أزواج من الأسماء (السلاسل النصية) والقيم (أيّ نوع من القيم) التي يُفصل فيها بين الاسم والقيمة بنقطتين رأسيتين :. value أيّة قيمة في JavaScript. الوصف الدالة البانية Object تُغلِّف (wrap) القيمة المعطية في كائن، وإذا كانت القيمة المعطية null أو undefined، فستُنشِئ وتُعيد كائنًا فارغًا، وفيما عدا ذلك فستُنشِئ وتُعيد كائنًا من النوع المناسب للقيمة المعطية، ...

تقنيات إعادة التصميم (Refactoring Techniques)

إنشاء التوابع تستهدف إعادة التصميم بشكل رئيسيٍّ إنشاء التوابع الصحيحة المناسبة، إذ تكون التوابع الطويلة سببًا للمشاكل في كثيرٍ من الحالات، وتجعل شيفرات بعض التوابع منطق التنفيذ (execution logic) غامضًا ويصبح التابع بهذا عصيَّ الفهم من جهةٍ وصعب التغييرٍ من جهة ثانية. يشمل هذا القسم من الحلول كلَّ ما يتعلق بالتوابع وإزالة التكرار (duplicates) في الشيفرة ليسمح بإجراء التطويرات المستقبليّة، وهذه التقنيات هي: استخراج التوابع (Extract Methods): والتي تتمثل بوجود أجزاء من الشيفرة يُمكن عزلها وتجميعها سويةً. دمج التوابع (Inline ...

الكائنات في PHP

تهيئة الكائن لإنشاء كائن جديد، استخدم التعبير البرمجي new لتهيئة كائن من صنفٍ ما (class): <?php class foo { function do_foo() { echo "Doing foo."; } } $bar = new foo; $bar->do_foo(); ?> راجع فصل الأصناف والكائنات (Classes and Objects) للمزيد من المعلومات. التحويل إلى كائن إذا حوّلنا كائنًا إلى كائنٍ آخر فلن يُعدَّل فيه شيء، أما إذا حولنا قيمةً من أي نوعٍ آخر إلى كائن، فستُنشَأ نسخةً جديدةً من ...

الكائنات في PHP

تهيئة الكائن لإنشاء كائن جديد، استخدم التعبير البرمجي new لتهيئة كائن من صنفٍ ما (class): <?php class foo { function do_foo() { echo "Doing foo."; } } $bar = new foo; $bar->do_foo(); ?> راجع فصل الأصناف والكائنات (Classes and Objects) للمزيد من المعلومات. التحويل إلى كائن إذا حوّلنا كائنًا إلى كائنٍ آخر فلن يُعدَّل فيه شيء، أما إذا حولنا قيمةً من أي نوعٍ آخر إلى كائن، فستُنشَأ نسخةً جديدةً من ...

الكائن Process

يكون الكائن process عامًا (global) والذي يزود معلومات عن عملية Node.js الحالية ورقابةً عليها، كونه كائنًا عامًا فهو متوافر دومًا لتطبيقات Node.js دون استخدام ()require. أحداث Process الكائن process هو نسخة من EventEmitter. الحدث 'beforeExit' أُضيف في الإصدار: 0.11.12. يُطلَق الحدث 'beforeExit' عندما تفرغ Node.js من حلقة الأحداث (event loop) ولا يوجد عمل إضافي لجدولته. بشكل طبيعي، عملية Node.js سوف تنتهي عندما لا يكون هناك عمل مجدولٌ، لكن المُنصِت المسجِّل لحدث 'beforeExit' يمكن أن يعمل استدعاءات غير متزامنة، وبذلك يسبب ...

تبديل التابع إلى كائن التابع (Replace Method with Method Object)

المشكلة وجود تابعٍ طويلٍ بالكثير من المتغيِّرات المحليّة (local variables) المتداخلة والتي تحول دون تطبيق تقنية الحل باستخراج التابع (extract method). الحل نقل التابع إلى صنفٍ (class) مستقلٍ بحيث تصبح متغيِّراته المحليّة حقولًا (fields) لهذا الصنف، وتقسيم التابع بعد ذلك إلى عدّة توابع أصغر في الصنف ذاته. مثال قبل إعادة التصميم نلاحظ وجود العديد من المتغيِّرات المحليّة في التابع price()‎ بالإضافة إلى عملياتٍ أخرى قد تكون طويلةً ومعقَّدة: في لغة Java: class Order { //... public double price() ...

التسلط على الكائنات الأخرى (Feature Envy)

توصيف المشكلة استخدام بعضُ التوابع (methods) بياناتِ الكائنات (objects) الأخرى أكثر ممّا تستخدم بياناتِها ذاتَها. أسبابها تحدث هذه المشكلة عقب نقل الحقول (fields) إلى أصناف البيانات (data class)، إذ من الأفضل نقلُ التوابع المستخدِمة لتلك الحقول لذلك الصنف أيضًا. وما الحل؟ لنضع بالحسبان القاعدة الآتية: يجب أن تبقى الأجزاء التي تتغيَّر بآنٍ واحدٍ في المكان ذاته معًاولتحقيق ذلك: نقلُ التوابع (move methods) إلى المكان الأنسب في الشيفرة. عندما يستخدِم جزءٌ فقط من التابع بياناتِ كائنٍ (object) آخر، فالأفضل استخراجُ تابعٍ ...

خطوات إعادة التصميم (Refactoring)

تجري عملية إعادة التصميم (refactoring) عبر عدّة خطواتٍ تُحدِث تغييرًا بسيطًا تدريجيًّا يجعل الشيفرة (مع كلِّ تغييرٍ) أفضل بقليلٍ، ولكنها لا توثر على أداء وفعاليّة البرنامج وتحافظ على استمرار عمله بشكلٍ سليمٍ، وتتلخص إعادة التصميم بالخطوات الآتية: الحصول على شيفرةٍ نظيفة (clean code) إن لم تصبح الشيفرة أنظف من بعد إعادة التصميم فهذا هدرٌ للوقت، ولكن ما السبب؟ يحدث كثيرًا أن تحيد عن سياق إعادة التصميم بتغييراتٍ تدريجيّة صغيرةٍ لتتجه نحو إجراء تغييرٍ كبيرٍ واحدٍ! وهذا خطأ ومن السهل الوقوع ...

الكائن المؤجل (Deferred Object)

قُدِّم الكائن المؤجل في الإصدار jQuery 1.5، وهو كائن أداة قابل للتسلسل ينشأ عن طريق استدعاء التابع jQuery.Deferred()‎‎‎. ويمكنه تسجيل عدة دوال رد اتصال في صفوف رد الاتصال، واستدعاء هذه الصفوف، ونقل حالة النجاح أو الفشل لأي دالة متزامنة أو غير متزامنة. يكون الكائن المؤجل قابلاً للتسلسل، مماثلاً للطريقة التي يكون فيها كائن jQuery قابلاً للتسلسل، ولكن له توابعه الخاصة. بعد إنشاء كائن مؤجل، يمكنك استخدام أي من التوابع المذكورة أدناه إما بالتسلسل مباشرة من إنشاء الكائن، أو حفظ الكائن ...

وراثة الكائنات في PHP

وراثة الكائنات من المبادئ المعروفة في البرمجة كائنية التوجه وتستخدمه PHP في نموذج الكائنات الخاصّ بها. يؤثّر هذا المبدأ على العلاقة التي تربط بين الأصناف والكائنات. فعلى سبيل المثال، عند توسيع صنف معين، يرث الصنف الفرعي جميع التوابع من نوع public و protected من الصنف الأب، وإن لم يتجاوز (override،أي يعيد تعريف) الصنف الابن هذه التوابع فإنّها ستحافظ على وظيفتها الأصلية. يساعد مبدأ وراثة الكائنات في تعريف الوظائف التي تؤديها التوابع وجعلها أكثر تجريدًا، ويتيح أداء المزيد من الوظائف في ...

الكائنات العامة‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ في Node.js

هذه الكائنات متوفرة في جميع الوحدات (modules). قد تبدو المتغيرات التالية عامة ولكنها ليست كذلك. وهي موجودة فقط داخل نطاق الوحدات، راجع صفحة توثيق نظام الوحدات: ‎__dirname ‎__filename exports module require()‎‎‎ الكائنات المذكورة هنا خاصة ببيئة تشغيل Node.js. هناك عدد من الكائنات المضمنة التي تعد جزءًا من لغة JavaScript نفسها، والتي يمكن الوصول إليها عمومًا أيضًا. الصنف Buffer أُضيف مع الإصدار: v0.1.103. <function> يستخدم لمعالجة البيانات الثنائية. راجع صفحة توثيق buffer. ‎__dirname قد يبدو هذا المتغير عامًا ولكنه ليس كذلك. ...

الكائنات والمراجع في PHP

غالبًا ما ترد العبارة التالية كثيرًا عند الحديث عن البرمجة كائنية التوجّه في PHP 5: "تمرّر الكائنات بالمرجعية بصورة افتراضية". هذه العبارة ليست صحيحة تمامًا، وسيصحّح هذا القسم هذه الفكرة العامة بالاستعانة ببعض الأمثلة. المرجع في PHP هو اختصار يتيح لمتغيرين مختلفين الكتابة إلى القيمة ذاتها. ومنذ الإصدار الخامس من اللغة، لم يعد متغير الكائن يتضمّن الكائن نفسه كقيمة على الإطلاق، بل يتضمّن فقط معرّفًا للكائن يتيح الوصول إلى الكائن الحقيقي. وعند تمرير الكائن كمعامل أو إعادته أو إسناده إلى ...

كائنات UserList في بايثون

يعدّ UserList صنفًا يغلّف القوائم في بايثون، ويعدّ صنفًا أساسيًا مفيدًا لإنشاء أصناف شبيهة بالقوائم خاصّة بالمستخدم، والتي يمكن الوراثة منها وإعادة تعريف توابعها وإضافة توابع أخرى جديدة، وهكذا يمكن إضافة عمليات جديدة على القوائم. أصبحت الحاجة إلى هذا الصنف محدودة نظرًا لإمكانية التفريع المباشر من القوائم في بايثون، لكن التعامل مع هذا الصنف أسهل بسبب كون إمكانية الوصول إلى القائمة الضمنية كخاصية. البنية العامة class collections.UserList([list]) يحاكي هذا الصنف القوائم العادية في بايثون، ويجري الاحتفاظ بمحتويات النسخة في قائمة ...

عرض (20 السابقة | 20 التالية) (20 | 50 | 100 | 250 | 500).