htdf 是 how to design functions 的缩写。
在介绍这章需要注意的知识点之前, 如果对视频没什么印象的朋友们, 辛苦你们
再看一次,毕竟经典是拿来重温的\( ̄<  ̄)>
视频拉到4:13 开始播放就行, 4:13之前是在阐述htdf对于生活的意义.
1.signature
2.purpose
3.check-expect
4.stub
5.template
6.function body
htdf是这六个步骤,并且需要死记一下
一开始可能总会忘了其中一样,但是不要灰心,mt前几天就记住了, 刷题刷到此生难忘
值得注意的是,2016之后为了好让作业上传自动改分, 引入了一个叫tag 的plugin
就是加入了三个(@htdf function名字), (@signature ...) 和 (@template ...) 你可以
想象成微信的@功能,就是上传作业的时候, 作业先到了一个群,你要@一下htdf,
signature和template这三个人, 他们才帮你改分。考试的时候tag 也要写。所以视
频中的code 应该更新成下面这种格式
(@htdf double)
(@signature Number -> Number)
;; double a given number.
(check-expect (double 1) 2)
(check-expect (double 4.2) 8.4)
;(define (double n) 0) ;stub
(@template Number)
;;template
;(define (double n) (... n))
(define (double n)
(* n 2))
-
接着我们再用一题说一下阿关于htdf的六个步骤需要注意的点
Design a function called "longer" that consumes two strings and produce the longer string.
prodcue the second one if their lengths are equal.
1.signature
signature就是把输入和产出各自对应的数据类型说明一下
有时输入可能是两个或则多个,例如这一题
signature要写两个input
(@signature String String -> String)
2.purpose
pursose 比较直观,就是用简短的语言把题目复述一次
3.check-expect
check-expect 需要多少个才可以?
一般分两种情况。
一种是没有判断产生结果的,像视频中的double function 一样,一般两个check-expect
还有一种是通过判断产生结果的,每种情况需要对应一个check-expect,并加上一个边界
check-expect. 以这一题为例,我们先写一个test case
在测试过程中,如果出现这种出现黑色高光的情况,是指check-expect没有cover到的code
所以我们再添加一个case
这时黑色高光消失,check-expect cover到全部code,但是我们还需要一个edge case,就是
两个String 相等的时候(题目一般都会提到边界情况需要产生什么), 我们再补一个
边界异常的话, 后果很严重
4.stub
stub 大概是给function 打个草稿的意思,格式一般是
(define (fn-name input) [0, "", empty, false or ....]) ;stub
;(define (double n) 0) ;stub
double 是fn-name,n 是input 的代名, 因为要产出number, 写个0意思一下
你可以想成因为是打草稿,所以output意思一下就可以了。
产生string的时候, 我们可以写"" (empty string)
产生boolean的时候, 我们可以写false
产生list(self-reference 会讲到)的时候, 我们可以写empty
在这一题, stub 我们可以写
(define (longer str1 str2) "") ;stub
5.template
template 可以想成是说明书,就是跟别人说一下这个function 怎么用
(@template Number)
;;template
(define (double n) (... n))
用人类的语言翻译一下就是这个function 的input 是Number 名字叫n
...n的意思是output 是关于n的一些操作后产生的结果
我们这一题的template 就是
(@template String)
;;template
(define (longer str1 str2) (... str1 str2))
6.function body
function body 就是function具体怎么写了
这个就需要通过刷题来总结规律了
最后,这题完全写下来应该是这种格式。
(@htdf longer)
(@signature String String -> String)
;;consumes two strings and produce the longer one
(check-expect (longer "ab" "a") "ab")
(check-expect (longer "a" "ab") "ab")
(check-expect (longer "ccc" "efg") "efg")
(@template String)
;;template
;(define (longer str1 str2) (... str1 str2))
(define (longer str1 str2) "") ;stub
(define (longer str1 str2)
(if (> (string-length str1) (string-length str2))
str1
str2))