2013年5月17日 星期五

MVC=Model-View-Control


M=Model, 負責資料儲存
V=View, 負責資料的呈現,例如網頁。
C=Control, 負責程式的邏輯控制

定義好framework的話則可將一些程式實作上的細節給隱藏起來(encapsulate)加以抽象化,再降低程式之間的隅合程度。

再以資料庫查詢應用為例,使用 MVC 而未使用 framework 之前,我們會用 sample1.php 的寫法。
sample1.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
require_once 'config.php'; // get database address, user and password
$dbh = new PDO(DB_CONNECT_STRING, DB_USER, DB_PASSWORD);
function getFoo() {
    global $dbh;
    $fooSet = array();
    $i = 0;
    foreach ($dbh->query('SELECT * from FOO') as $row) {
        $fooSet[$i++] = $row;
    }
    return $fooSet;
}
?>
接著,假設我們使用了某個名為 "MyCommonApp" 的 framework 之後,按該 framework 的預先建置內容,我們改成 sample2.php 的寫法。
sample2.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
require_once 'MyCommonApp.php';
class FooApp extends MyCommonApp {
    function getFoo() {
        $fooSet = array();
        $i = 0;
        foreach ($this->dbh->query('SELECT * from FOO') as $row) {
            $fooSet[$i++] = $row;
        }
        return $fooSet;
    }
}
?>
sample1.php 和 sample2.php 兩種寫法的差異,一眼可見資料庫連線的動作被隱蔽了,而且也不需要用全域變數 (global) $dbh , $dbh 變成了個體成員 $this->dbh 。更進一步,被隱蔽的部份可以加以抽象化,如 MyCommonApp 可能會支援多種資料庫系統,或是支援不同的資料庫連接層 (DBA, MDB2 等) 。但這些細節皆被 framework 隱蔽起來, programmer 只需要專注 class FooApp 的內容即可。還有一件事要提,上述內容沒有 View 和 Control 的程式碼,因為根本不需要知道。 View 只管呈現陣列 ($fooSet) 的內容,不管是 sample1.php 或是 sample2.php ,只要 Model 丟出來的是個陣列, View 就不用作任何修改。這也是 MVC 架構所帶來的好處:低耦合度,各項工作間彼此獨立,其中一個項目的修改動作不會連帶要修改其他項目。在 team-work 中也意味著三種設計工作可以交由三個人同時進行。



沒有留言:

張貼留言