程序设计方法总结

2014年10月30日

函数式语言的一些概念

  • 一切都是数据: 类似lisp,scheme,emacs lisp 这类函数式语言,很重要的一个概念就是函数就是数据 其实一切都是表达式,所有的表达式都有值,也就是一切都是数据 在racket里面,定义函数,定义变量的语法分别为(define (fun-name vars ...) (fun-body...)) (define var var-value) 可以看到是几乎一样的. scheme文法,语义

  • 数据驱动编程:

  • **函数抽象 闭包 :**
  • 无状态: 一直听到说函数式语言是无状态的,但按我的理解,在整个程序当中,其实任何语言都是有状态的 函数式语言所谓的无状态,应该是粒度控制在函数体内的无状态.也就是: 无论调用一个函数多少次,只要使用相同的参数,总会得到相同的结果。 这个在函数式语言里面是可以做到的.

  • 模块化开发:
    • 辅助函数
    • 逐步精化
  • 尾递归:

  • 累加器:

程序就是函数加上变量定义

### 条件表达式与函数 ### 下面是racket的条件表达式/条件函数

(cond
  [question answer]
  ...
  [question answer])

(cond
  [question answer]
  ...
  [else answer])

设计条件函数的几个步骤

过程 目标 任务
数据分析 确定函数所要处理的所有不同情况 枚举所有可能的情况
例子 对于每种情况提供一个例子 对于每种情况至少选择一个例子
语句cond 阐明一个条件表达式 写出cond表达式的框架
语句value 对于每个cond子句给出答案 处理逻辑

其实这几条,都是很简单但是平时编程的时候也容易忽略的,导致一些低级错误的发生,这里最主要的其实还是分析数据

符合数据结构-结构体

image

  • 数据分析和设计: 在开始函数设计之前,先必须了解如何在程序设计语言中表示问题的信息。为做到 这一点,需要搜索问题以获得相关对象的描述,然后基于分析结果设计数据表示。

  • 名字约定,类型约定: 将数据类型定义好,函数的作用,函数的输入,输出表达清楚. 例如:

(check (make-student 'Wilson 'Frize 'Harper) )
输出预期:'Wilson
  • 函数/程序模板定义 在数据定义确定好后,将程序结构定义好,自然算法就出来了,逻辑处理的流程也清晰了.
;; process-student : student symbol -> ??? (define (process-student a-student a-teacher) ...)
(define (process-student a-student a-teacher)
      ... (student-last a-student) ...
      ... (student-first a-student) ...
      ... (student-teacher a-student) ...)
  • 函数定义 开始真正的逻辑处理

scheme文法,语义

函数抽象,闭包

递归与累加器

状态与记忆,持久化