بسم الله الرحمن الرحيم
قبل ذي بدء ,أرجو من الله أن تكون هذه السلسلة مفيدة للجميع
وكل عام وأنتم بخير بمناسبة حلول العام الهجري الجديد وفي هذا الأمر أرغب في أن أعظ نفسي وإياكم
ببعض النصائح التالية
- ينبغي أن نعيد حساباتنا في ما مضي من العمر لأن الأيام والسنون تمضي وتمر علينا ولا نعلم متي يأتينا أجل الله
- المبادرة بالتوبة
- الحرص علي الأخذ بالعلم النافع وعدم الإهمال والكسل والله المعين .
_______________________________________________________________________________________
كما أرجو أن تردوني في حالة وجود أي خطأ بمحتوي هذه السلسلة
وما هي مقترحاتكم في طريقة سرد الأنماط حتي أستفيد منها عند إعدادي للأنماط القادمة .
قبل الدخول في شرح هذا النمط أرجوا متابعة المقال التالي
مقدمه المكاتب التنفيذيه Business Objects
الحلقة الخامسة : DataAccess Pattern أو نمط طبقة التعامل مع البيانات
يتميز هذا النمط بالقيام بعمل طبقة منفصلة Data Access Layer -- DAL تقوم بعزل البرنامج عن مصدر البيانات Data Source
وتكون وظيفة هذه الطبقة هي
- الإتصال المباشر مع مصدر البيانات ( مثلا قاعدة بيانات ما أو ملف نصي عادي plain text أو ملف بنسق xml إلخ ).
- جلب البيانات من مصدر البيانات .
- التعامل مع البيانات المخزنة بمصدر البيانات من حذف وتعديل وإضافة و بحث إلخ .
ولكن ما فائدة هذا النمط
- بناء طبقة منفصلة عن المشروع الذي يتم تطويره تكون مسئولة عن التعامل مع مصدر البيانات
وبالطبع يمكننا إستخدام تلك الطبقة في تطوير مشاريع برمجية أخري , لأن هذه الطبقة ليس لها دور أساسي لمشروع ما بعينه
ولكنها تكون بمثابة الوسيط بين المشروع و مصدر البيانات , وبذلك تكون وسيلة جيدة لدمجها للعمل بمشاريع أخري scaleability
بالإضافة لفائدتها في تيسير عمل صيانة للمشروع maintenance في النقاط المسئولة عن التعامل مع مصدر البيانات.
- تخيل معي أخي الكريم أمر أخر ,أنك قمت بتصميم موقع ما وقمت ببنائه مستخدما مصدر للبيانات من نوع مزود الخدمة mysql لقواعد البيانات
وبعد الإنتهاء من المشروع , لسبب أو لأخر تم تغير نوع مزود الخدمة لقاعدة البيانات إلي Oracle أو Postegre أو SQLServer إلخ
ما الحل إذن لو لم نراعي هذا الأمر , بالطبع سوف نلجأ للمرور بكل صفحة تم برمجتها وإعادة تمكينها للتعامل مع مصدر البيانات الجديد وهذا بالطبع أمر غير صحيح عند تطوير المشاريع.
- بالإضافة إلي أنه سوف تتضح فائدة هذا النمط عندما نشرح نمط MVC Pattern وتكامله مع نمط DataAccess Pattern وهو أهم نمط سوف يتم شرحه بإذن الله
مثال تطبيقي بسيط
نريد تصميم صفحة باسم Products تقوم بعرض محتوي جدول ال Products التالي
الموجود بقاعدة البيانات test
# # Table structure for table `products` # CREATE TABLE products ( PRODUCTID int(11) NOT NULL auto_increment, PRODUCTNAME varchar(255) NOT NULL default '', UNITPRICE varchar(255) NOT NULL default '', UNITSINSTOCK varchar(255) NOT NULL default '', DISCONTINUED varchar(255) NOT NULL default '', PRIMARY KEY (PRODUCTID) ) TYPE=MyISAM; # # Dumping data for table `products` # INSERT INTO products VALUES (1, 'Chai', '18', '39', '0'); INSERT INTO products VALUES (2, 'Chang', '19', '17', '0'); INSERT INTO products VALUES (3, 'Aniseed Syrup', '10', '13', '0'); INSERT INTO products VALUES (4, 'Chef Antons Cajun Seasoning', '22', '53', '0'); INSERT INTO products VALUES (5, 'Chef Anton Gumbo Mix', '21.35', '0', '1'); INSERT INTO products VALUES (6, 'Grandma Boysenberry Spread', '25', '120', '0'); INSERT INTO products VALUES (7, 'Uncle Bob Organic Dried Pears', '30', '15', '0'); INSERT INTO products VALUES (8, 'Northwoods Cranberry Sauce', '40', '6', '0');
الحل
بالطبع الأمر بسيط جدا ولكن هذه المرة لن نقوم ببرمجة هذه الصفحة بشكل تقليدي
ولكننا سوف نقوم بتصميم طبقة خاصة بالتعامل مع قاعدة البيانات test(بمزود خدمة MYSQL)
وتكون وظيفتها التعامل مع قاعدة البيانات فقط , تابع المخطط التالي

بالطبع هذا مخطط بسيط لهذا النمط ويمكننا أن نقوم بزيادة عدد الوظائف function الموجودة بتلك الطبقة
بحيث لا ندع فرصة لمن يقوم ببرمجة المشروع بالتعامل مع مصدر البيانات بطريقة مباشرة دون المرور علي طبقة التعامل مع البيانات DAL
<?php
class DataAccess
{
/**
* private
* stores a database resource
*/
var $conn;
/**
* private
* stores a query resource
*/
var $result;
/**
* Constucts a new DataAccess object
* @param $host string hostname for database server
* @param $user string database server user
* @param $pass string database server user password
* @param $dbname string database name
*/
function DataAccess ($host,$user,$pass,$dbname) {
$this->conn = mysql_pconnect($host, $user, $pass);
mysql_select_db($dbname, $this->conn);
}
/**
* Execute a query like insert, delete or update
* @param $sql string
* @return void
*/
function execute($sql) {
mysql_query($sql,$this->conn);
}
/**
* Fetches a query resources and stores it in a local member
* @param $sql string
* @return void
*/
function fetch($sql) {
$this->result = mysql_query($sql,$this->conn);
}
/**
* Returns an associative array of a query row
* @return Array
*/
function getNextRow() {
if( $row = mysql_fetch_array($this->result) )
return $row;
else
return null;
}
}
?>كما أحب أن أشير إلي أنه يمكننا دمج نمط ال DataAccess مع نمط Iterator الذي تم شرحه سابقا
بعد الإنتهاء من إعداد هذه الطبقة
نقوم باستخدامها في الصفحة المسئولة عن عرض المنتجات التالية
products.php
<?
include_once "lib\DataAccess.php";
$dao = new DataAccess("localhost", "root", "", "test");
$dao->fetch("Select * From products");
while( ($curRow = $dao->getNextRow()) != null )
{
echo $curRow["PRODUCTNAME"] . "<br/>";
}
?>نخلص من المثال السابق بالتالي :
- أن كل تعاملتنا مع قاعدة البيانات تتم من خلال طبقة DataAccess
- يمكننا تزويد هذه الطبقة بمهمة سرد الأخطأ الناتجة عن التعامل مع قاعدة البيانات في ملف متابعة مثلا
- في حالة تم تغير مزود خدمة قاعدة البيانات إلي نوع أخر , يمكننا أن نقوم بتعديل هذه الطبقة فقط دون اللجوء إلي تعديل محتوي المشروع
إلي اللقاء مع نمط جديد بإذن الله تعالي
وبالله التوفيق
والسلام عليكم ورحمة الله وبركاته
