مبدأ الوظيفة الواحدة في البرمجة

السلام عليكم

هذه مقالة أخرى من سلسلة المباديء الصحيحة للبرمجة والتي تقع تحت دائرة هندسة البرمجيات. وتتكلم عن مبدأ الوظيفة أو المسؤولية الواحدة لوحدة الكود single responsibility principle.

الفكرة ببساطة هي أن يكون للوحدة من الكود هدف واحد من كتابتها، مثلاً أن تكون وحدة متخصصة في قراءة البيانات من قاعدة البيانات العلائقية، مثلاً نسميها access unit وأخرى متخصصة في واجهة المستخدم فنسميها presentation unit او class أو حتى Layer حسب التقسيم المتبع وحجم الوحدة المتخصصة. بهذا نكون قد جعلنا لكل وحدة سبباً واحداً للتغيير، مثلاً إذا كانت المهمة تغيير في واجهة المستخدم لايؤثر ذلك على طريقة قراءة المعلومات من قاعدة البيانات، وهذا يجعل الكود أسهل تعديلاً.

نأخذ مثال لإجراء به أكثر من وظيفة ثم نقوم بتصحيحه. والمثال مكتوب بلغة برمجة إفتراضية وليست من اللغات المعروفة، مهمته قراءة بيانات من جدول في قاعدة بيانات ثم عرضها في المتصفح:

function ReadAndDisplayTable
{
  connection = Connection("localhost", "MyData", "user", "password")

  dataset = connection.query("select * from students")

  html.print("<table><tr><th>ID</th><th>Name</th></tr>")
  for record in dataset
  {
    html.print("<tr>")
    html.print("<td>", record["id"], "</td>")

    html.print("<td>", record["name"], "</td>")
    html.print("</tr></table>")
  }
  connection.close

}

نلاحظ أن اﻹجراء به قراءة من قاعدة البيانات ثم إظهارها للمتصفح، فإذا أردنا تغيير شكل المخرجات في المتغيير فإننا نقوم بتغيير هذا اﻹجراء ، وإذا أردنا تغيير مخدم قاعدة البيانات فنقوم بتغيير نفس اﻹجراء، بهذا كان هُناك سببان مختلفان للتغيير، تغيير بسبب واجهة مستخدم وآخر بسبب إعدادات قاعدة بيانات، وكلاهما موضوعان مختلفان لا يمكن جمعهما في إجراء واحد، والتغيير ربما يحدث عنه خطأ غير مقصود في الجزء الآخر الذي لا يعنينا من الكود.

التصحيح هو أن نقوم بفصلهما  في إجرائين منفصلين، واﻷفضل أن تكون وحدات مختلفة، مثلاً كل واحد في مكتبة منفصلة أو class منفصلة تجمع نوع متشابه من الوظائف:

function ReadTable: Dataset
{
  connection = Connection("localhost", "MyData", "user", "password")

  dataset = connection.query("select * from students")
  connection.close
  retrn dataset
}

function displayTable(dataset: Dataset)
{

  html.print("<table><tr><th>ID</th><th>Name</th></tr>")

  for record in dataset
  {
    html.print("<tr>")
    html.print("<td>",record["id"],"</td>")
    html.print("<td>",record["name"],"</td>")
    html.print("</tr></table>")
  }
}

بهذه الطريقة يكون لدينا إجراء لقراءة البيانات فقط (readTable) وآخر لكتابته (displayTable) ونحقق أيضاً إعادة استخدام الكود، حيث يمكن استخدام اﻹجراء readTable في أي مكان آخر ليس له علاقة بإظهار البيانات في المتصفح، مثلاً لقرائتها ثم إرسالها بالبريد، كذلك يمكن نداء إجراء الكتابة في المتصفح بعد قراءة البيانات من ملف في القرص الصلب مثلاً.

هذه الطريقة تضمن كتابة كود واضح القراءة، سهل التعديل والصيانة، ومتعدد الإستخدام.

إضافة:
مبدأ الوظيفة الواحدة يُساهم في تسهيل اﻹختبار، حيث يمكن اختبار هذه الوحدة البرمجية بمعزل عن باقي الوحدات

Advertisements

اترك رد

إملأ الحقول أدناه بالمعلومات المناسبة أو إضغط على إحدى الأيقونات لتسجيل الدخول:

WordPress.com Logo

أنت تعلق بإستخدام حساب WordPress.com. تسجيل خروج   / تغيير )

صورة تويتر

أنت تعلق بإستخدام حساب Twitter. تسجيل خروج   / تغيير )

Facebook photo

أنت تعلق بإستخدام حساب Facebook. تسجيل خروج   / تغيير )

Google+ photo

أنت تعلق بإستخدام حساب Google+. تسجيل خروج   / تغيير )

Connecting to %s