الفرق بين المراجعتين لصفحة: «Refactoring/replace array with object»
Khaled-yassin (نقاش | مساهمات) طلا ملخص تعديل |
جميل-بيلوني (نقاش | مساهمات) |
||
(3 مراجعات متوسطة بواسطة مستخدمين اثنين آخرين غير معروضة) | |||
سطر 3: | سطر 3: | ||
== المشكلة == | == المشكلة == | ||
لديك مصفوفة تحتوي على أنواع مختلفة من البيانات.<syntaxhighlight lang="php"> | لديك مصفوفة تحتوي على أنواع مختلفة من البيانات. | ||
== الحل == | |||
استبدال المصفوفة بكائن يكون له حقول منفصلة لكل عنصر. | |||
===مثال=== | |||
====قبل إعادة التصميم==== | |||
احتواء المصفوفة <code>row</code> على نوعين مختلفين من البيانات (سلسلة نصية وعدد): | |||
في لغة Java:<syntaxhighlight lang="java"> | |||
String[] row = new String[2]; | |||
row[0] = "Liverpool"; | |||
row[1] = "15"; | |||
</syntaxhighlight>في لغة C#:<syntaxhighlight lang="c#"> | |||
string[] row = new string[2]; | |||
row[0] = "Liverpool"; | |||
row[1] = "15"; | |||
</syntaxhighlight>في لغة PHP:<syntaxhighlight lang="php"> | |||
$row = array(); | $row = array(); | ||
$row[0] = "Liverpool"; | $row[0] = "Liverpool"; | ||
$row[1] = 15; | $row[1] = 15; | ||
</syntaxhighlight>في لغة Python:<syntaxhighlight lang="python"> | |||
row = [None * 2] | |||
row[0] = "Liverpool" | |||
row[1] = "15" | |||
</syntaxhighlight>في لغة TypeScript:<syntaxhighlight lang="typescript"> | |||
let row = new Array(2); | |||
row[0] = "Liverpool"; | |||
row[1] = "15"; | |||
</syntaxhighlight> | </syntaxhighlight> | ||
== | ==== بعد إعادة التصميم==== | ||
استعمال كائن مكان المصفوفة السابقة وضبط قيمة الحقل <code>name</code> والحقل <code>wins</code> فيه إلى القيم المحددة: | |||
في لغة Java:<syntaxhighlight lang="java"> | |||
Performance row = new Performance(); | |||
row.setName("Liverpool"); | |||
row.setWins("15"); | |||
</syntaxhighlight>في لغة C#:<syntaxhighlight lang="c#"> | |||
Performance row = new Performance(); | |||
row.SetName("Liverpool"); | |||
row.SetWins("15"); | |||
</syntaxhighlight>في لغة PHP:<syntaxhighlight lang="php"> | |||
$row = new Performance(); | $row = new Performance(); | ||
$row->setName("Liverpool"); | $row->setName("Liverpool"); | ||
$row->setWins(15); | $row->setWins(15); | ||
</syntaxhighlight>في لغة Python:<syntaxhighlight lang="python"> | |||
row = Performance(); | |||
row.setName("Liverpool") | |||
row.setWins("15") | |||
</syntaxhighlight>في لغة TypeScript:<syntaxhighlight lang="typescript"> | |||
let row = new Performance(); | |||
row.setName("Liverpool"); | |||
row.setWins("15"); | |||
</syntaxhighlight> | </syntaxhighlight> | ||
== لم إعادة التصميم؟ == | == لم إعادة التصميم؟ == | ||
تُعد المصفوفات أداة ممتازة لتخزين البيانات والمجموعات من نوع واحد. ولكن إذا كنت تستخدم المصفوفة مثل صناديق مكتب البريد، وتخزن اسم المستخدم في الصندوق رقم 1 وعنوان المستخدم في الصندوق رقم 14، | تُعد المصفوفات أداة ممتازة لتخزين البيانات والمجموعات من نوع واحد. ولكن إذا كنت تستخدم المصفوفة مثل صناديق مكتب البريد، وتخزن اسم المستخدم في الصندوق رقم 1 وعنوان المستخدم في الصندوق رقم 14، فستندم يومًا ما على فعلتك هذه. سيؤدي هذا النهج إلى إخفاقات كارثية عندما يضع أحدُهم شيئًا في "الصندوق" الخطأ كما سيستهلك أيضا الوقت لمعرفة البيانات المخزنة في كل صندوق. | ||
== فوائد تطبيق الحل == | == فوائد تطبيق الحل == | ||
سطر 25: | سطر 68: | ||
== آلية الحل == | == آلية الحل == | ||
# إنشاء صنف جديد يحتوي على البيانات الموجودة في المصفوفة. وضع المصفوفة نفسها في الصنف كحقل عام. | # إنشاء صنف جديد يحتوي على البيانات الموجودة في المصفوفة. وضع المصفوفة نفسها في الصنف كحقل عام. | ||
# إنشاء حقل لتخزين الكائن من هذا الصنف في الصنف الأصلي. لا | # إنشاء حقل لتخزين الكائن من هذا الصنف في الصنف الأصلي. لا تنسَ إنشاء الكائن نفسه أيضًا في المكان الذي بدأت فيه مصفوفة البيانات. | ||
# في الصنف الجديد، أنشئ توابع الوصول واحدًا تلو الآخر لكل من عناصر المصفوفة. أعطهم أسماء توضيحية تبين ما يفعلونه. في نفس الوقت، استبدل كل استخدام لعنصر مصفوفة في الشيفرة الرئيسية مع تابع الوصول المقابل. | # في الصنف الجديد، أنشئ توابع الوصول واحدًا تلو الآخر لكل من عناصر المصفوفة. أعطهم أسماء توضيحية تبين ما يفعلونه. في نفس الوقت، استبدل كل استخدام لعنصر مصفوفة في الشيفرة الرئيسية مع تابع الوصول المقابل. | ||
# عند إنشاء توابع الوصول لكافة العناصر، اجعل المصفوفة خاصة. | # عند إنشاء توابع الوصول لكافة العناصر، اجعل المصفوفة خاصة. | ||
# لكل عنصر من المصفوفة، أنشئ | # لكل عنصر من المصفوفة، أنشئ حقلًا خاصًّا في الصنف ثم غَيِّر توابع الوصول بحيث تستخدم هذا الحقل بدلًا من المصفوفة. | ||
# احذف المصفوفة عند نقل كافة البيانات. | # احذف المصفوفة عند نقل كافة البيانات. | ||
المراجعة الحالية بتاريخ 09:54، 2 مارس 2019
تقنية إعادة التصميم هذه هي حالة خاصة من تبديل قيم البيانات إلى كائنات.
المشكلة
لديك مصفوفة تحتوي على أنواع مختلفة من البيانات.
الحل
استبدال المصفوفة بكائن يكون له حقول منفصلة لكل عنصر.
مثال
قبل إعادة التصميم
احتواء المصفوفة row
على نوعين مختلفين من البيانات (سلسلة نصية وعدد):
في لغة Java:
String[] row = new String[2];
row[0] = "Liverpool";
row[1] = "15";
في لغة C#:
string[] row = new string[2];
row[0] = "Liverpool";
row[1] = "15";
في لغة PHP:
$row = array();
$row[0] = "Liverpool";
$row[1] = 15;
في لغة Python:
row = [None * 2]
row[0] = "Liverpool"
row[1] = "15"
في لغة TypeScript:
let row = new Array(2);
row[0] = "Liverpool";
row[1] = "15";
بعد إعادة التصميم
استعمال كائن مكان المصفوفة السابقة وضبط قيمة الحقل name
والحقل wins
فيه إلى القيم المحددة:
في لغة Java:
Performance row = new Performance();
row.setName("Liverpool");
row.setWins("15");
في لغة C#:
Performance row = new Performance();
row.SetName("Liverpool");
row.SetWins("15");
في لغة PHP:
$row = new Performance();
$row->setName("Liverpool");
$row->setWins(15);
في لغة Python:
row = Performance();
row.setName("Liverpool")
row.setWins("15")
في لغة TypeScript:
let row = new Performance();
row.setName("Liverpool");
row.setWins("15");
لم إعادة التصميم؟
تُعد المصفوفات أداة ممتازة لتخزين البيانات والمجموعات من نوع واحد. ولكن إذا كنت تستخدم المصفوفة مثل صناديق مكتب البريد، وتخزن اسم المستخدم في الصندوق رقم 1 وعنوان المستخدم في الصندوق رقم 14، فستندم يومًا ما على فعلتك هذه. سيؤدي هذا النهج إلى إخفاقات كارثية عندما يضع أحدُهم شيئًا في "الصندوق" الخطأ كما سيستهلك أيضا الوقت لمعرفة البيانات المخزنة في كل صندوق.
فوائد تطبيق الحل
- في الصنف الناتج، يمكن وضع كافة السلوكيات المقترنة التي سبق تخزينها في الصنف الرئيسي أو في أي مكان آخر.
- توثيق حقول صنف ما أسهل بكثير من توثيق عناصر مصفوفة.
آلية الحل
- إنشاء صنف جديد يحتوي على البيانات الموجودة في المصفوفة. وضع المصفوفة نفسها في الصنف كحقل عام.
- إنشاء حقل لتخزين الكائن من هذا الصنف في الصنف الأصلي. لا تنسَ إنشاء الكائن نفسه أيضًا في المكان الذي بدأت فيه مصفوفة البيانات.
- في الصنف الجديد، أنشئ توابع الوصول واحدًا تلو الآخر لكل من عناصر المصفوفة. أعطهم أسماء توضيحية تبين ما يفعلونه. في نفس الوقت، استبدل كل استخدام لعنصر مصفوفة في الشيفرة الرئيسية مع تابع الوصول المقابل.
- عند إنشاء توابع الوصول لكافة العناصر، اجعل المصفوفة خاصة.
- لكل عنصر من المصفوفة، أنشئ حقلًا خاصًّا في الصنف ثم غَيِّر توابع الوصول بحيث تستخدم هذا الحقل بدلًا من المصفوفة.
- احذف المصفوفة عند نقل كافة البيانات.