面向对象的核心

面向对象和函数式不是对立的。

面向对象语言的分类

  • 纯面向对象语言:一切都是对象,包括数字、字符串也是对象,如 Python、Ruby、Scala、Smalltalk
  • 完全支持面向对象,也支持过程式,如 Java、C++、C#
  • 本来不支持面向对象,后来加上的,如 PHP、Perl
  • 看起来像面向对象,但没有完全使用面向对象(比如基于原型来模拟面向对象):JavaScript、Lua
  • 其他还有很多种。

设计模式

设计模式指的是对于某个广泛出现的问题提出的适用性广的、可复用的解决方法,也叫套路。
某些面向对象语言内置了一些套路,如单例、事件、工厂等。

对面向对象的批评

  1. 复用性和模块化并没有达到预期目标。
  2. 过分强调模型,而忽略了计算和算法。

Smalltalk

双引号是注释,不要使用。

(1 + 2) * 3
'Hello, world' printNl //'Hello, world'

数组

x := Array new: 20 //将一个数组赋值给x 数组的长度是20,默认会打印出20个nil(也就是null)
x at: 1 //获取x里面的第一个(初始化索引就是从1开始)
x at: 1 put: 99 // x在第一个位置放一个99
(x at: 1) + 1 //在x第一个位置的数加1

Set
使用英文句号断句

x := Set new // 赋值给x一个不能重复的数组
x add: 5. x add: 7. x add: 'foo' // 在x里添加5 7 'foo',打印出Set(5 7 'foo')
x remove: 5 // 从x里移除5
x includes: 7 // x里面是否包含7 false不包含,true包含

有一种简写形式,可以少写几次 x

x add: 5; add: 7; add: 'foo'

打印出x

x 或者 x yourself 或者 x printNl

字典

y := Dictionary new  // Dictionary()
y at: 'One' put: 1 // 在One中添加一个1 Dictionary('One' -> 1)
y at: 'Two' put: 2
y at: 1 put: 'One'
y at: 2 put: 'Two'


y at: 1 //y在1对应的值 'One'
y at: 'Two'
y
y! 用于删除 y 的值
y

面向对象的核心就是对象与对象之间交互。

  1. 对象维护自己的状态和生命周期
  2. 每个对象独立
  3. 对象和对象直接通过消息传递来工作

函数式也可以做成消息传递风格

消息传递风格使用消息传递风格就可以构造 account 对象了,account 对象可以响应 withdraw(取钱)和 deposit(存钱)消息:

let makeAccount = money => {
  let take = (n) => {
    money = money - n
    return money
  }
  let save = (n) => {
    money = money + n
    return money
  }
  let dispatch = (m) => {
    return (
    m === 'take' ? take :
    m === 'save' ? save :
    new Error('unknown request'))
  }
  return dispatch
}

接下来是使用 makeAccount 创造两个 account 对象(其实是过程):

let account1 = makeAccount(100)
account1('take')(70) // 30
account1('save')(50) // 80

函数式代码示例(Pager组件)

function Pager(props) {
  const buttons = Array.apply(null, { length: props.total })
    .map((n, index) => index + 1)
    .filter(n => {
      if (n === 1) {
        return true;
      } else if (n === props.total) {
        return true;
      } else if (Math.abs(n - props.current) <= 2) {
        return true;
      } else {
        return false;
      }
    })
    .reduce((prev, n) => {
      const last = prev[prev.length - 1];
      return prev.concat(n - last > 1 ? [-1, n] : [n]);
    }, [])
    .map(n => (n === -1 ? <span>...</span> : <button>{n}</button>));
  return <div>{buttons}</div>;
}

function App() {
  return (
    <div className="App">
      <Pager current={5} total={10} />
    </div>
  );
}

在线demo:https://codesandbox.io/s/happy-williams-n80v7

赋值的本质

如果没有赋值,参数和变量只不过就是一个值的名字;
如果有了赋值,参数和变量 就是一个容器,可以保存不同的值。

这带来的问题很多。广泛采用赋值的程序设计叫做『命令式/指令式』程序设计。

命令式程序在遇到『并发』『克隆』等问题时经常很令人头疼。

函数式编程的特点

  1. 数学!(公理化和可证明)
  2. 更加强调程序执行的结果而非执行的过程
  3. 函数是一等公民(函数可以作为参数),高阶函数
  4. 纯函数,拒绝副作用
  5. 不可变数据
  6. 数据即代码,代码即数据
  7. 引用透明
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335