نتائج البحث
اذهب إلى التنقل
اذهب إلى البحث
أنماط المخرجات في Sass
بالرغم من أنّ النمط الافتراضي لمخرجات CSS في Sass لطيفٌ ويعكسُ بِنية المستند، إلا أنَّ الأذواق والاحتياجات تختلف من شخص لآخر، لذا تدعمُ Sass عدة أنماط أخرى. تسمح لك Sass بأن تختار بين أربعة أنماط مختلفة للإخراج عن طريق ضبط الخيار :style أو استخدام الراية --style في سطر الأوامر. ملاحظة: لا يدعم مصرّف Sass الذي يمكن تثبيت باستخدام مدير الحزم npm النمط :nested؛ إذا أردتَ استخدامه فثبت مصرّف Sass كما هو موضّح في صفحة تثبيت وضبط واستخدام Sass. النمط المتشعّب ...
خطوات إعادة التصميم (Refactoring)
تجري عملية إعادة التصميم (refactoring) عبر عدّة خطواتٍ تُحدِث تغييرًا بسيطًا تدريجيًّا يجعل الشيفرة (مع كلِّ تغييرٍ) أفضل بقليلٍ، ولكنها لا توثر على أداء وفعاليّة البرنامج وتحافظ على استمرار عمله بشكلٍ سليمٍ، وتتلخص إعادة التصميم بالخطوات الآتية: الحصول على شيفرةٍ نظيفة (clean code) إن لم تصبح الشيفرة أنظف من بعد إعادة التصميم فهذا هدرٌ للوقت، ولكن ما السبب؟ يحدث كثيرًا أن تحيد عن سياق إعادة التصميم بتغييراتٍ تدريجيّة صغيرةٍ لتتجه نحو إجراء تغييرٍ كبيرٍ واحدٍ! وهذا خطأ ومن السهل الوقوع ...
أنماط الشيفرات المُتعارَف عليها ما بين مبرمجي Kotlin
تعرِض هذه الصفحة أنماط كتابة الشيفرات المُتعارَف عليها (conventions) من قِبل مبرمجي لغة Kotlin. تطبيق دليل التنسيق (Applying the Style Guide) لضبط المُنسِّق IntelliJ formatter بما يتوافق مع هذا الدليل يُنصَح بتثبيت إضافة Kotlin بالإصدار 1.2.20 (أو أي إصدارٍ أحدث) وضبط المّحرِّر بالانتقال إلى الإعدادات (Settings) ثمّ المُحرِّر (Editor) ثم نمط الشيفرة (Code Style) ثم Kotlin واختر "ضبط من..." Set from…"" في الزاوية اليمنى العُلويَّة ومن القائمة اختر الخيار Predefined style/Kotlin style guide. وللتأكد من تنسيق الشيفرة وفقًا لدليل Kotlin ...
أنماط الشيفرات المُتعارَف عليها ما بين مبرمجي Kotlin
تعرِض هذه الصفحة أنماط كتابة الشيفرات المُتعارَف عليها (conventions) من قِبل مبرمجي لغة Kotlin. تطبيق دليل التنسيق (Applying the Style Guide) لضبط المُنسِّق IntelliJ formatter بما يتوافق مع هذا الدليل يُنصَح بتثبيت إضافة Kotlin بالإصدار 1.2.20 (أو أي إصدارٍ أحدث) وضبط المّحرِّر بالانتقال إلى الإعدادات (Settings) ثمّ المُحرِّر (Editor) ثم نمط الشيفرة (Code Style) ثم Kotlin واختر "ضبط من..." Set from…"" في الزاوية اليمنى العُلويَّة ومن القائمة اختر الخيار Predefined style/Kotlin style guide. وللتأكد من تنسيق الشيفرة وفقًا لدليل Kotlin ...
استبدال المُنشئ بتابع التصميم (Replace Constructor with Factory Method)
المشكلة لديك مُنشئ (constructor) معقد يقوم بما هو أكثر من مجرد وضع قيم المعامل في حقول الكائن. الحل إنشاء تابع تصميم واستخدامه لاستبدال استدعاءات المُنشئ. مثال قبل إعادة التصميم وجود منشئ معقد للصنف Employee: في لغة Java: class Employee {
Employee(int type) {
this.type = type;
}
//...
}
في لغة C#: public class Employee
{
public Employee(int type)
{
this.type = type;
}
//...
}
في لغة PHP: class ...
تقنيات إعادة التصميم (Refactoring Techniques)
إنشاء التوابع تستهدف إعادة التصميم بشكل رئيسيٍّ إنشاء التوابع الصحيحة المناسبة، إذ تكون التوابع الطويلة سببًا للمشاكل في كثيرٍ من الحالات، وتجعل شيفرات بعض التوابع منطق التنفيذ (execution logic) غامضًا ويصبح التابع بهذا عصيَّ الفهم من جهةٍ وصعب التغييرٍ من جهة ثانية. يشمل هذا القسم من الحلول كلَّ ما يتعلق بالتوابع وإزالة التكرار (duplicates) في الشيفرة ليسمح بإجراء التطويرات المستقبليّة، وهذه التقنيات هي: استخراج التوابع (Extract Methods): والتي تتمثل بوجود أجزاء من الشيفرة يُمكن عزلها وتجميعها سويةً. دمج التوابع (Inline ...
مطابقة الأنماط باستخدام ميزات Bash
مدى المحارف Character Ranges خلافًا لأمر grep والتعابير النمطية (regular expressions) فإن لدينا حالات كثيرة لمطابقة الأنماط التي يمكنك إجراؤها في الصدفة مباشرة دون الحاجة إلى استخدام برنامج خارجي، فلعلك تعلم أن محرفي * و ? يطابقان أي نص أو محرف وحيد -على الترتيب-، ومن أجل مطابقة هذين المحرفيْن تحديدًا، ضع حول كل منهما علامات اقتباس مزدوجة: hsoub ~> touch "*"
hsoub ~> ls "*"
*
يمكنك استخدام الأقواس المربعة لمطابقة أي محرف أو مجموعة محارف بداخل تلك الأقواس إن فُصلت أزواج المحارف ...
متى تحتاج إعادة التصميم؟ (When to Refactor)
نحتاج إلى إعادة التصميم (قاعدة المرات الثلاث): عند قيامك بأيّة مهمةٍ للمرّة الأولى، فالمهم هو إنجازها والحصول على النتيجة وحسب. لدى قيامك بمهمةٍ مشابهةٍ للمرّة الثانية قد ترفض بادئ الأمر فكرة التكرار ولكنك ستجد نفسك تقوم بنفس العمل! عند قيامك بالمهمة للمرّة الثالثة، ستحتاج إعادة التصميم. عند إضافة ميّزةٍ (feature) جديدة تساعد عملية إعادة التصميم (refactoring) على فهم شيفرات المبرمجين الآخرين بشكلٍ أفضل، وعند العمل على الشيفرة غير الجيدة لأحدهم فعليك بإعادة تصميمها أولًا، وهذا ضروريٌّ إذ يصبح التحكُّم بالشيفرة ...
الصنف :link
الصنف الزائف :link في CSS (أي pseudo-class) يُمثِّل عنصرًا لم تتم زيارته من قبل، ويُطابِق جميع عناصر و <area> و <link> التي لها الخاصية href ولم تتم زيارتها بعد. a:link {
color: red;
}
الأنماط المُعرَّفة للصنف الزائف :link سيتم تجاوزها بأيّة أصناف زائفة تليها خاصة بالروابط (مثل :active أو :hover أو :visited) التي لها نفس درجة التحديد. ولتطبيق الأنماط تطبيقًا صحيحًا فضع قاعدة :link قبل جميع القواعد الخاصة بالروابط وفق الترتيب :link ثم :visited ثم :hover ثم :active. ملاحظة: استخدم ...
Document.enableStyleSheetsForSet()
يفعّل التّابع Document.enableStyleSheetsForSet() صفحات الأنماط التي توافق الاسم المُحدّد في مجموعة صفحات الأنماط الحاليّة، ويُعطّل جميع صفحات الأنماط الأخرى (عَدا تلك التي بدون عنوان، والتي تكون دائمًا مُفعّلة). البنية العامة document.enableStyleSheetsForSet(name)
name اسم صفحات الأنماط المرغوب تفعيلها. ستُفعّل جميع صفحات الأنماط التي توافق هذا الاسم، لكن ستُعطَّل جميع صفحات الأنماط الأخرى التي تملك عنوانًا. مرّر سلسلةً نصيّةً فارغةً لهذا المُعامل لتعطيل جميع صفحات الأنماط البديلة والمُفضّلة (دون صفحات الأنماط الدّائمة التي لا تملك خاصّية title). ملاحظات تُوافَقُ العناوين يكون حسّاسًا ...
Document.preferredStyleSheetSet
تُعيد مجموعة صفحات الأنماط المُفضّلة حسب ما ضبطه كاتب الصّفحة. وهي للقراءة فقط. البنية العامّة preferredStyleSheetSet = document.preferredStyleSheetSet
تُشير قيمة المتغيّر preferredStyleSheetSet إلى مجموعة صفحات الأنماط المُفضّلة من طرف كاتب الصّفحة. يُحدَّدُ هذا من خلال ترتيب تعريفات صفحات الأنماط وترويسة HTTP ذات العنوان Default-Style. إن لم تكن هناك مجموعة صفحات أنماط مُفضَّلة من طرف الكاتب، فستكون القيمة المُعادة سلسلةً نصية فارغة (""). مثال if (document.preferredStyleSheetSet) {
console.log("مجموعة صفحات الأنماط المُفضّلة هي:" + document.preferredStyleSheetSet);
} else {
console.log("لا توجد صفحة ...
Sass/@ rules
تدعم Sass جميع قواعد CSS التي تبدأ بالرمز @، فضلًا عن أخرى خاصَّة بلغة Sass تسمى بالتعليمات (directives). لهذه القواعد تأثيرات مختلفة في Sass سنفصلها بعد قليل. انظر أيضًا تعليمات التحكم (control directives) وتعليمات المخاليط (mixin directives). القاعدة @import توسّع Sass استخدامات القاعدة @import الخاصَّة بلغة CSS للسماح لها باستيراد ملفات SCSS وملفات Sass. ستُدمج جميع ملفات SCSS وملفات Sass المُستورَدة معًا في ملف CSS واحدٍ. إضافةً إلى ذلك، يمكن استخدام المتغيرات أو المخاليط (mixins) المُعرّفة في الملفات المستوردة في ...
استبدال الأصناف الفرعية بالحقول (Replace Subclass with Fields)
المشكلة لديك أصناف فرعية تختلف فقط في توابع (إعادة الثوابت) الخاصة بها. الحل استبدال التوابع بالحقول في الصنف الأب وحذف الأصناف الفرعية. مثال قبل إعادة التصميم لدينا الصنف Person الذي يحتوي على الصنفيين الفرعيين Male و Female؛ يختلف هذان الصنفان في القيمة المعادة فقط. يحتوي الصنف Person يحتوي على الصنفيين الفرعيين Male و Female. بعد إعادة التصميم وضع حقول في الصنف Person الأب مكان مقابلة لحقول الصنف الفرعي Male و Female ثم حذف هذان الصنفان. حذف الصنفان الفرعيان Male و ...
Document.selectedStyleSheetSet
تُعيد اسم مجموعة صفحات الأنماط الجاري استعمالها حاليًّا. البنية العامة currentStyleSheetSet = document.selectedStyleSheetSet
document.selectedStyleSheet = newStyleSheetSet
عند الإعادة، سيحمل المتغيّر currentStyleSheetSet اسم مجموعة صفحات الأنماط الجاري استعمالها حاليًّا، يُمكنك كذلك ضبط مجموعة صفحات الأنماط باستعمال هذه الخاصيّة. ضبط قيمة لهذه الخاصيّة مُكافئٌ لاستدعاء التّابع document.enableStyleSheetsForSet() باستخدام القيمة currentStyleSheetSet، ثمّ ضبط نفس القيمة للخاصية lastStyleSheetSet أيضًا. مُلاحظة: قيمة هذه الخاصيّة حيّة؛ تغيير الخاصيّة disabled على صفحات الأنماط سيُؤثّر على قيمة هذه الخاصيّة. مثال console.log("مجموعة صفحات الأنماط الجاري استعمالها حاليًّا:" + document.selectedStyleSheetSet);
document.selectedStyleSheetSet = ...
Document.styleSheetSets
تُعيد قائمة بمجموعات صفحات الأنماط المُتاحة على المُستند حاليًّا. البنية العامة sets = document.styleSheetSets
عند الإعادة، سيحمل المتغيّر sets قائمة بمجموعات صفحات الأنماط المُتاحة على المُستند حاليًّا. مثال لنَفرِض أنّ لدينا عنصر قائمة <ul> بالمُعرِّف "sheetList" (ID)، يُمكنك ملء هذه القائمة بأسماء مجموعات صفحات الأنماط المُتاحة بشيفرة مُشابهة لما يلي: var list = document.getElementById("sheetList");
var sheets = document.styleSheetSets;
list.innerHTML = "";
for (var i = 0; i < sheets.length; i++) {
var item = document.createElement("li");
item.innerHTML = sheets[i];
list.appendChild(item);
}
ملاحظات ...
Document.lastStyleSheetSet
تُعيد آخر مجموعة صفحات أنماط مُفعَّلة؛ تتغيّر قيمة هذه الخاصية كلّما تغيّرت قيمة الخاصية document.selectedStyleSheetSet. البنية العامة lastStyleSheetSet = document.lastStyleSheetSet
قيمة المتغير lastStyleSheetSet ستُشير إلى آخر مجموعة صفحات أنماط ضُبِطت. إن لم تتغيّر مجموعة صفحات الأنماط الحاليّة عبر تعيين قيمة للخاصيّة document.selectedStyleSheetSet، فإنّ القيمة المُعادة ستكون null. لاحظ بأن هذه القيمة لا تتغير عند استدعاء التّابع document.enableStyleSheetsForSet(). مثال var lastSheetSet = document.lastStyleSheetSet;
if (!lastSheetSet) {
lastSheetSet = "لم تتغير صفحة الأنماط بعد";
}
console.log("آخر مجموعة صفحة أنماط كانت: " + lastSheetSet);
انظر ...
تبديل القيمة إلى مرجع (Change Value to Reference)
المشكلة وجود العديد من النُسَخ المتماثلة من صنفٍ واحدٍ تحتاج إلى استبدال كائنٍ واحدٍ بها. الحل تحويل الكائنات المتماثلة إلى كائن مرجعي واحد. مثال قبل إعادة التصميم مخطط يوضح وجود العديد من النُسَخ المتماثلة من الصنف Order: مخطط يوضح وجود العديد من النُسَخ المتماثلة من صنفٍ Order. بعد إعادة التصميم تحويل الكائنات المتماثلة إلى كائن مرجعي واحد: تحويل الكائنات المتماثلة إلى كائن مرجعي واحد. لم إعادة التصميم؟ في العديد من الأنظمة، يمكن تصنيف الكائنات على أنها إمَّا قيم أو مراجع. ...
تبديل رموز الأنواع بالحالة/الاستراتيجية (Replace Type Code with State/Strategy)
ما هو رمز النوع؟ يحدث رمز النوع عندما يوجد مجموعة من الأرقام أو السلاسل النصية التي تشكل قائمة بالقيم المسموح بها لبعض العناصر بدلًا من استخدام نوع بيانات منفصل. وغالبًا ما تُعطَى هذه الأرقام والسلاسل المحددة أسماءً مفهومة عن طريق الثوابت، وهو السبب في استخدام هذه الرموز بشكل كبير. المشكلة يؤثر نوع مُرمَّز على سلوك البرنامج ولكن لا يمكن استخدام الأصناف الفرعية للتخلص منه. الحل استبدال رمز النوع بكائن حالة. إذا كان من الضروري استبدال قيمة حقل برمز النوع، فسيكون ...
التابع Regexp.union في روبي
يُعيد التابع union كائنًا من النوع Regexp، والذي يمثل اتحاد الأنماط المعطاة؛ أي أنه سيتطابق مع أي من تلك الأجزاء. يمكن أن تكون الأنماط المعطاة كائنات من النوع Regexp، وفي هذه الحالة سيتم الاحتفاظ بخياراتها، أو يمكن أن تكون سلاسل نصية. إذا لم يتم إعطاء أية أنماط، فسيعيد التابع union القيمة /(?!)/. السلوك سيكون غير محدد إذا احتوى أيُّ من الأنماط المعطاة على التقاط (capture). ملاحظة: ستحاول روبي تحويل المعاملات المُمررة للتابع union إلى تعبيرات نمطية حرفية ( regular expression literal) عبر التابع ...
العنصر
يُحدِّد العنصر <link> العلاقات بين المستند الحالي وبين مورد خارجي (external resource)؛ من استخدامات هذا الوسم تتضمن تعريف علاقة بين الصفحات للتنقل بينها، بيد أنَّ أكثر استخدامات هذا العنصر شيوعًا هو تضمين صفحات الأنماط. استخدام الشكل الآتي للعنصر <link> لتضمين صفحة أنماط في المستند: <link href="style.css" rel="stylesheet">
بطاقة العنصر تصنيفات المحتوى البيانات الوصفية المحتوى المسموح لا يوجد، فهذا العنصر فارغ. الوسم المختصر لمّا كان هذا العنصر فارغًا، فيجب توفير وسم البداية وحذف وسم النهاية. العناصر الأب أي عنصر يقبل وجود ...
حذف المعاملات (Remove Parameter)
المشكلة لا يُستخدم معاملٌ ما في متن التابع. الحل إزالة المعامل غير المستخدم. مثال قبل إعادة التصميم تعريف المعامل Date في بداية التابع ()getContact وعدم استخدامه. تعريف المعامل Date في بداية التابع ()getContact وعدم استخدامه. بعد إعادة التصميم إزالة المعامل Date من التابع ()getContact لعدم استخدامه: إزالة المعامل Date من التابع ()getContact. لم إعادة التصميم؟ يفرض كل معامل موجود في استدعاء التوابع على المبرمج أن يقرأه لمعرفة ما هي المعلومات الموجودة في هذا المعامل. وإذا كان المعامل غير مستخدم على ...
تحويل التوابع إلى معاملات (Parameterize Method)
المشكلة تؤدي توابع متعددة أعمالًا مماثلة تختلف فقط من حيث قيمها الداخلية أو أرقامها أو عملياتها. الحل تجميع هذه التوابع باستخدام معامل يُمرر القيمة الخاصة الضرورية. مثال قبل إعادة التصميم يؤدي التابعان ()fivePercentRaise و ()tenPercentRaise الغرض ذاته باختلاف النسبة المئوية المراد زيادتها للموظف Employee: يؤدي التابعان أعمالًا مماثلة تختلف فقط من حيث قيمها الداخلية أو أرقامها أو عملياتها. بعد إعادة التصميم تجميع التابعان السابقان في تابع واحد يدعى ()raise مع تمرير النسبة المئوية المتغيرة إليه: يجمع التابعين باستخدام معامل يُمرر ...
تبديل المرجع إلى قيمة (Change Reference to Value)
المشكلة وجود كائن مرجع صغير جدًا نادرًا ما يتغيَّر لتبرير إدارة دورة حياته. الحل تحويله إلى كائن قيمة (value object). مثال قبل إعادة التصميم مخطط يوضح كيفية ارتباط الصنفين Currency و Customer: مخطط يوضح كيفية ارتباط الصنفين Currency و Customer. بعد إعادة التصميم إعادة تصميم المخطط السابق للتتحول العلاقة الرابطة للصنفين Currency و Customer إلى علاقة has a (أي بمجرد وجود كائن Customer فلا بد من وجود كائن Currency له). مخطط يوضح كيفية ارتباط الصنفين Currency و Customer بعلاقة has ...
تكرار البيانات المرُاقَبة (Duplicate Observed Data)
المشكلة هل بيانات النطاق المخزَّنة في أصناف هي المسؤولة عن واجهة المستخدم الرسومية (GUI)؟ إذًا، إليك الحل. الحل فصل البيانات في أصناف منفصلة لضمان الاتصال والتزامن بين صنف النطاق وواجهة المستخدم الرسومية (GUI). مثال قبل إعادة التصميم إليك المخطط التالي لبيانات نطاق مخزَّنة في أصناف والمسؤولة عن الواجهة الرسومية: بيانات النطاق مخزَّنة في أصناف. بعد إعادة التصميم يصبح المخطط السابق بالشكل التالي بعد إعادة التصميم: فصل البيانات في أصناف منفصلة لضمان الاتصال والتزامن بين صنف النطاق وواجهة المستخدم الرسومية. لم ...
هدم التسلسل الهرمي (Collapse Hierarchy)
المشكلة في التسلسل الهرمي لصنف، يكون صنفٌ فرعي هو عمليًا نفس صنفه الأب. الحل دمج الصنف الفرعي والصنف الأب. مثال قبل إعادة التصميم الصنف الفرعي Salesman هو عمليًّا نفس الصنف Employee له: الصنفٌ الفرعي هو عمليًا نفس صنفه الأب. بعد إعادة التصميم دمج الصنف الفرعي Salesman في الصنف الأب: دمج الصنف الفرعي والصنف الأب. لم إعادة التصميم؟ قد يؤدي نمو البرنامج مع مرور الوقت إلى أن يصبح كلٌ من الصنف الفرعي والصنف الأب تقريبًا نفس الشيء. فتُزال ميزة من الصنف ...
إعادة تسمية التوابع (Rename Method)
المشكلة لا يعبِّر اسم التابع عن ما يقوم به. الحل إعادة تسمية التابع. مثال قبل إعادة التصميم لا يفسر اسم التابع ()getsnm في الصنف Customer ما يقوم به. لا يفسر اسم التابع ما يقوم به. بعد إعادة التصميم إعادة تسمية التابع ()getsnm إلى ()getSecondName الذي يصف ما يقوم به. يفسر اسم التابع ما يقوم به. لم إعادة التصميم؟ ربما كانت تسمية تابعٍ ما سيئة من البداية - على سبيل المثال، أنشأ شخصٌ ما التابع في عجلة ولم يهتم كفاية بتسميته ...
ازالة توابع الإعدادات (Remove Setting Method)
المشكلة يكون تعيين قيمة الحقل فقط عند إنشائه، ولا تتغير في أي وقت لاحق. الحل إزالة التوابع التي تضبط قيمة الحقل. مثال قبل إعادة التصميم يضبط التابع ()setImmutableValue قيمةً غير قابلة للتغيير أو التعديل في المستقبل: يغيّر التابع من قيمة الحقل. بعد إعادة التصميم حذف التابع ()setImmutableValue من الصنف Customer: إزالة التابع الذي يضبط قيمة الحقل. لم إعادة التصميم؟ إذا كنت تريد منع أي تغييرات في قيمة الحقل. آلية الحل يجب أن تكون قيمة الحقل قابلة للتغيير فقط في الباني. ...
الوسيط (Middle Man)
توصيف المشكلة عندما يكون للصنف (class) مهمةٌ واحدةٌ فقط وهي تفويض المهام (delegation) لصنفٍ آخر، فما أهمية وجوده بالأصل؟ أسبابها قد تنتج المشكلة عن التخلُّص المفرط من الاستدعاءات المتسلسلة كعلاجٍ لمشكلة سلاسل الرسائل (message chains). أو قد تنتُج عن النقل التدريجيّ للصنف (class) إلى أصناف أخرى ليبقى الصنف الأصليّ فارغًا إلا من أوامر التفويض (delegation). وما الحل؟ حذف الوسيط (remove middle man) إن كانت معظم أصناف التابع (method's classes) تفوِّض المهام (delegate) إلى صنفٍ آخر. إليك المزيد ستحصل بحلِّ المشكلة ...
إضافة المعاملات (Add Parameter)
المشكلة لا يملك التابع بيانات كافية لتنفيذ بعض الإجراءات. الحل إنشاء معامل جديد لتمرير البيانات الضرورية. مثال قبل إعادة التصميم لا يملك التابع ()getContact في الصنف Customer لجدولة موعدٍ للتواصل مع الزبون: لا يملك التابع بيانات كافية لتنفيذ بعض الإجراءات. بعد إعادة التصميم أصبح بالإمكان تمرير تاريخ إلى التابع ()getContact لتصبح بيانات جدولة تاريخ مناسب مع الزبون مكتملة: إنشاء معامل جديد لتمرير البيانات الضرورية. لم إعادة التصميم؟ تحتاج إلى إجراء بعض تغييرات على أحد التوابع، وتتطلب هذه التغييرات إضافة معلومات ...
الحفاظ على الكائن كاملًا (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: ...
الوحدة File::Constants في روبي
توفر الوحدة File::Constants ثوابت متعلقة بالملفات في روبي. جميع ثوابت الملفات المحتملة موثَّقة هنا ولكن ليس بالضرورة أن تكون كلها متاحة على منصتك. إن كانت المنصة الأساسية لا تعرِّف ثابتًا ما، فلن يُعرَّف ثابت روبي المقابل له. قد تجد بعض المعلومات المفيدة في توثيقات المنصة التي تعمل عليها (مثل الدليل man للدالة open(2)). الثوابت APPEND الإضافة عند كل عملية كتابة. BINARY تعطيل تحويل الشيفرة السطري. CREAT إنشاء ملف إن لم يكن موجودًا. DIRECT محاولة تصغير ثأتيرات الذاكرة المخبَّأة (cache) للدخل ...
نقل الحقول (Move Fields)
المشكلة استخدام الحقل (field) في صنفٍ (class) ما أكثر من استخدامه في صنفه الأساسيّ. الحل إنشاء حقلٍ في صنفٍ جديدٍ وإعادة توجيه (redirect) كلَّ ما يستخدم هذا الحقل إلى ذلك الصنف المُنشَأ. مثال قبل إعادة التصميم يستخدِم الصنفُ Class2 الحقلَ aField أكثر مما يستخدمه صنفه الأساسيّ Class1: يستخدِم الصنفُ Class2 الحقلَ aField أكثر مما يستخدمه صنفه الأساسيّ Class1. بعد إعادة التصميم نُقِل الحقل aField إلى الصنف ذي الاستخدام الأكثر له وهو الصنف Class2: نُقِل الحقل aField إلى الصنف ذي الاستخدام ...
العنصر
يحتوي العنصر <style> معلومات عن تنسيق المستند أو جزءٍ منه، إذ تحتوى داخل هذا العنصر معلومات التنسيق التي من المتوقع أن تكون بلغة CSS. مثال بسيط عن العنصر <style> مع بعض تعليمات التنسيق داخله: <style>
body {
color: red;
}
</style>
بطاقة العنصر تصنيفات المحتوى البيانات الوصفية المحتوى المسموح محتوى نصي يُطابِق قيمة الخاصية type، ألا وهي text/css. الوسم المختصر لا يمكن حذف أيّ من وسمَي البداية أو النهاية العناصر الأب أي عنصر يقبل البيانات الوصفية. واجهة DOM HTMLStyleElement دعم المتصفحات Chrome ...
المخاليط (Mixins) في Sass
تتيحُ المخاليط تعريف الأنماط التي يمكن إعادة استخدامها في ملف الأنماط دون اللجوء إلى الأصناف غير الدلاليَّة مثلِ .float-left. يمكن أن تحوي المخاليط أيضًا جميع قواعد CSS وأيَّ شيء آخر يُسمح باستعماله في ملفات Sass. يمكن أيضًا أن يُمرَّر لها وسائط (arguments) وبذلك يمكن إنتاج مجموعة واسعة من الأنماط بعدد قليل من المخاليط. تعريف المخلوط (Defining a Mixin): @mixin تعرَّف المخاليط (Mixins) بوساطة التعليمة @mixin متبوعةً باسم المخلوط، ويمكن اختياريًا إضافة وسائط له، ثمّ كتلة من الأنماط تتضمّن محتويات المخلوط. ...
تجزئة الشَرطيات (Decompose Conditional)
المشكلة يوجد شَرط مُعقد (if-then/else أو switch). الحل فصل الأجزاء المعقدة من الشَرط إلى توابع منفصلة: الشرط، then و else. مثال قبل إعادة التصميم وجود شرط معقد ناتج عن دمج شرطين باستعمال المعامل || الثنائي في البنية if: في لغة Java: if (date.before(SUMMER_START) || date.after(SUMMER_END)) {
charge = quantity * winterRate + winterServiceCharge;
}
else {
charge = quantity * summerRate;
}
في لغة C#: if (date < SUMMER_START || date > SUMMER_END)
{
charge = quantity * winterRate + winterServiceCharge;
}
else ...
تعريف كائن المُعامل (Introduce Parameter Object)
المشكلة تحتوي التوابع على نفس المجموعة المتكررة من المعاملات. الحل استبدال هذه المعاملات بكائنٍ واحد. مثال قبل إعادة التصميم تمرير نفس مجموعة المعاملات إلى توابع الصنف Customer: تحتوي التوابع على نفس المجموعة المتكررة من المعاملات. بعد إعادة التصميم تبديل كائن واحد بتلك المعاملات وتمريره إلى توابع الصنف Customer التي تشترك بنفس مجموعة المعاملات: استبدال هذه المعاملات بكائنٍ واحد. لم إعادة التصميم؟ غالبًا ما تُصادَف مجموعات متطابقة من المعاملات داخل العديد من التوابع. الأمر الذي يؤدي إلى تكرار الشيفرة البرمجية للمعاملات ...
سحب التابع لأعلى (Pull Up Method)
المشكلة تحتوي الأصناف الفرعية على توابع تؤدي نفس العمل. الحل جعل التوابع متطابقة ثم نقلها إلى الصنف الأعلى ذي الصلة. مثال قبل إعادة التصميم يحتوي الصنفان الفرعيان Soldier و Tank على التابع ()getHealth الذي يؤدي نفس العمل: تحتوي الأصناف الفرعية على التابع ()getHealth تؤدي نفس العمل. بعد إعادة التصميم نقل التابع ()getHealth إلى الصنف Unit الأب وإزالته من الأصناف الفرعية: نقل التابع ()getHealth إلى الصنف الأعلى. لم إعادة التصميم؟ تنمو الأصناف الفرعية وتتطور بشكل مستقل عن بعضها البعض، مما يتسبب ...
استخراج التوابع (Extract Methods)
المشكلة وجود أجزاء من الشيفرة يُمكن عزلها وتجميعها سويةً. الحل نقل الشيفرة إلى تابعٍ (method) أو دالةٍ (function) جديدة والاستعاضة عن الجزء (بمكانه السابق) باستدعاءٍ لهذا التابع الجديد. مثال قبل إعادة التصميم نلاحظ وجود جزء من الشيفرة لطباعة بعض البيانات (التفاصيل)، والتي يمكن عزلها بتابعٍ جديد، الشيفرة قبل إعادة التصميم بالشكل: في لغة Java: void printOwing() {
printBanner();
// طباعة التفاصيل
System.out.println("name: " + name);
System.out.println("amount: " + getOutstanding());
}
في لغة #C: void PrintOwing()
{
PrintBanner();
...
تبديل قيم البيانات إلى كائنات (Replace Data Values with Objects)
المشكلة وجود حقلٍ (field) مٌخصَّص للبيانات في صنفٍ (class) ما (أو في عددٍ من الأصناف)، ولهذا الحقل بياناته وسلوكه (behaviour) المرتبط به. الحل إنشاء صنفٍ جديدٍ ليُوضَع فيه الحقل (field) بالإضافة إلى سلوكه المرتبط به، وتخزين كائنٍ (object) من هذا الصنف الجديد في الصنف الأصليّ للحقل. مثال قبل إعادة التصميم يحتوي الصنف Order على الحقل customer الذي يحتوي بيانات نصيّة (من النوع String) كما هو واضح في مخطط الأصناف الآتي: الصنف Order يحتوي على الحقل customer الذي يحتوي بيانات نصيّة. ...
دفع الحقل لأسفل (Push Down Field)
المشكلة هل يستخدم الحقل في بعض الأصناف الفرعية فقط؟ الحل نقل الحقل إلى هذه الأصناف الفرعية. مثال قبل إعادة التصميم يُستخدَم الحقل fuel الموجود في الصنف Unit الأب في صنف فرعي واحد فقط الذي هو Tank: يستخدم الحقل في بعض الأصناف الفرعية فقط. بعد إعادة التصميم نقل الحقل من الصنف الأب إلى الصنف الفرعي المستخدم فيه: نقل الحقل إلى هذه الأصناف الفرعية. لم إعادة التصميم؟ على الرغم من أنه كان من المقرر استخدام حقل بشكل عام لجميع الأصناف، في الواقع ...
HTML/Topics/Document Metadata
تحتوي البيانات الوصفية على معلومات عن الصفحة، التي تتضمن المعلومات حول الأنماط (styles) والسكربتات، والبيانات المُساعدة للبرمجيات (مثل محركات البحث والمتصفحات ...إلخ.) التي تستخدم الصفحة أو تعرضها. العنصر الوصف <base> تحديد أساس روابط URL لجميع الروابط النسبية (relative URLs) الموجودة في المستند. لا يجوز استخدام أكثر من عنصر <base> في المستند. <head> توفير معلوماتٍ عامةً عن المستند (أي بيانات وصفية)، بما في ذلك عنوان المستند وروابط إلى السكربتات الموجودة فيها وصفحات الأنماط. <link> تحديد العلاقات بين المستند الحالي وبين مورد خارجي (external resource)؛ ...
إزالة الإسناد إلى المعاملات (Remove Assignments to Parameters)
المشكلة إسناد قيمةٍ ما إلى أحد المعاملات (parameter) داخل التابع (method body). الحل استخدام متغيِّرٍ محليٍّ (local variable) بدلًا من المعامل. مثال قبل إعادة التصميم نلاحظ وجود عمليّة إسنادٍ (من بعد الإنقاص بمقدار 2) إلى معامل التابع الوارد باسم inputVal: في لغة Java: int discount(int inputVal, int quantity) {
if (inputVal > 50) {
inputVal -= 2;
}
//...
}
في لغة #C: int Discount(int inputVal, int quantity)
{
if (inputVal > 50)
...
القيمة المحددة
القيمة المُحدَّدة (specified value) لإحدى خاصيات CSS هي القيمة المضبوطة لتلك الخاصية، سواءً من صفحة الأنماط مباشرةً، أو من العنصر الأب، وتُعرَّف القيمة المُحدَّدة بطريقة من الطرائق الآتية: إذا كان لصفحة الأنماط المرتبطة بالمستند قيمةٌ للخاصية، فهذه هي القيمة المستخدمة، فمثلًا لو ضُبِطَت الخاصية color إلى green، فسيكون لون نص العنصر المُحدَّد هو اللون الأخضر. إذا لم تُحدِّد صفحة الأنماط المرتبطة بالمستند قيمة للخاصية، فسترثها من العنصر الأب إن كان ذلك ممكنًا، فمثلًا إذا كانت لدينا فقرة <p> داخل العنصر ...
التسلط على الكائنات الأخرى (Feature Envy)
توصيف المشكلة استخدام بعضُ التوابع (methods) بياناتِ الكائنات (objects) الأخرى أكثر ممّا تستخدم بياناتِها ذاتَها. أسبابها تحدث هذه المشكلة عقب نقل الحقول (fields) إلى أصناف البيانات (data class)، إذ من الأفضل نقلُ التوابع المستخدِمة لتلك الحقول لذلك الصنف أيضًا. وما الحل؟ لنضع بالحسبان القاعدة الآتية: يجب أن تبقى الأجزاء التي تتغيَّر بآنٍ واحدٍ في المكان ذاته معًاولتحقيق ذلك: نقلُ التوابع (move methods) إلى المكان الأنسب في الشيفرة. عندما يستخدِم جزءٌ فقط من التابع بياناتِ كائنٍ (object) آخر، فالأفضل استخراجُ تابعٍ ...
سحب الحقل لأعلى (Pull Up Field)
المشكلة يحتوي صنفان على نفس الحقل. الحل إزالة الحقل من الأصناف الفرعية ونقله إلى الصنف الأعلى. مثال قبل إعادة التصميم يحتوي الصنفان Tank و Soldier المتفرعان من الصنف Unit على الحقل المشترك health: يحتوي الصنفان Soldier و Tank على نفس الحقل health. بعد إعادة التصميم إزالة الحقل health من الأصناف الفرعية (الصنف Soldier والصنف Tank) ونقله إلى الصنف Unit الأب: إزالة الحقل health من الأصناف الفرعية ونُقل إلى الصنف الأب. لم إعادة التصميم؟ تنمو الأصناف الفرعية وتتطور بشكل منفصل، مما ...
Document.styleSheets
تُعيد الخاصيّة document.styleSheets القابلة للقراءة فقط قائمةً من النّوع StyleSheetList التي تُعدّ عناصرُها كائناتٍ من النّوع CSSStyleSheet، وهذه الكائنات تُمثّل صفحات الأنماط المربوطة صراحةً أو المُضمّنة في المُستند. البنية العامة var styleSheetList = document.styleSheets;
القيمة المُعادة قائمةٌ من النّوع StyleSheetList عناصِرها كائناتٌ من النّوع CSSStyleSheet. مثال function getStyleSheet(unique_title) {
for(var i=0; i<document.styleSheets.length; i++) {
var sheet = document.styleSheets[i];
if(sheet.title == unique_title) {
return sheet;
}
...
توحيد التعبير الشرطي (Consolidate Conditional Expression)
المشكلة وجود عدة شروط تؤدي إلى نفس النتيجة أو الإجراء. الحل توحيد جميع هذه الشروط في تعبير وحيد. مثال قبل إعادة التصميم وجود عدة شروط يتم التحقق منها في الشيفرة: في لغة Java: double disabilityAmount() {
if (seniority < 2) {
return 0;
}
if (monthsDisabled > 12) {
return 0;
}
if (isPartTime) {
return 0;
}
// حساب مقدار العجز
//...
}
في ...
نقل التابع (Move Method)
المشكلة استخدام التابع (method) في صنفٍ (class) ما أكثر من استخدامه في صنفه الأساسيّ. الحل إنشاء تابعٍ جديدٍ في الصنف الأكثر استخدامًا لذلك التابع ونقل شيفرته إلى التابع الجديد، ثم تحويل الشيفرة في التابع الأصليّ إلى مرجعيّةٍ للتابع الجديد في الصنف الآخر أو حذفه كليَّا. مثال قبل إعادة التصميم يستخدِم الصنفُ Class2 التابعَ aMethod() أكثر مما يستخدمه صنفه الأساسيّ Class1: يستخدِم الصنفُ Class2 التابعَ aMethod() أكثر مما يستخدمه صنفه الأساسيّ Class1. بعد إعادة التصميم نُقِل التابع aMethod() إلى الصنف ذي ...
دمج المتغير المؤقت (Inline Temp)
المشكلة وجود متغيِّرٍ مؤقَّت (temporary) لحفظ قيمة تعبيرٍ (expression) بسيطٍ ولا شيء آخر سواه. الحل تبديل كلُّ مرجعيّةٍ (reference) للمتغيِّر ليحلَّ محلَّها التعبيرُ نفسه. مثال قبل إعادة التصميم نلاحظ في الشيفرة الآتية وجود متغيِّرٍ مؤقتٍ باسم basePrice لتخزين القيمة الناتجة عن تعبير استدعاء التابع order.basePrice()، والذي سيُستخدَم في التعليمة التالية لتعريفه: في لغة Java: boolean hasDiscount(Order order) {
double basePrice = order.basePrice();
return basePrice > 1000;
}
في لغة #C: bool HasDiscount(Order order)
{
double basePrice = order.BasePrice();
return ...
فصل الاستعلامات عن المُعدِّلات (Separate Query from Modifier)
المشكلة هل لديك تابعٌ يُعيد قيمةً ما ولكن يغيِّر أيضا شيئًا ما داخل الكائن؟ الحل تقسيم التابع إلى تابعَين منفصلَين. كما يمكن أن نتوقع، يجب على أحدهما أن يعيد القيمة ويُغيِّر الآخر الكائن. مثال قبل إعادة التصميم ينفذ التابع ()getTotlaOutstandingAndSetReadyForSummaries في الصنف Customer مهمتين، إذ يعيد قيمة ويضبط قيمة أخرى في الكائن: تابع يُعيد قيمة ويغيِّر شيئًا ما داخل الكائن. بعد إعادة التصميم فصل التابع التابع ()getTotlaOutstandingAndSetReadyForSummaries إلى تابعين هما: الأول ()getTotlaOutstanding لجلب قيمة، والآخر ()setReadyForSummaries لضبط حالةٍ في الكائن: ...