昨天在學(xué)習(xí) SplDoublyLinkedList 的時(shí)候發(fā)現(xiàn)一個(gè)有趣的現(xiàn)象,比如
php$obj = new SplDoublyLinkedList(); $obj->push("string");
這時(shí)候想判斷 $obj 里面到底有沒(méi)有值,或是不是一個(gè),并且里面的值為 "string",我們通常會(huì):
phpprint_r($obj);
然后通過(guò)肉眼去看打印出來(lái)的,確實(shí)與我們想的一致,那么我們就會(huì)認(rèn)為是成功的。如果不一致就會(huì)認(rèn)為是失敗的。
仔細(xì)想想,這種與我們要做的測(cè)試程序不是一模一樣嘛,只不過(guò)測(cè)試程序是用來(lái)檢測(cè)我們的代碼有沒(méi)有問(wèn)題,但現(xiàn)在由于代碼是 PHP 官網(wǎng)這種權(quán)威組織寫(xiě)的,我們可以認(rèn)為都是對(duì)的,現(xiàn)在要是寫(xiě)測(cè)試程序的話(huà),就是另一層函義了,不是測(cè)試他們的代碼是否有問(wèn)題,而是代表我們對(duì)這個(gè)功能的認(rèn)識(shí)。
經(jīng)常我們會(huì)用 print_r 來(lái)打印,有時(shí)候自己會(huì)主觀的認(rèn)為是這樣是那樣,然后看的也不一定很仔細(xì),然后就認(rèn)為是對(duì)的,最后實(shí)際使用時(shí)發(fā)現(xiàn)不是的想的那樣(我有親身經(jīng)歷),寫(xiě)測(cè)試就是讓程序來(lái)判斷,我們的想法是不是有問(wèn)題,哪里出錯(cuò)了,最主要它還可以把當(dāng)時(shí)的思路保持下來(lái),以后再繼續(xù)回顧。
以下是我在學(xué)習(xí) SplDoublyLinkedList 時(shí)寫(xiě)的一些測(cè)試,以后看到這個(gè)測(cè)試類(lèi),就知道了 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); /* * 因?yàn)橹羔樳€未初始化 * 所以 * 1. 當(dāng)前指針是否有效為 FALSE * 2. 直接獲取當(dāng)前指針的值會(huì)是 NULL */ $this->assertEquals(FALSE, $obj->valid()); $this->assertEquals(NULL, $obj->current()); $obj->rewind(); // 將指針重置之后,第一個(gè)肯定是 11 ,因?yàn)樗窃谧詈髨?zhí)行了一個(gè) // 將 11 插入到鏈表最前面的一個(gè)函數(shù) unshift $this->assertEquals(11, $obj->current()); $obj->next(); // 11 下面應(yīng)該是 10 $this->assertEquals(10, $obj->current()); // (下一個(gè) 下一個(gè) 上一個(gè)) === (下一個(gè)) $obj->next(); // 0 $obj->next(); // 1 $obj->prev(); // 0 $this->assertEquals(0, $obj->current()); $obj->next(); // 1 $obj->next(); // 2 $obj->next(); // 已經(jīng)超過(guò)最大的了,使用 valid 判斷應(yīng)該是 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. // 獲取最后一個(gè)節(jié)點(diǎn)的值 $this->assertEquals(2, $obj->top()); // Peeks at the node from the beginning of the doubly linked list // Return: The value of the first node. // 獲取第一個(gè)節(jié)點(diǎn)的值 $this->assertEquals(11, $obj->bottom()); } public function testIsEmpty(){ $obj = new SplDoublyLinkedList(); $this->assertEquals(true, $obj->isEmpty()); $obj->unshift("string"); // 這里已經(jīng)有值了就應(yīng)該是 false $this->assertEquals(false, $obj->isEmpty()); // 這時(shí)再使用 pop 彈出最后一個(gè)就應(yīng)該是 "string" $this->assertEquals("string", $obj->pop()); } /** * 如果是空的時(shí)候試圖 pop 彈出最后一個(gè)節(jié)點(diǎn)的值則會(huì) 拋出一個(gè) 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"); // 下標(biāo)是從0 開(kāi)始的 所以現(xiàn)在3 應(yīng)該是不存在的 $this->assertEquals(false, $obj->offsetExists(3)); // 下標(biāo)為2 的應(yīng)該是存在的 $this->assertEquals(true, $obj->offsetExists(2)); $this->assertEquals("two", $obj->offsetGet(2)); // 刪除下標(biāo)為0 的值 $obj->offsetUnset(0); // 刪除為 0 的值之后,后面的都會(huì)向前移一位 // 所以現(xiàn)在的順序?yàn)椋?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()); // 并且總個(gè)數(shù)為 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"); // 這時(shí)候的順序應(yīng)該是: // 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()); } }
原文鏈接 學(xué)習(xí) PHP 程序新東西的另一種方法
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/20943.html
摘要:我應(yīng)該先學(xué)習(xí)哪種編程語(yǔ)言這一切都取決于你想要完成的事情作為技術(shù)作家,我的任務(wù)是使復(fù)雜的主題易于理解,因此在本文中您將找不到太多技術(shù)術(shù)語(yǔ)。我應(yīng)該先學(xué)習(xí)哪種編程語(yǔ)言這是我自出版之前收到的最常見(jiàn)的問(wèn)題。是一種后端語(yǔ)言。我應(yīng)該先學(xué)習(xí)哪種編程語(yǔ)言? 這一切都取決于你想要完成的事情 作為技術(shù)作家,我的任務(wù)是使復(fù)雜的主題易于理解,因此在本文中您將找不到太多技術(shù)術(shù)語(yǔ)。我可以對(duì)面向?qū)ο蟮木?..
摘要:我應(yīng)該先學(xué)習(xí)哪種編程語(yǔ)言這一切都取決于你想要完成的事情作為技術(shù)作家,我的任務(wù)是使復(fù)雜的主題易于理解,因此在本文中您將找不到太多技術(shù)術(shù)語(yǔ)。我應(yīng)該先學(xué)習(xí)哪種編程語(yǔ)言這是我自出版之前收到的最常見(jiàn)的問(wèn)題。是一種后端語(yǔ)言。我應(yīng)該先學(xué)習(xí)哪種編程語(yǔ)言? 這一切都取決于你想要完成的事情 作為技術(shù)作家,我的任務(wù)是使復(fù)雜的主題易于理解,因此在本文中您將找不到太多技術(shù)術(shù)語(yǔ)。我可以對(duì)面向?qū)ο蟮木?..
摘要:機(jī)器學(xué)習(xí)也是這個(gè)大筐中的一個(gè)組成部分。我們目前的發(fā)展階段是機(jī)器學(xué)習(xí)正處在第二級(jí)和第三級(jí)交界處。機(jī)器學(xué)習(xí)工程師的職位是怎樣的機(jī)器學(xué)習(xí)工程師的位置更具有技術(shù)性。換句話(huà)說(shuō),機(jī)器學(xué)習(xí)工程師與傳統(tǒng)的軟件工程有著比數(shù)據(jù)科學(xué)更多的相同點(diǎn)。 翻譯:瘋狂的技術(shù)宅https://towardsdatascience.co... showImg(https://segmentfault.com/img/b...
閱讀 3486·2023-04-26 02:48
閱讀 1475·2021-10-11 10:57
閱讀 2502·2021-09-23 11:35
閱讀 1210·2021-09-06 15:02
閱讀 3310·2019-08-30 15:54
閱讀 1626·2019-08-30 15:44
閱讀 893·2019-08-30 15:44
閱讀 1000·2019-08-30 12:52