الفرق بين المراجعتين لصفحة: «Refactoring/replace magic number with symbolic constant»
Khaled-yassin (نقاش | مساهمات) أنشأ الصفحة ب'<noinclude>{{DISPLAYTITLE: تبديل الأرقام السحرية بثوابت رمزية (Replace Magic Number with Symbolic Constant)}}</noinclude> == المشكلة...' |
جميل-بيلوني (نقاش | مساهمات) تدقيق. |
||
سطر 19: | سطر 19: | ||
الرقم السحري هو القيمة الرقمية التي تتصادف في المصدر ولكن ليس لها معنىً واضح. ويجعل هذا "النمط المضاد" فهم البرنامج وإعادة تصميم الشيفرة البرمجية أمرًا صعبًا. | الرقم السحري هو القيمة الرقمية التي تتصادف في المصدر ولكن ليس لها معنىً واضح. ويجعل هذا "النمط المضاد" فهم البرنامج وإعادة تصميم الشيفرة البرمجية أمرًا صعبًا. | ||
ومع | ومع ذلك، تنشأ المزيد من الصعوبات عندما تحتاج إلى تغيير هذا الرقم السحري. ولن يعمل البحث والاستبدال مع هذا الأمر؛ قد يُستخدَم نفس الرقم لأغراض مختلفة في أماكن مختلفة، مما يعني أنه سيتعين عليك التحقق من كل سطر من الشيفرة البرمجية التي تستخدم هذا الرقم. | ||
== فوائد تطبيق الحل == | == فوائد تطبيق الحل == | ||
سطر 27: | سطر 27: | ||
== من الجيد أن نعرف == | == من الجيد أن نعرف == | ||
ليس كل | ليس كل الأعداد سحرية. إذا كان الغرض من العدد واضحًا، فلا حاجة إلى استبداله. والمثال الكلاسيكي هو:<syntaxhighlight lang="java"> | ||
for (i = 0; i < сount; i++) { ... } | for (i = 0; i < сount; i++) { ... } | ||
سطر 35: | سطر 33: | ||
== البدائل == | == البدائل == | ||
# في بعض | # في بعض الأحيان، يمكن استبدال الرقم السحري باستدعاءات التابع. على سبيل المثال، إذا كان لديك رقم سحري يدل على عدد العناصر في مجموعة، فإنك لن تحتاج إلى استخدامه للتحقق من العنصر الأخير من المجموعة. وبدلًا من ذلك، يُستخدم التابع القياسي للحصول على طول المجموعة. | ||
# تُستخدم | # تُستخدم الأعداد السحرية أحيانُا كرموز للأنواع. لنفترض أنَّ لديك نوعين من المستخدمين وأنك تستخدم حقل عددي في صنف لتحديد كِلاهما: فيكون العدد <code>1</code> للمسؤولين والعدد <code>2</code> للمستخدمين العاديين. في هذه الحالة، يجب استخدام أحد توابع إعادة التصميم لتجنب رموز الأنواع: '''-''' [[Refactoring/replace type code with class|تبديل رموز الأنواع بالأصناف]]. '''-''' [[Refactoring/replace type code with subclasses|تبديل رموز الأنواع بالأصناف الفرعية]]. '''-''' [[Refactoring/replace type code with state strategy|تبديل رموز الأنواع بالحالة/الاستراتيجية]]. | ||
في هذه الحالة، يجب استخدام أحد توابع | == آلية الحل == | ||
# عرِّف ثابتًا وعيّن له قيمة العدد السحري. | |||
# ابحث عن كل إِشارة للعدد السحري. | |||
# لكل من الأعداد التي تجدها، تحقق مرتين من أن العدد السحري في هذه الحالة بالذات يتوافق مع الغرض من الثابت. إذا كان الجواب نعم، استبدل العدد بالثابت. هذه خطوة مهمة بما أن العدد نفسه قد يعني أشياء مختلفة تمامًا (ويستبدل مع ثوابت مختلفة بحسب الحالة). | |||
== انظر أيضًا == | |||
* [[Refactoring/replace type code with class|تبديل رموز الأنواع بالأصناف]]. | * [[Refactoring/replace type code with class|تبديل رموز الأنواع بالأصناف]]. | ||
* [[Refactoring/replace type code with subclasses|تبديل رموز الأنواع بالأصناف الفرعية]]. | * [[Refactoring/replace type code with subclasses|تبديل رموز الأنواع بالأصناف الفرعية]]. | ||
* [[Refactoring/replace type code with state strategy|تبديل رموز الأنواع بالحالة/الاستراتيجية]]. | * [[Refactoring/replace type code with state strategy|تبديل رموز الأنواع بالحالة/الاستراتيجية]]. | ||
== مصادر == | == مصادر == | ||
* [https://refactoring.guru/replace-magic-number-with-symbolic-constant صفحة توثيق تبديل | * [https://refactoring.guru/replace-magic-number-with-symbolic-constant صفحة توثيق تبديل الأعداد السحرية بثوابت رمزية في موقع refactoring.guru]. [[تصنيف:Refactoring]] [[تصنيف:Refactoring Techniques]] [[تصنيف:Refactoring Organizing Data]] | ||
[[تصنيف:Refactoring]] | |||
[[تصنيف:Refactoring Techniques]] | |||
[[تصنيف:Refactoring Organizing Data]] |
مراجعة 06:49، 21 نوفمبر 2018
المشكلة
تستخدم الشيفرة البرمجية رقمًا له معنىً معين له.
function potentialEnergy($mass, $height) {
return $mass * $height * 9.81;
}
الحل
استبدال هذا الرقم بثابت له اسم يمكن قراءته ويشرح معنى الرقم.
define("GRAVITATIONAL_CONSTANT", 9.81);
function potentialEnergy($mass, $height) {
return $mass * $height * GRAVITATIONAL_CONSTANT;
}
لم إعادة التصميم؟
الرقم السحري هو القيمة الرقمية التي تتصادف في المصدر ولكن ليس لها معنىً واضح. ويجعل هذا "النمط المضاد" فهم البرنامج وإعادة تصميم الشيفرة البرمجية أمرًا صعبًا.
ومع ذلك، تنشأ المزيد من الصعوبات عندما تحتاج إلى تغيير هذا الرقم السحري. ولن يعمل البحث والاستبدال مع هذا الأمر؛ قد يُستخدَم نفس الرقم لأغراض مختلفة في أماكن مختلفة، مما يعني أنه سيتعين عليك التحقق من كل سطر من الشيفرة البرمجية التي تستخدم هذا الرقم.
فوائد تطبيق الحل
- يمكن أن يخدم الثابت الرمزي كتوثيق حي لمعنى قيمته.
- من الأسهل بكثير تغيير قيمة ثابتٍ ما عن البحث عن هذا الرقم في مصدر الشيفرة البرمجية بأكمله، دون خطر تغيير نفس الرقم المستخدم في مكان آخر لغرض مختلف بطريق الخطأ.
- تقليل الاستخدام المُكرَر لرقم أو سلسلة نصية في الشيفرة البرمجية. وهو مهم بشكل خاص عندما تكون القيمة معقدة وطويلة (مثل 3.14159 أو 0xCAFEBABE).
من الجيد أن نعرف
ليس كل الأعداد سحرية. إذا كان الغرض من العدد واضحًا، فلا حاجة إلى استبداله. والمثال الكلاسيكي هو:
for (i = 0; i < сount; i++) { ... }
البدائل
- في بعض الأحيان، يمكن استبدال الرقم السحري باستدعاءات التابع. على سبيل المثال، إذا كان لديك رقم سحري يدل على عدد العناصر في مجموعة، فإنك لن تحتاج إلى استخدامه للتحقق من العنصر الأخير من المجموعة. وبدلًا من ذلك، يُستخدم التابع القياسي للحصول على طول المجموعة.
- تُستخدم الأعداد السحرية أحيانُا كرموز للأنواع. لنفترض أنَّ لديك نوعين من المستخدمين وأنك تستخدم حقل عددي في صنف لتحديد كِلاهما: فيكون العدد
1
للمسؤولين والعدد2
للمستخدمين العاديين. في هذه الحالة، يجب استخدام أحد توابع إعادة التصميم لتجنب رموز الأنواع: - تبديل رموز الأنواع بالأصناف. - تبديل رموز الأنواع بالأصناف الفرعية. - تبديل رموز الأنواع بالحالة/الاستراتيجية.
آلية الحل
- عرِّف ثابتًا وعيّن له قيمة العدد السحري.
- ابحث عن كل إِشارة للعدد السحري.
- لكل من الأعداد التي تجدها، تحقق مرتين من أن العدد السحري في هذه الحالة بالذات يتوافق مع الغرض من الثابت. إذا كان الجواب نعم، استبدل العدد بالثابت. هذه خطوة مهمة بما أن العدد نفسه قد يعني أشياء مختلفة تمامًا (ويستبدل مع ثوابت مختلفة بحسب الحالة).
انظر أيضًا
- تبديل رموز الأنواع بالأصناف.
- تبديل رموز الأنواع بالأصناف الفرعية.
- تبديل رموز الأنواع بالحالة/الاستراتيجية.