https://wiki.hsoub.com/index.php?title=Refactoring/techniques&feed=atom&action=history
Refactoring/techniques - تاريخ المراجعة
2024-03-29T12:47:07Z
تاريخ التعديل لهذه الصفحة في الويكي
MediaWiki 1.35.0
https://wiki.hsoub.com/index.php?title=Refactoring/techniques&diff=27999&oldid=prev
جميل-بيلوني في 20:20، 27 فبراير 2019
2019-02-27T20:20:08Z
<p></p>
<table class="diff diff-contentalign-right diff-editfont-monospace" data-mw="interface">
<col class="diff-marker" />
<col class="diff-content" />
<col class="diff-marker" />
<col class="diff-content" />
<tr class="diff-title" lang="ar">
<td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">→ مراجعة أقدم</td>
<td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">مراجعة 20:20، 27 فبراير 2019</td>
</tr><tr><td colspan="2" class="diff-lineno" id="mw-diff-left-l1" >سطر 1:</td>
<td colspan="2" class="diff-lineno">سطر 1:</td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"><noinclude>{{DISPLAYTITLE:تقنيات إعادة التصميم (Refactoring Techniques)}}</noinclude></ins></div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>== [[Refactoring/techniques/composing methods|إنشاء التوابع]] ==</div></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>== [[Refactoring/techniques/composing methods|إنشاء التوابع]] ==</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>تستهدف إعادة التصميم بشكل رئيسيٍّ إنشاء التوابع الصحيحة المناسبة، إذ تكون التوابع الطويلة سببًا للمشاكل في كثيرٍ من الحالات، وتجعل شيفرات بعض التوابع منطق التنفيذ (execution logic) غامضًا ويصبح التابع بهذا عصيَّ الفهم من جهةٍ وصعب التغييرٍ من جهة ثانية.</div></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>تستهدف إعادة التصميم بشكل رئيسيٍّ إنشاء التوابع الصحيحة المناسبة، إذ تكون التوابع الطويلة سببًا للمشاكل في كثيرٍ من الحالات، وتجعل شيفرات بعض التوابع منطق التنفيذ (execution logic) غامضًا ويصبح التابع بهذا عصيَّ الفهم من جهةٍ وصعب التغييرٍ من جهة ثانية.</div></td></tr>
<tr><td colspan="2" class="diff-lineno" id="mw-diff-left-l43" >سطر 43:</td>
<td colspan="2" class="diff-lineno">سطر 44:</td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>== [[Refactoring/techniques/simplifying conditional expressions|تبسيط التعابير الشرطية]] ==</div></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>== [[Refactoring/techniques/simplifying conditional expressions|تبسيط التعابير الشرطية]] ==</div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;">تزداد البنية المنطقية للشروط تعقيدًا مع مرور الوقت، لذا هنالك الكثير من التقنيات لمواجهة هذا التعقيد وتبسيطه وهي:</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"># [[Refactoring/decompose conditional|تجزئة الشَرطيات (Decompose Conditional)]]: وهو وجود شَرط مُعقد (<code>if-then</code>/<code>else</code> أو <code>switch</code>).</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"># [[Refactoring/consolidate conditional expression|توحيد التعبير الشرطي (Consolidate Conditional Expression)]]: ويتمثَّل بوجود عدة شروط تؤدي إلى نفس النتيجة أو الإجراء.</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"># [[Refactoring/consolidate duplicate conditional fragments|توحيد الأجزاء الشرطية المكررة (Consolidate Duplicate Conditional Fragments)]]: وهو وجود شيفرة برمجية متطابقة في جميع فروع الشَرطيات.</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"></ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"># [[Refactoring/remove control flag|إزالة رايات التحكم (Remove Control Flag)]]: لديك متغيرات منطقية تعمل كرايات تحكم لتعبيرات منطقية متعددة.</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"># [[Refactoring/replace nested conditional with guard clauses|تبديل الشرطيات المتداخلة بعبارات الحماية (Replace Nested Conditional with Guard Clauses]]: وهو وجود مجموعة متداخلة من الشروط وصعوبة تحديد التدفق الطبيعي لتنفيذ الشيفرة البرمجية.</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"># [[Refactoring/replace conditional with polymorphism|تبديل الشرطيات بالتعدديّة الشكليّة (Replace Conditional with Polymorphism)]]: مثل وجود شروط تنفِّذ إجراءات مختلفة اعتمادًا على نوع الكائن أو خصائصه.</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"># [[Refactoring/introduce null object|تقديم الكائن الفارغ (Introduce Null Object)]]: إذ تؤدي إعادة بعض التوابع للقيمة <code>null</code> بدلًا من الكائنات الحقيقية إلى امتلاء الشيفرة البرمجية بالعديد من نقاط التحقق من القيمة <code>null</code>.</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"># [[Refactoring/introduce assertion|تقديم التوكيد (Introduce Assertion)]]: فلكي يعمل جزء من الشيفرة البرمجية بشكل صحيح، يجب أن تتحقق بعض الشروط أو تكون القيم صحيحة.</ins></div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>== [[Refactoring/techniques/simplifying method calls|تبسيط استدعاءات التوابع]] ==</div></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>== [[Refactoring/techniques/simplifying method calls|تبسيط استدعاءات التوابع]] ==</div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;">تجعل التقنيات التي سيشار إليها في هذا القسم استدعاءات التوابع أبسط وأسهل للفهم والاستيعاب. سيؤدي ذلك بدوره إلى تبسيط الواجهات للتفاعل بين الأصناف. هذه التقنيات هي:</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"># [[Refactoring/rename method|إعادة تسمية التوابع (Rename Method)]]: إذ لا يعبِّر اسم التابع عن ما يقوم به.</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"># [[Refactoring/add parameter|إضافة المعاملات (Add Parameter)]]: لأن التابع لا يملك بيانات كافية لتنفيذ بعض الإجراءات.</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"># [[Refactoring/remove parameter|حذف المعاملات (Remove Parameter)]]: لعدم استخدامها في متن التابع.</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"># [[Refactoring/separate query from modifier|فصل الاستعلامات عن المُعدِّلات (Separate Query from Modifier)]]: لأنه لديك تابعٌ يُعيد قيمةً ما ولكن يغيِّر أيضا شيئًا ما داخل الكائن.</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"># [[Refactoring/parameterize method|تحويل التوابع إلى معاملات (Parameterize Method)]]: تؤدي توابع متعددة أعمالًا مماثلة تختلف فقط من حيث قيمها الداخلية أو أرقامها أو عملياتها.</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"># [[Refactoring/replace parameter with explicit methods|استبدال المعامل بتوابع صريحة (Replace Parameter with Explicit Methods)]]: إذ ينقسم التابع إلى أجزاء، كل منها يتم تشغيله اعتمادًا على قيمة المعامل.</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"># [[Refactoring/preserve whole object|الحفاظ على الكائن كاملًا (Preserve Whole Object)]]: وهو جلب عدة قيم من أحد الكائنات، ثم تمريرها كمعاملات إلى أحد التوابع.</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"># [[Refactoring/replace parameter with method call|تبديل المعاملات باستدعاءات التوابع (Replace Parameter with Method Call)]]: وهو استدعاء تابع استعلام وتمرير نتائجه كمعاملات لتابع آخر، في حين أنه يمكن لهذا التابع استدعاء الاستعلام مباشرة.</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"># [[Refactoring/introduce parameter object|تعريف كائن المُعامل (Introduce Parameter Object)]]: إذ تحتوي التوابع على نفس المجموعة المتكررة من المعاملات.</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"># [[Refactoring/remove setting method|ازالة توابع الإعدادات (Remove Setting Method)]]: فيكون تعيين قيمة الحقل فقط عند إنشائه، ولا تتغير في أي وقت لاحق.</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"># [[Refactoring/hide method|إخفاء التابع (Hide Method)]]: فلا يُستخدم التابع من قِبل الأصناف الأخرى أو يستخدم فقط داخل التسلسل الهرمي للصنف الخاص به.</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"># [[Refactoring/replace constructor with factory method|استبدال المُنشئ بتابع التصميم (Replace Constructor with Factory Method)]]: لديك مُنشئ (constructor) معقد يقوم بما هو أكثر من مجرد وضع قيم المعامل في حقول الكائن.</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"># [[Refactoring/replace error code with exception|استبدال شيفرات الأخطاء باستثناءات (Replace Error Code with Exception)]]: إذ يعيد التابع قيمة خاصة تشير إلى خطأ.</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"># [[Refactoring/replace exception with test|استبدال الاستثناءات بالاختبارات (Replace Exception with Test)]]: إطلاق استثناء يمكن لاختبار بسيط أن يحل محله.</ins></div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>== [[Refactoring/techniques/dealing with generalization|التعامل مع التعميم]] ==</div></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>== [[Refactoring/techniques/dealing with generalization|التعامل مع التعميم]] ==</div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;">يملك التجريد (Abstraction) تقنيات إعادة التصميم الخاصة به والمرتبطة بشكل أساسي بوظيفة النقل على طول التسلسل الهرمي لوراثة الصنف (class inheritance hierarchy)، وبإنشاء أصناف وواجهات جديدة، وبتبديل التفويض مكان الوراثة أو العكس. تقنيات هذا القسم هي:</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"># [[Refactoring/extract subclass|استخراج الأصناف الفرعية (Extract Subclass)]]: إذ يكون للصنف ميزات تستعمل فقط في حالات معينة.</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"># [[Refactoring/extract superclass|استخراج الأصناف الفائقة (Extract Superclass)]]: والذي يتمثَّل بوجود صنفين لهما حقول وتوابع مشتركة.</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"># [[Refactoring/extract interface|استخرج الواجهات (Extract Interface)]]: إذ يستخدم العديد من العملاء نفس الجزء من واجهة الصنف. حالة أخرى: عندما يوجد نفس الجزء من الواجهة في صنفين.</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"># [[Refactoring/collapse hierarchy|هدم التسلسل الهرمي (Collapse Hierarchy)]]: ففي التسلسل الهرمي لصنف، يكون صنفٌ فرعي هو عمليًا نفس صنفه الأب.</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"># [[Refactoring/form template method|تكوين قالب تابع (Form Template Method)]]: تُنفِّذ الأصناف الفرعية خوارزميات تحتوي على خطوات مماثلة في نفس الترتيب.</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"># [[Refactoring/replace inheritance with delegation|استبدال التوريث بالتفويض (Replace Inheritance with Delegation)]]: ويتمثَّل باستخدام صنف فرعي جزءًا فقط من توابع صنفه الأب (أو من غير الممكن وراثة بيانات الصنف الأب).</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"># [[Refactoring/replace delegation with inheritance|استبدال التفويض بالتوريث (Replace Delegation with Inheritance)]]: إذ يحتوي الصنف على العديد من التوابع البسيطة التي تفوِّض إلى كل التوابع في صنفٍ آخر.</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"># [[Refactoring/pull up field|سحب الحقل لأعلى (Pull Up Field)]]: مثل أن يحتوي صنفان على نفس الحقل.</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"># [[Refactoring/pull up method|سحب التابع لأعلى (Pull Up Method)]]: وهو أن تحتوي الأصناف الفرعية على توابع تؤدي نفس العمل.</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"># [[Refactoring/pull up constructor body|سحب متن المُنشِئ لأعلى (Pull Up Constructor Body)]]: مثل احتواء الأصناف الفرعية على مُنشِئات لها شيفرة متطابقة في أغلبها.</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"># [[Refactoring/push down method|دفع التابع لأسفل (Push Down Method)]]: هل السلوك المُنفَّذ في الصنف الأب مُستخدمٌ في صنف فرعي واحد فقط (أو أكثر)؟ إذًا إليك الحل.</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"># [[Refactoring/push down field|دفع الحقل لأسفل (Push Down Field)]]: هل يستخدم الحقل في بعض الأصناف الفرعية فقط؟ إذًا إليك الحل.</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"></ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;">== مصادر ==</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;">* [https://refactoring.guru/refactoring/techniques صفحة توثيق تقنيات إعادة التصميم في موقع refactoring.guru].</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;">[[تصنيف:Refactoring]]</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;">[[تصنيف:Refactoring Techniques]]</ins></div></td></tr>
</table>
جميل-بيلوني
https://wiki.hsoub.com/index.php?title=Refactoring/techniques&diff=27989&oldid=prev
جميل-بيلوني: إنشاء الصفحة وإضافة قسم من المحتوى
2019-02-27T17:16:46Z
<p>إنشاء الصفحة وإضافة قسم من المحتوى</p>
<p><b>صفحة جديدة</b></p><div>== [[Refactoring/techniques/composing methods|إنشاء التوابع]] ==<br />
تستهدف إعادة التصميم بشكل رئيسيٍّ إنشاء التوابع الصحيحة المناسبة، إذ تكون التوابع الطويلة سببًا للمشاكل في كثيرٍ من الحالات، وتجعل شيفرات بعض التوابع منطق التنفيذ (execution logic) غامضًا ويصبح التابع بهذا عصيَّ الفهم من جهةٍ وصعب التغييرٍ من جهة ثانية.<br />
<br />
يشمل هذا القسم من الحلول كلَّ ما يتعلق بالتوابع وإزالة التكرار (duplicates) في الشيفرة ليسمح بإجراء التطويرات المستقبليّة، وهذه التقنيات هي:<br />
# [[Refactoring/extract method|استخراج التوابع (Extract Methods)]]: والتي تتمثل بوجود أجزاء من الشيفرة يُمكن عزلها وتجميعها سويةً.<br />
# [[Refactoring/inline method|دمج التوابع (Inline Methods)]]: مثل أن يكون محتوى التابع (method body) بسيطًا وواضحًا أكثر من التابع بحدِّ ذاته، ويمكن عندئذٍ الاستغناء عنه.<br />
# [[Refactoring/extract variable|استخراج المتغيِّرات (Extract Variables)]]: مثل وجود تعبيرٍ (expression) معقِّد يصعُب فهمه.<br />
# [[Refactoring/inline temp|دمج المتغيِّر المؤقّت (Inline Temp)]]: والذي يتمثَّل بوجود متغيِّرٍ مؤقَّت (temporary) لحفظ قيمة تعبيرٍ (expression) بسيطٍ ولا شيء آخر سواه.<br />
# [[Refactoring/replace temp with query|تبديل المتغير الوسيط إلى استدعاء (Replace Temp with Query)]]: عبر تخزين نتيجة تعبيرٍ ما (expression) في متغيِّر محليٍّ (local variable) لاستخدامه لاحقًا في الشيفرة.<br />
# [[Refactoring/split temporary variable|تجزئة المتغيِّر المؤقَّت (Split Temporary Variable)]]: مثل وجود متغيِّرٍ محليّ يُستخدَم لتخزين عدّة قيمٍ مؤقتةٍ (مرحليّة) داخل التابع.<br />
# [[Refactoring/remove assignments to parameters|إزالة الإسناد إلى المعاملات (Remove Assignments to Parameters)]]: عبر إسناد قيمةٍ ما إلى أحد المعاملات (parameter) داخل التابع (method body).<br />
# [[Refactoring/replace method with method object|تبديل التوابع إلى كائنات التوابع (Replace Method with Method Object)]]: والذي يتمثَّل بوجود تابعٍ طويلٍ بالكثير من المتغيِّرات المحليّة (local variables) المتداخلة والتي تحول دون تطبيق تقنية الحل باستخراج التابع (extract method).<br />
# [[Refactoring/substitute algorithm|استبدال الخوارزمية (Substitute Algorithm)]]: عندما يكون هنالك حاجة إلى استبدال خوارزميّة ما بخوارزميّة أخرى.<br />
<br />
== [[Refactoring/techniques/moving features between objects|نقل الميزات ما بين الكائنات]] ==<br />
تساعد عملية إعادة التصميم في توزيع المهام بشكل مثاليّ على الأصناف المختلفة في الشيفرة، وتضمن تقنيات الحل هذه طريقةً آمنةً لنقل المهام ما بين الأصناف، وإنشاء أصناف جديدة وحماية تفاصيل عملية التنفيذ من الوصول العام، وهذه التقنيات تشمل:<br />
# [[Refactoring/move method|نقل التابع (Move Method)]]: إذ يستخدم تابع في صنفٍ ما أكثر من استخدامه في صنفه الأساسيّ.<br />
# [[Refactoring/move field|نقل الحقول (Move Fields)]]: إذ يستخدم حقل في صنفٍ ما أكثر من استخدامه في صنفه الأساسيّ.<br />
# [[Refactoring/extract class|استخراج الصنف (Extract Class)]]: مثل وجود صنفٍ واحدٍ يقوم بمهامٍ عديدةٍ يمكن توزيعها على صنفين.<br />
# [[Refactoring/inline class|دمج الصنف (Inline Class)]]: مثل وجود صنفٍ لا يقوم بأيّ مهمّة فعليّة ولا يُخطَّط لإضافة مهامٍ إليه لاحقًا.<br />
# [[Refactoring/hide delegate|إخفاء التفويض (Hide Delegate)]]: كأن يصل العميل إلى كائنٍ ما وليكن الكائن B من أحد حقول أو توابع كائنٍ آخر وليكن A، ومن ثمّ يستدعي تابعًا لهذا الكائن B.<br />
# [[Refactoring/remove middle man|الاستغناء عن الوسيط (Remove Middle Man)]]: والذي يتمثَّل باحتواء الصنف على العديد من التوابع التي تنقل سياق البرنامج إلى كائنات أخرى.<br />
# [[Refactoring/introduce foreign method|تعريف التوابع الدخيلة (Introduce Foreign Methods)]]: مثل الحاجة إلى تابعٍ غير موجودٍ في الصنف المساعد ومن غير الممكن إضافته إلى ذلك الصنف.<br />
# [[Refactoring/introduce local extension|تعريف الإضافات المحلية (Introduce Local Extensions)]]: مثل الحاجة إلى بعض التوابع (methods) غير الموجودة في الصنف المساعد (utility class)، ومن غير الممكن إضافتها إلى ذلك الصنف.<br />
<br />
== [[Refactoring/techniques/organizing data|تنظيم البيانات]] ==<br />
تساعد تقنيات إعادة التصميم هذه بالتعامل مع البيانات، وتبديل أصناف ذات وظائف كثيرة مكان الأنواع الأساسية (primitives). نتيجة أخرى مهمة نحصل عليها بتطبيق هذه التقنيات هي فك ارتباطات صنف مما يجعل الصنف قابلًا للنقل وإعادة الاستعمال. وهذه التقنيات هي:<br />
# [[Refactoring/self encapsulate field|التغليف الداخلي للحقول (Self Encapsulate Fields)]]: وهو الوصول المباشر إلى الحقول الخاصّة داخل الصنف.<br />
# [[Refactoring/replace data value with object|تبديل قيم البيانات إلى كائنات (Replace Data Values with Objects)]]: مثل وجود حقلٍ مٌخصَّص للبيانات في صنفٍ ما (أو في عددٍ من الأصناف)، ولهذا الحقل بياناته وسلوكه المرتبط به.<br />
# [[Refactoring/change value to reference|تبديل القيمة إلى مرجع (Change Value to Reference)]]: مثل وجود العديد من النُسَخ المتماثلة من صنفٍ واحدٍ تحتاج إلى استبدال كائنٍ واحدٍ بها.<br />
# [[Refactoring/change reference to value|تبديل المرجع إلى قيمة (Change Reference to Value)]]: مثل وجود كائن مرجع صغير جدًا نادرًا ما يتغيَّر لتبرير إدارة دورة حياته.<br />
# [[Refactoring/replace array with object|تبديل المصفوفات بكائنات (Replace Array with Object)]]: إذ يكون لديك مصفوفة تحتوي على أنواع مختلفة من البيانات.<br />
# [[Refactoring/duplicate observed data|تكرار البيانات المرُاقَبة (Duplicate Observed Data)]]: هل بيانات النطاق المخزَّنة في أصناف هي المسؤولة عن واجهة المستخدم الرسومية (GUI)؟ إذًا، إليك الحل.<br />
# [[Refactoring/change unidirectional association to bidirectional|تغيير الاقتران أحادي الاتجاه إلى ثنائي الاتجاه (Change Unidirectional Association to Bidirectional)]]: وهو وجود صنفان يحتاج كل منهما إلى استخدام ميزات الآخر، ولكن الاقتران بينهما أحادي الاتجاه فقط.<br />
# [[Refactoring/change bidirectional association to unidirectional|تغيير الاقتران ثنائي الاتجاه إلى أحادي الاتجاه (Change Bidirectional Association to Unidirectional)]]: وهو وجود اقتران ثنائي الاتجاه (bidirectional association) بين الأصناف، ولكن لا يستخدم أحد الأصناف الميزات الأخرى.<br />
# [[Refactoring/replace magic number with symbolic constant|تبديل الأعداد السحرية بثوابت رمزية (Replace Magic Number with Symbolic Constant)]]: إذ تستخدم الشيفرة البرمجية عددًا له معنىً معين له.<br />
# [[Refactoring/encapsulate field|تغليف الحقول (Encapsulate Field)]]: فينشأ لديك حقل عام.<br />
# [[Refactoring/encapsulate collection|تغليف المجموعات (Encapsulate Collection)]]: ويتمثَّل باحتواء صنف على حقل مجموعة وجالب (getter) وضابط (setter) بسيط للعمل مع المجموعة.<br />
# [[Refactoring/replace type code with class|تبديل رموز الأنواع بالأصناف (Replace Type Code with Class)]]: إذ يحتوي الصنف على حقل يحتوي على رموز الأنواع. ولا تُستخدم قيم هذا النوع في شروط المُشغِّل ولا تؤثر على سلوك البرنامج.<br />
# [[Refactoring/replace type code with subclasses|تبديل رموز الأنواع بالأصناف الفرعية (Replace Type Code with Subclasses)]]: إذ يؤثر النوع المُرمَّز على سلوك البرنامج (تُطلِق قيم هذا الحقل رموز مختلفة في الشرطيات).<br />
# [[Refactoring/replace type code with state strategy|تبديل رموز الأنواع بالحالة/الاستراتيجية (Replace Type Code with State/Strategy)]]: ويتمثَّل بتأثير نوع مُرمَّز على سلوك البرنامج ولكن لا يمكن استخدام الأصناف الفرعية للتخلص منه.<br />
# [[Refactoring/replace subclass with fields|استبدال الأصناف الفرعية بالحقول (Replace Subclass with Fields)]]: لديك أصناف فرعية تختلف فقط في توابع (إعادة الثوابت) الخاصة بها.<br />
<br />
== [[Refactoring/techniques/simplifying conditional expressions|تبسيط التعابير الشرطية]] ==<br />
<br />
== [[Refactoring/techniques/simplifying method calls|تبسيط استدعاءات التوابع]] ==<br />
<br />
== [[Refactoring/techniques/dealing with generalization|التعامل مع التعميم]] ==</div>
جميل-بيلوني