国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

學習 PHP 程序新東西的另一種方法

henry14 / 1827人閱讀

昨天在學習 SplDoublyLinkedList 的時候發現一個有趣的現象,比如

php$obj = new SplDoublyLinkedList();
$obj->push("string");

這時候想判斷 $obj 里面到底有沒有值,或是不是一個,并且里面的值為 "string",我們通常會:

phpprint_r($obj);

然后通過肉眼去看打印出來的,確實與我們想的一致,那么我們就會認為是成功的。如果不一致就會認為是失敗的。

仔細想想,這種與我們要做的測試程序不是一模一樣嘛,只不過測試程序是用來檢測我們的代碼有沒有問題,但現在由于代碼是 PHP 官網這種權威組織寫的,我們可以認為都是對的,現在要是寫測試程序的話,就是另一層函義了,不是測試他們的代碼是否有問題,而是代表我們對這個功能的認識。

經常我們會用 print_r 來打印,有時候自己會主觀的認為是這樣是那樣,然后看的也不一定很仔細,然后就認為是對的,最后實際使用時發現不是的想的那樣(我有親身經歷),寫測試就是讓程序來判斷,我們的想法是不是有問題,哪里出錯了,最主要它還可以把當時的思路保持下來,以后再繼續回顧。

以下是我在學習 SplDoublyLinkedList 時寫的一些測試,以后看到這個測試類,就知道了 SplDoublyLinkedList 該怎么用了。

phppush(0);
        $obj->push(1);
        $obj->push(2);

        // Prepends value at the beginning of the doubly linked list.
        $obj->unshift(10);
        $obj->unshift(11);

        /*
         * 因為指針還未初始化
         * 所以
         * 1. 當前指針是否有效為 FALSE
         * 2. 直接獲取當前指針的值會是 NULL
         */
        $this->assertEquals(FALSE, $obj->valid());
        $this->assertEquals(NULL, $obj->current());

        $obj->rewind();
        // 將指針重置之后,第一個肯定是 11 ,因為它是在最后執行了一個
        // 將 11 插入到鏈表最前面的一個函數 unshift
        $this->assertEquals(11, $obj->current());

        $obj->next();
        // 11 下面應該是 10
        $this->assertEquals(10, $obj->current());

        // (下一個 下一個 上一個) === (下一個)
        $obj->next(); // 0
        $obj->next(); // 1
        $obj->prev(); // 0
        $this->assertEquals(0, $obj->current());

        $obj->next(); // 1
        $obj->next(); // 2
        $obj->next(); // 已經超過最大的了,使用 valid 判斷應該是 false
        $this->assertEquals(false, $obj->valid());
    }

    public function testSplDoublyLinkedListPart2()
    {
        $obj = new SplDoublyLinkedList();
        // Pushes value at the end of the doubly linked list.
        $obj->push(0);
        $obj->push(1);
        $obj->push(2);

        // Prepends value at the beginning of the doubly linked list.
        $obj->unshift(10);
        $obj->unshift(11);

        //  Peeks at the node from the end of the doubly linked list
        //  Return: The value of the last node.
        //  獲取最后一個節點的值
        $this->assertEquals(2, $obj->top());

        // Peeks at the node from the beginning of the doubly linked list
        // Return: The value of the first node.
        // 獲取第一個節點的值
        $this->assertEquals(11, $obj->bottom());
    }

    public function testIsEmpty(){
        $obj = new SplDoublyLinkedList();

        $this->assertEquals(true, $obj->isEmpty());

        $obj->unshift("string");
        // 這里已經有值了就應該是 false
        $this->assertEquals(false, $obj->isEmpty());

        // 這時再使用 pop 彈出最后一個就應該是 "string"
        $this->assertEquals("string", $obj->pop());

    }

    /**
     * 如果是空的時候試圖 pop 彈出最后一個節點的值則會 拋出一個 RuntimeException
     *
     * @expectedException RuntimeException
     */
    public function testRuntimeException(){
        $obj = new SplDoublyLinkedList();
        $obj->pop();
    }

    public function testOffset(){
        $obj = new SplDoublyLinkedList();
        $obj->push("one");
        $obj->push("two");
        $obj->unshift("three");

        // 下標是從0 開始的 所以現在3 應該是不存在的
        $this->assertEquals(false, $obj->offsetExists(3));

        // 下標為2 的應該是存在的
        $this->assertEquals(true, $obj->offsetExists(2));

        $this->assertEquals("two", $obj->offsetGet(2));

        // 刪除下標為0 的值
        $obj->offsetUnset(0);
        // 刪除為 0 的值之后,后面的都會向前移一位
        // 所以現在的順序為: one two
        $obj->rewind();
        $this->assertEquals("one", $obj->current());
        $this->assertEquals(0, $obj->key());

        $obj->next();
        $this->assertEquals("two", $obj->current());
        $this->assertEquals(1, $obj->key());
        // 并且總個數為 2
        $this->assertEquals(2, $obj->count());
    }

    public function testAdd(){
        $obj = new SplDoublyLinkedList();
        $obj->push("one");
        $obj->push("two");
        $obj->push("three");
        $obj->unshift("four");
        $obj->add(1, "five");

        // 這時候的順序應該是:
        // four five one two three

        $obj->rewind();
        $this->assertEquals("four", $obj->current());
        $obj->next();
        $this->assertEquals("five", $obj->current());
        $obj->next();
        $this->assertEquals("one", $obj->current());
        $obj->next();
        $this->assertEquals("two", $obj->current());
        $obj->next();
        $this->assertEquals("three", $obj->current());
    }
}

原文鏈接 學習 PHP 程序新東西的另一種方法

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/20943.html

相關文章

  • 我應該先學習哪種編程語言?

    摘要:我應該先學習哪種編程語言這一切都取決于你想要完成的事情作為技術作家,我的任務是使復雜的主題易于理解,因此在本文中您將找不到太多技術術語。我應該先學習哪種編程語言這是我自出版之前收到的最常見的問題。是一種后端語言。我應該先學習哪種編程語言? 這一切都取決于你想要完成的事情 作為技術作家,我的任務是使復雜的主題易于理解,因此在本文中您將找不到太多技術術語。我可以對面向對象的編...

    huashiou 評論0 收藏0
  • 我應該先學習哪種編程語言?

    摘要:我應該先學習哪種編程語言這一切都取決于你想要完成的事情作為技術作家,我的任務是使復雜的主題易于理解,因此在本文中您將找不到太多技術術語。我應該先學習哪種編程語言這是我自出版之前收到的最常見的問題。是一種后端語言。我應該先學習哪種編程語言? 這一切都取決于你想要完成的事情 作為技術作家,我的任務是使復雜的主題易于理解,因此在本文中您將找不到太多技術術語。我可以對面向對象的編...

    selfimpr 評論0 收藏0
  • 談談機器學習與傳統編程之間的區別

    摘要:機器學習也是這個大筐中的一個組成部分。我們目前的發展階段是機器學習正處在第二級和第三級交界處。機器學習工程師的職位是怎樣的機器學習工程師的位置更具有技術性。換句話說,機器學習工程師與傳統的軟件工程有著比數據科學更多的相同點。 翻譯:瘋狂的技術宅https://towardsdatascience.co... showImg(https://segmentfault.com/img/b...

    王巖威 評論0 收藏0

發表評論

0條評論

henry14

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<