نتائج البحث

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

الانتقال الفرعيّ Delegation في Kotlin

أثبت نموذج الانتقال الفرعيّ فعّاليته كبديلٍ جيّدٍ عن وراثة تعريف الاستخدام (implementation inheritance) إذ تدعم لغة Kotlin هذه الميّزة بشكلٍ طبيعيّ دون الحاجة إلى أيّ نوع قياسيّ من الشيفرات، وبالتالي فإنّ الصنف المُشتقّ (Derived) يرِث من الواجهة (Base) وينقل فرعيًا (delegate) كلَّ توابعه العامّة (public methods) إلى كائنٍ مُحدَّدٍ، كما في الشيفرة الآتية: interface Base { fun print() } class BaseImpl(val x: Int) : Base { override fun print() { print(x) } } class Derived(b: Base) : Base ...

التابع ‎.delegate()‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ في jQuery

‎.delegate( selector, eventType, handler )‎ أُهمِل مع الإصدار: 3.0. القيمة المعادة يُعيد كائنًا من النوع jQuery. الوصف يُرفق هذا التابع معالج بأحد الأحداث أو أكثر لكافة العناصر التي تطابق المُحدِد، الآن أو في المستقبل، استنادًا إلى مجموعة محددة من العناصر الجذر. ‎.delegate( selector, eventType, handler )‎ أُضيف مع الإصدار: 1.4.2. selector سلسلة نصية تُحدد ترشيح العناصر التي تبدأ الحدث من النوع String. eventType سلسلة نصية تحتوي على واحد أو أكثر من أنواع أحداث JavaScript مفصولة بمسافات، مثل "click"، أو "keydown,‎"، ...

الخاصّيّات المُعمَّمة (Delegated Properties) في لغة Kotlin

 استخدام الخاصّيّات المُعمَّمة تستطيع في لغة Kotlin تعريف استخدام (implement) الخاصّيّات يدويًا مرارًا وتكرارًا بكل مرةٍ تحتاجها، ولكن من الأسهل تعريف استخدامها مرةً واحدةً وتخزين هذا التعريف في المكتبة (library) للاستفادة منه كلما دعت الحاجة، وهذا يشمل: الخاصّيّات الكسولة (Lazy property): تُحسب قيمتها مرةً واحدةً فقط وذلك عند الوصول إليها للمرّة الأولى. الخاصّيّات المُراقَبة (observable property): إذ يُستدعَى مسؤول الانتظار (listener) عند حدوث أي تغييرٍ في الخاصّيّة. تخزين الخاصّيّات في map بدلًا من حقلٍ منفصلٍ لكلِّ منها. وتشمل لغة Kotlin ...

إخفاء التفويض (Hide Delegate)

المشكلة يصل العميل (client) إلى كائنٍ (object) ما وليكن الكائن B من أحد حقول (fields) أو توابع (methods) كائنٍ آخر وليكن A، ومن ثمّ يستدعي تابعًا لهذا الكائن B. الحل إنشاء تابعٍ جديدٍ في الصنف A والذي يُفضي إلى استدعاءٍ للكائن B، وبهذا لن يعلم العميل تفاصيل التفويض (delegation) للكائن B ولن يعتمد على ذلك. مثال قبل إعادة التصميم يتعامل صنف العميل (client class) مع صنفين، الأول صنف الأقسام (Department) والثاني صنف الأشخاص (Person) واللذان يحتويان تابعين للحصول على كائنٍ ...

المقارنة بين لغتيّ البرمجة Java و Kotlin

بعض المواضيع في Java ومعالجتها في Kotlin عالجت لغة Kotlin العديد من المشاكل الموجودة في Java وهي: التحكُّم بالمرجعيّات الفارغة (null references) عبر نظام الأنواع لا وجود للأنواع الخامّ (raw types) تُعدُّ المصفوفات في Kotlin ثابتة (invariant) للدوال (functions) في Kotlin أنواع مناسبة وهذا ما يتعارض مع التحويلات SAM في Java التنوّع في موقع الاستخدام (use-site variance) دون الحاجة إلى المحارف البديلة (wildcards) لا وجود للاستثناءات المُتحقَّق منها (checked exceptions) في Kotlin ما تمتاز به Java ولا تدعمه Kotlin الاستثناءات ...

استبدال التفويض بالتوريث (Replace Delegation with Inheritance)

المشكلة يحتوي الصنف على العديد من التوابع البسيطة التي تفوِّض إلى كل التوابع في صنفٍ آخر. الحل جعل الصنف مفوِّض وارث، الأمر الذي يجعل تابع التفويض غير ضروري. مثال قبل إعادة التصميم التابع الموجود في الصنف Employee مفوَّض إلى التابع ()getName في الصنف Person: يحتوي الصنف على العديد من التوابع البسيطة التي تفوِّض إلى كل التوابع في صنفٍ آخر. بعد إعادة التصميم جعل الصنف Employee يرث من الصنف Person والتخلص من التفويض: أصبح الصنف مفوِّض وارث، الأمر الذي يجعل تابع ...

Kotlin/Topics

بُنية لغة Kotlin مشابهةٌ لبنية لغة البرمجة Java بوصفها كائنيّة التوجه (OOP)، وبالتالي فهي تعتمد أساسًا على وجود الأصناف (classes) التي تحتوي بدورها على الخاصّيّات (properties) والدوال (functions)، كما وتدعم Kotlin العلاقات فيما بينها مثل الوراثة (inheritance) من صنفٍ أعلى (superclass) أو التداخل فيما بينها (nesting classes)، وتمتاز بوجود مُحدِّدات الوصول (visibility modifiers) للتحكم بعمليات الوصول للبيانات المُخزَّنة، وكذلك فهي تعتمد في بُنيتها على الحزم (packages) والمكتبات (libraries) التي تحتوي على الدوال المساعدة عند الحاجة إليها، أمّا عن بُنية التعليمات ...

التوصيفات (Annotations) في لغة Kotlin

التصريح عن التوصيف (Annotation Declaration) تُعدُّ التوصيفات إحدى الوسائل لإضافة بياناتٍ توصيفيّةٍ (metadata) إلى الشيفرة، وللتصريح عن التوصيف يُضاف المُحدِّد annotation قبل اسم الصنف، مثل: annotation class Fancy وقد تُحدَّد بعض خواصّ التوصيفات (annotation attributes) باستخدام التوصيفات الآتية (meta-annotations) لتوصيفات الصنف: ‎@Target لتحديد نوع العناصر التي يمكن توصيفها مثل الأصناف (classes) والدوال (functions) والخاصّيّات (properties) والتعابير (expressions) و... إلخ. ‎@Retention لتحديد فيما إن كان التوصيف مُخزَّنًا في ملفات الأصناف المُترجَمة، أو مرئيًا عبر انعكاسٍ (reflection) أثناء التنفيذ (runtime) (وكلاهما محقُّق بالحالة ...

التحميل الزائد للمعاملات (Operator Overloading) في لغة Kotlin

تُتيح لغة Kotlin إجراءَ مجموعةٍ مُعرَّفة مسبقًا من العمليات على أنواع البيانات المختلفة وذلك باستخدام رموزٍ ثابتةٍ تعتمدها لغة Kotlin مثل الرمز + أو الرمز * وتختلف فيما بينها بالأولويّة (precedence)، حيث توجد دالةٌ (إما دالة من الصنف [member] أو دالة إضافيّة [extension]) باسمٍ ثابتٍ لكلّ معاملٍ مُعرَّف بحسب النوع (نوعٌ يساريٌّ للعمليات الثنائيّة [binary operations] ونوع وسائط [argument type] للعمليات الأحاديّة [unary operations])، ويجب تحديد الدوال التي تحتوي على تحميلٍ زائدٍ للمعاملات بالمُحدَّد operator، تناقش الصفحة الاصطلاحات (conventions) التي ...

استخدام لغة Kotlin في تطوير تطبيقات الخادم (Server)

تُعدّ لغة Kotlin أداةً قويةً في تطوير تطبيقات الخادم (server)؛ إذ تكون الشيفرات فيها دقيقةً ومعبِّرة، وتمتاز بالتوافقيّة التامّة مع لغة Java ومن السهل تعلُّمها بسرعة. ميزات استخدام لغة Kotlin لتطوير تطبيقات الخادم (Server) القدرة على التعبير (Expressiveness): تساعد مميّزات لغة Kotlin المبتكرَة (مثل دعمها للمنشِئ الحافظ للنوع (type-safe builder) والخاصّيات المُعمّمة (delegated properties)) على إنشاء البنى التجريديّة (abstraction) سهلةِ الاستخدام. قابلية التوسّع (Scalability): تدعم لغة Kotlin ميّزة الروتينات المساعدة (coroutines)، وهي بهذا تتيح -في تطبيقات الخادم- إمكانيّة التوسّع لعددٍ ...

الارتباط الوثيق غير المناسب (Inappropriate Intimacy)

توصيف المشكلة استخدام أحد الأصناف (class) الحقولَ (fields) والتوابعَ (methods) الداخليّة لصنفٍ آخر بكثرة. أسبابها تعاملُ الأصناف (classes) مع بعضها بكثرةٍ، وهذا ما يجب أن تكون على درايةٍ به، إذ إنّ التصميم الجيّد يشترط الحدَّ من التواصل فيما بينها ما أمكن، وهذا سيسهِّل صيانتها (maintenace) وإعادة استخدامها (reuse). وما الحل؟ نقلُ التوابع (move methods) ونقل الحقول (move fields) من الصنف الحاليّ إلى الصنف الآخر الذي تُستخدَم فيه، وهو الحلُّ الأبسط عندما لا يحتاج الصنف الأول تلك الحقول والتوابع المنقولة. استخراج ...

الوسيط (Middle Man)

توصيف المشكلة عندما يكون للصنف (class) مهمةٌ واحدةٌ فقط وهي تفويض المهام (delegation) لصنفٍ آخر، فما أهمية وجوده بالأصل؟ أسبابها قد تنتج المشكلة عن التخلُّص المفرط من الاستدعاءات المتسلسلة كعلاجٍ لمشكلة سلاسل الرسائل (message chains). أو قد تنتُج عن النقل التدريجيّ للصنف (class) إلى أصناف أخرى ليبقى الصنف الأصليّ فارغًا إلا من أوامر التفويض (delegation). وما الحل؟ حذف الوسيط (remove middle man) إن كانت معظم أصناف التابع (method's classes) تفوِّض المهام (delegate) إلى صنفٍ آخر. إليك المزيد ستحصل بحلِّ المشكلة ...

الاستغناء عن الوسيط (Remove Middle Man)

المشكلة احتواء الصنف (class) على العديد من التوابع (methods) التي تنقل (delegate) سياق البرنامج إلى كائنات (objects) أخرى. الحل حذف تلك التوابع وإجبار العميل (client) على الاستدعاء المباشر للتوابع النهائية (التي سيصل إليها بالنهاية وتحتوي المهام الفعليّة). مثال قبل إعادة التصميم يتعامل صنف العميل (client class) مع صنفٍ واحدٍ فقط وهو الصنف Person، والذي بدوره يستدعي كائنًا من صنفٍ آخر باسم Department دون أن يكون العميل على علمٍ بتفاصيل ذلك الاستدعاء، كما هو واضح في مخطط الأصناف الآتي: مخطط يوضح ...

سلاسل الرسائل (Message Chains)

توصيف المشكلة وجود العديد من الاستدعاءات المتسلسلة في الشيفرة، مثل: ‎$a->b()->c()->d()‎. أسبابها تحدث المشكلة عند طلب العميل (client request) كائنًا (object) آخر والذي بدوره يطلب كائنًا آخر ثالثًا وهكذا، مما يعني اعتماد العميل على التنقّل (navigation) في بنية الأصناف (class structure)، وبالتالي فإنّ أيّ تعديلٍ في تلك العلاقات سيتطلَّبُ إجراء التعديلات أيضًا على العميل بحدِّ ذاته. وما الحل؟ إخفاء التفويض (hide delegate) لحذف الاستدعاءات المُتسلسلة. قد يساعد -ببعض الحالات- التفكيرُ بسبب الوصول إلى آخر كائنٍ (object) مستدعى، وعندها يمكن اللجوء ...

التابع ‎.undelegate()‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ في jQuery

‎.undelegate()‎ القيمة المعادة يُعيد كائنًا من النوع jQuery. اٌُهمل مع الإصدار: 3.0. الوصف إزالة معالج من الحدث لكافة العناصر التي تطابق المُحدِّد الحالي، استنادًا إلى مجموعة محددة من عناصر الجذر. ‎.undelegate()‎ أُضيف مع الإصدار: 1.4.2. هذا الشكل لا يقبل أي وسائط. ‎.undelegate( selector, eventType )‎ أُضيف مع الإصدار: 1.4.2. selector المحدد المستخدم لترشيح نتائج الحدث، وهو من النوع String. eventType سلسلة نصية من النوع String تحتوي على نوع حدث في JavaScript، مثل click أو keydown. ‎.undelegate( selector, eventType, handler )‎ ...

الخاصية ‎event.delegateTarget‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ في jQuery

event.delegateTarget القيمة المعادة تُعيد كائنًا من النوع Element. الوصف العنصر المُرفق به معالج أحداث jQuery المُستدعى حاليًا. event.delegateTarget أُضيف مع الإصدار: 1.7. تفيد هذه الخاصية عادةً في الأحداث المُفوَضة (delegated events) التي رُبِطَت بالحدث باستخدام التابع ‎.delegate()‎ أو التابع ‎.on()‎، عندما يرتبط معالج الحدث بالعنصر الأب للعنصر المُعالَج. على سبيل المثال، فيمكن استخدامه لتحديد وإزالة معالجات الأحداث في نقطة التفويض. بالنسبة إلى معالجات الأحداث غير المُفوَّضة المرفقة مباشرةً بعنصرٍ ما، وتكون الخاصية event.delegateTarget مساويةً دومًا للخاصية event.currentTarget. أمثلة عند النقر ...

الخاصية ‎event.delegateTarget‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ في jQuery

event.delegateTarget القيمة المعادة تُعيد كائنًا من النوع Element. الوصف العنصر المُرفق به معالج أحداث jQuery المُستدعى حاليًا. event.delegateTarget أُضيف مع الإصدار: 1.7. تفيد هذه الخاصية عادةً في الأحداث المُفوَضة (delegated events) التي رُبِطَت بالحدث باستخدام التابع ‎.delegate()‎ أو التابع ‎.on()‎، عندما يرتبط معالج الحدث بالعنصر الأب للعنصر المُعالَج. على سبيل المثال، فيمكن استخدامه لتحديد وإزالة معالجات الأحداث في نقطة التفويض. بالنسبة إلى معالجات الأحداث غير المُفوَّضة المرفقة مباشرةً بعنصرٍ ما، وتكون الخاصية event.delegateTarget مساويةً دومًا للخاصية event.currentTarget. أمثلة عند النقر ...

الكلمات المفتاحية (Keywords) والمعاملات (Operators) في لغة Kotlin

 الكلمات المفتاحيّة الثابتة (Hard Keywords) تُعدُّ الكلمات الآتية كلماتٍ مفتاحيّةً في لغة Kotlin وليس ممكنًا استخدامها كمُعرِّفات (identifiers): as تُستخدَم في التحويلات ما بين الأنواع (typecasts) تُحدِّد تسميةً بديلةً (alias) عند عملية الاستيراد (import) as?‎ للتحويلات الحافظة للنوع (safe type casts) break لإنهاء تنفيذ الحلقات (loops) class للتصريح عن الأصناف continue  للاستمرار بالخطوة التالية لأقرب حلقة محيطة (enclosing) do للبدء بحلقة do/while (والتي يُختبَر الشرط فيها لاحقًا) else لتعريف فرعٍ (branch) من تعبير الشرط if والذي سيُنفَّذ عندما يكون الشرط بالقيمة false false ...

الخاصّيّات (Properties) وحقول البيانات (Fields) في لغة Kotlin

التصريح عن الخاصّيّات (Declaring Properties) قد تحتوي الأصناف في لغة Kotlin على الخاصّيّات المعرَّفة إما كقيمٍ متغيّرةٍ عبر الكلمة المفتاحيّة var أو كقيمٍ ثابتةٍ للقراءة فقط (read-only) عبر الكلمة المفتاحيّة val، مثل: class Address { var name: String = ... var street: String = ... var city: String = ... var state: String? = ... var zip: String = ... } إذ يُمكن الوصول للخصائص عبر اسمها ...

تعريف الإضافات محليًّا (Introduce Local Extensions)

المشكلة الحاجة إلى بعض التوابع (methods) غير الموجودة في الصنف المساعد (utility class)، ومن غير الممكن إضافتها إلى ذلك الصنف. الحل إنشاء صنفٍ (class) جديدٍ يحتوي التوابع اللازمة، وجعله كصنف تغليفٍ (wrapper) للصنف المساعد أو كصنفٍ فرعيٍّ (subclass) له. مثال قبل إعادة التصميم يعتمد صنف العميل ClientClass على الصنف المساعد Date ولكنّه بحاجة إلى بعض التوابع غير الموجودة فيه (كتابع الحصول على اليوم التالي مثلًا): الصنف العميل ClientClass الذي يعتمد على الصنف المساعد Date. بعد إعادة التصميم أصبح هنالك صنف ...

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