الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

سؤال في الستراتيجيات

بدأه ihsan_ahmed في 14 نوفمبر 2008 · 2 رد · 666 مشاهدة · في منتدى تطوير المواقع بـ PHP
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

لو فرضنا انه عندي ملف على سيرفري , طيب لو فرضنا انا برمجت كود يفحص متصفح اليوزر اللي رايد يحمل هذا الملف لكي اعلم نظام تشغيله ووفقا لذلك اعطيه لنك التحميل فاذا مثلا احتوى المتغير

$_SERVER["HTTP_USER_AGENT"]

على كلمة WIN

فهذا يعني ان نظام التشغيل هو وندوز فاعطيه رابط الملف بامتداد zip

وخلاف ذلك اعطيه رابط الملف بامتداد .tar.gz

في هذا المثال لدينا ستراجيتان الاولى لملف الوندوز والثانية لملف اللنكس

طيب الان فقط القوا نظرة على الكود التالي لتنفيذ المثال :

abstract class FileNamingStrategy {
abstract function createLinkName($filename);
}
class ZipFileNamingStrategy extends FileNamingStrategy {
function createLinkName($filename)
{
return "http://downloads.foo.bar/$filename.zip";
}
}
class TarGzFileNamingStrategy extends FileNamingStrategy {
function createLinkName($filename)
{
return "http://downloads.foo.bar/$filename.tar.gz";
}
}
if (strstr($_SERVER["HTTP_USER_AGENT"], "Win")) {
$fileNamingObj = new ZipFileNamingStrategy();
} else {
$fileNamingObj = new TarGzFileNamingStrategy();
}
$calc_filename = $fileNamingObj->createLinkName("Calc101");
$stat_filename = $fileNamingObj->createLinkName("Stat2000");
print <<<EOF
<h1>The following is a list of great downloads<</h1>
<br>
<a href="$calc_filename">A great calculator</a><br>
<a href="$stat_filename">The best statistics application</a><br>
<br>
EOF;

الكود السابق سوف ينفذ ويحقق ما ارغبه في مثالي السابق ولكن سؤالي هو ما فائدة الفئة FileNamingStrategy

لماذا لا نلغيها فحسب ونستدعي كل فئة بصورة مستقلة

فيصبح الكود كالتالي :

class ZipFileNamingStrategy  {
function createLinkName($filename)
{
return "http://downloads.foo.bar/$filename.zip";
}
}
class TarGzFileNamingStrategy  {
function createLinkName($filename)
{
return "http://downloads.foo.bar/$filename.tar.gz";
}
}
if (strstr($_SERVER["HTTP_USER_AGENT"], "Win")) {
$fileNamingObj = new ZipFileNamingStrategy();
} else {
$fileNamingObj = new TarGzFileNamingStrategy();
}
$calc_filename = $fileNamingObj->createLinkName("Calc101");
$stat_filename = $fileNamingObj->createLinkName("Stat2000");
print <<<EOF
<h1>The following is a list of great downloads<</h1>
<br>
<a href="$calc_filename">A great calculator</a><br>
<a href="$stat_filename">The best statistics application</a><br>
<br>
EOF;
#2

لو لاحظت في تعريف الفئة FileNamingStrategy لوجدت انها فئة مجردة abstract كما هو مكتوب قبلها , والتجريد اذا صح التعبير عبارة عن فكرة أو اسلوب شائع جدا في البرمجة الكائنية OOP والهدف منه أن يكون هناك فئة عامة تحتوي على خصائص وطرق معينه بحيث ان فئة اخرى تشتق منها أو ترثها تقوم بتعريف هذه الطرق بما يناسبها ... وهذه الفئات لايستفاد منها مباشرة بل لابد من وراثتها بواسطة فئات اخرى واعادة تعريف الطرق التي فيها , لوعدنا لمثالك السابق ستجد ان هناك طريقة او method اسمها createLinkName وتم استخدامها بنفس الاسم في الفئات المشتقة من الفئة الاساسية ... وستلاحظ أيضا انه في الفئة الرئيسية تم تعريف مسمى الدالة فقط بدون كتابة محتوياتها بينما في الفئات المشتقة منها تم كتابة المحتويات

ولكن لنعود لسؤالك :

اقتباس
الكود السابق سوف ينفذ ويحقق ما ارغبه في مثالي السابق ولكن سؤالي هو ما فائدة الفئة FileNamingStrategy

لماذا لا نلغيها فحسب ونستدعي كل فئة بصورة مستقلة

المشكلة فعلا ان هذا المثال البسيط لا يوضح فائدة OOP بشكل واضح وفي الحقيقة يمكنك الغاء حتى الفئات الاخرى ويمكنك اختصار البرنامج اكثر من ذلك بكثير ولكن العملية ومافيها ان هذا البرنامج كتب ليكون جاهزا لاعادة الاستخدام والتوسع فيما بعد وهذه اهم اهداف البرمجة الكائنية OOP ..

أرجو ان تكون الصورة قد اتضحت الان ...

مواضيع مشابهة