面向数据的编程与面向对象的编程

g
guvest
101 楼
这个事情要反着看。如果你在公司混饭,不妨拆行拆列,
共用内存,复用变量,搞搞乱。反正语言一般都没有native fp支持。

指针什么的,按定义就是可以乱指的。所以其实还行。变量,如果复用。。。
【 在 jackw (jackw) 的大作中提到: 】
我指的是语言上的native support,当然所有功能最后都得机器语言来实现,C肯定捣
腾一下也能做,至少差不多。
T
TheMatrix
102 楼
一般情况下的抽象是提出概念,或者说给结构命名。计算机编程领域的抽象我理解是
给结构命名。所以OOP中的定义Class,以及封装,更符合我理解的抽象。

【 在 TheMatrix (TheMatrix) 的大作中提到: 】
请展开说一下抽象就是数据上累加数据?这和我理解的抽象不一样。
g
guvest
103 楼
这事不能太较真。为什么呢?

迄今为止所有的讨论,都有一个大前提,就是源代码是纯文本。
fp,immutable, 封装抽象什么的都有一个假设,就是源代码是纯文本.
所以只能用语法,也就是ascii字符串来达到目的.

方便高效指的是在纯文本源代码的前提下的方便高效.

但是这是一定合理的吗?

case 1.
fp的语言,专门使用语法把immutabl和mutable的东西分开,
效果是不是说不定还不如emacs改改字体或者语法高亮?

凡是immutable的,多敲一个键,用一个特殊的字体。
进编译器之前加一点文本预处理,是不是不就完事了。

case 2.
oo也一样。什么封装继承,一定能赢Emacs把代码改的
五颜六色加上图表注释吗吗?我看未必吧?

当然,我这是星宿派的独来独往的做法,不适合和人合作。
不追求在社会上能scale up。

【 在 TheMatrix (TheMatrix) 的大作中提到: 】

一般情况下的抽象是提出概念,或者说给结构命名。计算机编程领域的抽象我理解是
给结构命名。所以OOP中的定义Class,以及封装,更符合我理解的抽象。
g
guvest
104 楼
My two percent:

Abstract = lift up to superset

fruit is the abstraction of apple,orange,...

【 在 TheMatrix (TheMatrix) 的大作中提到: 】

一般情况下的抽象是提出概念,或者说给结构命名。计算机编程领域的抽象我理解是
给结构命名。所以OOP中的定义Class,以及封装,更符合我理解的抽象。
T
TheMatrix
105 楼
和我说的差不多。

【 在 guvest (我爱你老婆Anna) 的大作中提到: 】
My two percent:
Abstract = lift up to superset
fruit is the abstraction of apple,orange,...
一般情况下的抽象是提出概念,或者说给结构命名。计算机编程领域的抽象我理解是
a
acidia
106 楼
看了一遍,这帖子大概是SICP第三章没学过的水平
g
guvest
107 楼
You can lift up to higher order functions too
【 在 TheMatrix (TheMatrix) 的大作中提到: 】
和我说的差不多。
T
TheMatrix
108 楼
举个例子?

【 在 guvest (我爱你老婆Anna) 的大作中提到: 】
You can lift up to higher order functions too
w
winix
109 楼
c++的oo设计是把简单事情复杂化了,然后为了一些所谓的方便引进了一系列的坑,但
是还是有很多人无畏的跳进去学习,感觉就是浪费生命。。。
c++现在就是个垃圾语言,c++委员会就是群二货
g
guvest
110 楼
加减乘除是二元计算的一些实现。
二元函数就是抽象。
【 在 TheMatrix (TheMatrix) 的大作中提到: 】
举个例子?
T
TheMatrix
111 楼
这也在范围内。

这是你所说的higher order function?

【 在 guvest (我爱你老婆Anna) 的大作中提到: 】
加减乘除是二元计算的一些实现。
二元函数就是抽象。
h
hci
112 楼
用代码来描述比较清楚。

本来的数据,是两个字符串,“Apple", "Orange"

老板说,这两串其实有共性,他们都可以抽象成"Fruit"。

OOP马公说,我知道该咋办:

class Fruit {
String name = "";
}

class Apple extends Fruit {
String name = "Apple";
}

class Orange extends Fruit {
String name = "Orange";
}

FP马公说,其实加个函数就够了:

(defn fruit? [s] (#{"Apple" "Orange"} s))

DOP (data oriented programming)马公说,这些都是脱裤子放屁,不就是数据么:

{:fruit "Apple"}
{:fruit "Orange"}

你说所谓抽象是不是就是“数据上加数据”?

【 在 guvest (我爱你老婆Anna) 的大作中提到: 】
My two percent:
Abstract = lift up to superset
fruit is the abstraction of apple,orange,...
一般情况下的抽象是提出概念,或者说给结构命名。计算机编程领域的抽象我理解是
g
guvest
113 楼
yes. I meant a function that returns other functions.

【 在 TheMatrix (TheMatrix) 的大作中提到: 】
这也在范围内。
这是你所说的higher order function?
g
guvest
114 楼
我自己的代码里大量用你写的fp那种格式.
等于就是函数列表.

你最后那种语法是什么意思?in python就是:
fruit=['apple','orange']?

给list或者字典一个名字叫fruit?
这样也对。就是superset.

【 在 hci (海螺子) 的大作中提到: 】
用代码来描述比较清楚。
本来的数据,是两个字符串,“Apple", "Orange"
老板说,这两串其实有共性,他们都是"Fruit"。
OOP马公说,我知道该咋办:
class Fruit {
String name = "";
}
class Apple extends Fruit {
String name = "Apple";
}
...................
h
hci
115 楼
{:fruit "Apple"}是一个immutable hashmap,键是:fruit, 值是“Apple".

这是很FP的。这个hashmap本身也可以作函数:

(def a {:fruit "Apple"})

(a :fruit)会返回"Apple"

当然:fruit也可以作函数

(:fruit a)同样返回“Apple"

:fruit是Lisp里面的keyword。keyword always evaluates to itself.

(:fruit "Car")返回nil

从OOP角度,这个hashmap其实就是一个轻量级的对象。不过不是封装的,你可以随便给一个hashmap添加新键来产生一个新的hashmap。因为hashmap是immutable的,你可以把它随便传来传去,不怕被人改了。

【 在 guvest (我爱你老婆Anna) 的大作中提到: 】
我自己的代码里大量用你写的fp那种格式.
等于就是函数列表.
你最后那种语法是什么意思?in python就是:
fruit=['apple','orange']?
给list或者字典一个名字叫fruit?
这样也对。就是superset.
g
guvest
116 楼
哦。就是查表。不过我一般不喜欢用hash table
能用look up table我尽量用look up table
【 在 hci (海螺子) 的大作中提到: 】
{:fruit "Apple"}是一个immutable hashmap,键是:fruit, 值是“Apple".
这是很FP的。这个hashmap本身也可以作函数:
(def a {:fruit "Apple"})
(a :fruit)会返回"Apple"
当然:fruit也可以作函数
(:fruit a)同样返回“Apple"
:fruit是Lisp里面的keyword。keyword always evaluates to itself.
(:fruit "Car")返回nil
从OOP角度,这个hashmap其实就是一个轻量级的对象。不过不是封装的,你可以随便给
一个hashmap添加新键来产生一个新的hashmap。因为hashmap是immutable的,你可以把
...................
c
convergence
117 楼
immutable 只是让multi-threading变得简单点。

【 在 appoolloo (阿菠萝) 的大作中提到: 】
我不反对FP,但是不同意 immutable 反映客观世界的本质。没必要扯那么远。就事论
事比较好。
h
huster
118 楼
剑宗气宗的淡看来是扯不完了。
w
walkrandom
119 楼
大概是OOP里面的factory pattern。

class Fruit {

Map createOrange() {};
Map createApple() {};
}

【 在 hci (海螺子) 的大作中提到: 】
用代码来描述比较清楚。
本来的数据,是两个字符串,“Apple", "Orange"
老板说,这两串其实有共性,他们都可以抽象成"Fruit"。
OOP马公说,我知道该咋办:
class Fruit {
String name = "";
}
class Apple extends Fruit {
String name = "Apple";
}
...................