2009年01月5日

[程式開發] 抽象的意義

上次教育訓練完,小魚問我抽象的意義是什麼?知道它對寫物件導向有什麼幫助嗎?

在課程中我舉了人開車的例子,但充其量只是解釋了「抽象」的抽象意義而已 (還真繞口) ...

就讓我用新的例子來說明吧。

資料庫抽象層

不曉得各位有沒有轉換過資料庫系統的經驗,撇開政治因素不談,其實以往在轉換資料庫時常是一件麻煩事。

以 MySQL 轉換成 Oracle 為例,在 PHP 中 MySQL 通常是用 mysql_* 的函式來處理資料庫,而 Oracle 則是用 oci_* 的函式來處理。

這樣在轉換資料庫系統時,程式改動所要耗費的心力將會是難以想像的估計,尤其在大型程式上面。

如果在初期開發時,我們能夠不必受到不同資料庫系統的限制,而能專注於處理資料上的邏輯,那不是很好嗎?

所以我們就有了 ADOdb 、 PEAR::DB 或是 PDO 等等資料庫抽象層類庫可使用了。

以 PDO 為例:

<?php
$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';

try {
    $dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}

sql = 'SELECT ...';
foreach ($dbh->query($sql) as $row) { // ... }

在系統底層, $dbh 其實是以 MySQL Driver 在連結 MySQL 資料伺服器。我們只要能夠使用它的 query() 方法,就能夠操作資料,而 $dbh 這個物件到底是怎麼跟 MySQL 溝通的,我們其實不在乎。以下是圖解:

PDO 抽象圖解

如果現在要將資料庫系統轉換成 Oracle ,我們只要換掉 DSN 就好了,這樣不是很方便嗎?

註:當然 MySQL 所支援的 SQL 語法和 Oracle 還是有些許不同,但改動幅度已大大降低。

抽象的意義

所以抽象其實在物件導向開發中,是個很重要的觀念;它可以讓我們從不同卻又類似的模型中,找出一致性的操作方式。

而且像是「繼承」、「多型」及「封裝」其實都和「抽象」有著密切的關係,更可以說它們其實是一體的。

希望這個補充說明可以幫助上次沒聽懂這部份的伙伴們對物件導向有更深的體會囉!

如果有空,我會再對其他主題再做進一步說明的。



Posted by jaceju at 樂多Roodo! │19:52 │程式開發
樂多分類:網路/3C 工具:編輯本文
Ads by Roodo!