# 練習 27:`tr`
> 原文:[Exercise 27: tr](https://learncodethehardway.org/more-python-book/ex27.html)
> 譯者:[飛龍](https://github.com/wizardforcel)
> 協議:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/)
> 自豪地采用[谷歌翻譯](https://translate.google.cn/)
這個練習是繼續學習 TDD(又稱“測試優先”)風格的開發。知道如何這樣編程很重要,因為它在許多地方使用,但如前所述,它有其局限性。在實現`tr`命令時,您將再次使用 TDD 進行練習。要十分確定,你是先嚴格編寫測試,然后是代碼,然后再審計兩個東西。
在上一個練習中,我讓你逐步構建測試用例和代碼。這通常是最不容易出錯的開發方法,但它不能幫助您更好地分析自己的代碼。在這個練習中,你會做一些略微不同的事情,因為我將會寫一個完整的測試用例,進行審計,然后編寫整個代碼,進行審計,并通過運行測試來確認審計。
這意味著,在這個練習中你的流程是這樣的:
+ 嘗試編寫大部分 TDD 測試用例。
+ 審計測試用例并確認它是否編寫正確。
+ 運行測試以確保它們失敗,但是查找任何語法錯誤。此時您不應該有語法錯誤。
+ 為測試用例編寫代碼,但不要運行測試。
+ 審計您的代碼,并嘗試在運行測試之前查看有多少缺陷。
您將在下一個練習中,使用此過程來跟蹤您的審計技能、測試技能的指標,并更好地控制您編寫代碼的方式。
## 挑戰練習
`tr`工具是翻譯字符流的有效方式。盡管非常簡單,它可以對字符做一些非常復雜的事情。例如,您可以使用`tr`,以一行代碼,獲取`history`中使用的單詞的頻率:
```
history | tr -cs A-Za-z '\n' | tr A-Z a-z | sort | uniq -c | sort -rn
```
似乎很炫酷,但是 Doug McIlroy 曾經使用這一行來辯稱,高德納(Donald Knuth)編寫的一個類似的程序太長。Knuth 的實現是“10頁”,從頭開始構建一切。Doug 的一行只是使用標準的 Unix 工具來做同樣的事情。這展示了 Unix 的管道工具的力量和`tr`的翻譯文本的能力。
使用手冊頁和任何其他東西,弄清`tr`命令的作用。還有一個同名的 Python 項目,但是我會告訴你要避開它,直到你完成實現,所以你可以稍后再比較這個項目。同時不要忘記,為此你需要一個整體的項目,它應該是測試完成的 TDD 風格,就像我開始的描述的那樣。
## 45 分鐘的批判
我希望你繼續使用45分鐘的時間,但是有一個對這種工作方式的很大批評:你不能進入擴展的專注流程。在短時間內工作,像這樣,在你需要處理大量工作的,以及必須加快步伐時有所幫助。這種情況發生在工作真的很無聊,沒有樂趣的時候。我正在讓你使用45分鐘的時間塊來加快自己的速度,但是我們也會在稍后使用它們,來收集一些指標,有關如何在時間中工作,來進行后續分析。
但我會提醒你,最好的編程是在專注的狀態中完成的。這就是,你的注意力在幾個小時之內高度集中,失去所有的時間感,直到凌晨 5 點,意識到你度過了一整夜。這種強烈的專注使編程對我來說非常愉快,但是當您對您正在做的事情很感興趣時,它真的是可持續的。當您需要處理別人的糟糕的代碼庫時,這個現象往往不會發生。在這些情況下,您需要一個不同的策略,加快你的工作并讓你擺脫困境,而不會損耗你的興致。這就是 45 分鐘的時間塊的作用。
最后,建立你進入狀態并集中精力幾個小時的能力,一個方法是從短暫的時間開始,然后慢慢增加它們,直到你可以忍受更長的時間。繼續使用 45 分鐘的時間快,但是如果你只是忘乎所以,最后在最后幾個小時內完成黑魔法,那么就玩的開心。沒有人會說你做錯了,這實際上是正常的。
## 研究性學習
+ 這種工作方式怎么樣?你喜歡嗎?嘗試闡明為什么,然后閱讀一些當前的 TDD 的文章,或它的近親行為驅動開發(BDD)。
+ 你認為通過首先審計你的代碼而不是逐步構建它,你發現了更多還是更少的缺陷?猜測它,然后寫下來。
- 笨辦法學 Python · 續 中文版
- 引言
- 第一部分:預備知識
- 練習 0:起步
- 練習 1:流程
- 練習 2:創造力
- 練習 3:質量
- 第二部分:簡單的黑魔法
- 練習 4:處理命令行參數
- 練習 5:cat
- 練習 6:find
- 練習 7:grep
- 練習 8:cut
- 練習 9:sed
- 練習 10:sort
- 練習 11:uniq
- 練習 12:復習
- 第三部分:數據結構
- 練習 13:單鏈表
- 練習 14:雙鏈表
- 練習 15:棧和隊列
- 練習 16:冒泡、快速和歸并排序
- 練習 17:字典
- 練習 18:性能測量
- 練習 19:改善性能
- 練習 20:二叉搜索樹
- 練習 21:二分搜索
- 練習 22:后綴數組
- 練習 23:三叉搜索樹
- 練習 24:URL 快速路由
- 第四部分:進階項目
- 練習 25:xargs
- 練習 26:hexdump
- 練習 27:tr
- 練習 28:sh
- 練習 29:diff和patch
- 第五部分:文本解析
- 練習 30:有限狀態機
- 練習 31:正則表達式
- 練習 32:掃描器
- 練習 33:解析器
- 練習 34:分析器
- 練習 35:解釋器
- 練習 36:簡單的計算器
- 練習 37:小型 BASIC
- 第六部分:SQL 和對象關系映射
- 練習 38:SQL 簡介
- 練習 39:SQL 創建
- 練習 40:SQL 讀取
- 練習 41:SQL 更新
- 練習 42:SQL 刪除
- 練習 43:SQL 管理
- 練習 44:使用 Python 的數據庫 API
- 練習 45:創建 ORM
- 第七部分:大作業
- 練習 46:blog
- 練習 47:bc
- 練習 48:ed
- 練習 49:sed
- 練習 50:vi
- 練習 51:lessweb
- 練習 52:moreweb