1. 程式人生 > >面向物件思想的留言功能例項

面向物件思想的留言功能例項

這一次呢,我們主要是來利用面向物件的思想來完成一個留言功能的模型,這個模型呢,不涉及資料庫以及介面顯示等操作,只是用來演化面向物件的一些思維。

我們先來看面向過程的思維來解讀這個留言功能,在這個思維裡,要設計一個留言本,一切都會以這個功能為核心,抓到什麼,就是什麼,按著流程走下來,也就是使用者填寫資訊》留言》展示,類似這種。

然後我們就來用面向物件的思維來考慮下這個功能。

在面向物件的世界裡,我們要想盡辦法把肉眼能看見的或者不能看見的,但是實際存在的東西或者說流程抽象出來,既然是留言功能,那麼就存在留言內容這個實體,這個實體我們先來假設它包含姓名、E-mail、留言內容這三個元素,我們先來建立留言實體類message,程式碼如下:

class message
{
    public $name;
    public $email;
    public $content;

    public function set($name,$value)
    {
        $this->name = $name;
    }

    public function get($name)
    {
        if (!isset($this->name)) {
            $this->name = null;
        }
    }
}

上述程式碼我們可以看做是一個真實存在的、經過抽象後的實體模型,完事,我們需要建立一個留言操作的模型,這個模型得包括留言這個功能的基本屬性和一些基本操作,程式碼如下:

class g_book_model
{
    private $path;
    private $data;

    public function set_path($path)
    {
        $this->path = $path;
    }

    public function get_path()
    {
        return $this->path;
    }

    public function open()
    {
        # code...
    }

    public function close()
    {
        # code...
    }

    public function read()
    {
        return file_get_contents($this->path);
    }

    public function delete()
    {
        file_put_contents($this->path, "there is empty now");
    }

    public function write($data)
    {
        $this->data = $data->name."&".$data->email."&".$data->content;
        return file_put_contents($this->path,$this->data,FILE_APPEND);
    }
}

我們在專案中實際操作的時候可能會更加複雜,例如日誌操作或者說資料安全性檢測等,咱這裡就沒搞那麼多哈,為了防止有的夥計呢,直接拿了咱這個程式碼來進行使用,所以咱也為了方便你得擴充套件,在定義一個類來負責資料的邏輯處理,程式碼如下:

class level_model
{
    public function write(g_book_model $gb,$data)
    {
        $gb->get_path();
        $gb->write($data);
    }
}

上述程式碼屬於業務邏輯程式碼,大家可以在上述程式碼中進行擴充套件,完事我們最後通過一個類,來控制對各種操作的封裝,這個類呢,是直接面向客戶的,所以呢,得包含留言的增刪查的功能,我們可以形象的把這個類理解為留言功能所提供的直接面向使用者的介面,這個類會封裝操作的細節,只需要呼叫類中相應的方法即可,具體程式碼如下:

class author
{
    public function message(level_model $l,g_book_model $g,message $data)
    {
        $l->write($g,$data);
    }

    public function view(g_book_model $g)
    {
         return $g->read();
    }

    public function delete(g_book_model $g)
    {
        $g->delete();
    }
}

我們來通過一部分程式碼來測試下上述程式碼的可用性:

$message = new message();
$message->name = "luyaran";
$message->email = "[email protected]";
$message->content = "who is my love";

$gb = new author();
$pen = new level_model();
$book = new g_book_model();

$book->set_path(dirname(__FILE__)."/book.txt");
$gb->message($pen,$book,$message);
echo $gb->view($book);
$gb->delete($book);

好,到這裡呢,大家可以再次通盤看一下我們的程式碼,是不是比面向過程的程式碼要複雜一些,同時代碼量也是有增加的,但是,如果這個留言功能讓幾個人來同時完善的話,我們再來感受下,面向物件和麵向過程,那一個更加複雜,空口無憑,咱們再來完善下上面的程式碼,增加一個數據追加的功能:

 public function add_data()
 {
        return file_put_contents($this->path,"&add_data",FILE_APPEND);
 }

上述程式碼是新增在g_book_model模型中的,完事就是在控制類author新增相應的執行方法如下:

public function add_data(g_book_model $g)
    {
        $g->add_data();
    }

測試程式碼如下:

$message = new message();
$message->name = "luyaran";
$message->email = "[email protected]";
$message->content = "who is my love";

$gb = new author();
$pen = new level_model();
$book = new g_book_model();

$book->set_path(dirname(__FILE__)."/book.txt");
$gb->message($pen,$book,$message);
echo $gb->view($book);
$gb->add_data($book);
echo "<br>";
echo $gb->view($book);
$gb->delete($book);

完事之後,會在原來資料的基礎上追加一個add_data。

類似上述簡單兩段程式碼,我們就可以追加一段程式碼,實現一個數據追加的功能,而且已經存在的方法可以不用修改,只需要在相關的類中新增方法就可以。

咱們這個程式呢,只是簡單的體現了設計模式,還有許多要改進的地方,每個程式設計師心中都有自己的面向物件,專案越大,越能體現出模組劃分、面向物件的好處,咱們這裡就不做過多的贅述了。

好啦,本次記錄就到這裡了。

如果感覺不錯的話,請多多點贊支援哦。。。