下图中的 self.pushlisher 为啥要作为参数穿进去, 直接用不好么?
提前感谢大佬.
1
Jooooooooo 2020-12-17 19:52:27 +08:00
面向对象我理解是针对某种实体定义行为的描述
举个例子, 对于一个订单, 下单后对这个订单得做一些操作, 不同类型的操作可能不一样 比如这个第三方的订单下单之后需要回调第三方接口, 某种做法是 if(订单来源 == A) { 回调 A 的接口; } else if (订单来源 == B){ 回调 B 的接口; } 而面向对象是都围绕这个对象干活, 写出来是这样的 订单.回调接口() 而对于不同来源订单来说这个回调方法不一样, 直接省去了上面还要判断类型再去回调的问题 |
2
chaleaoch OP |
3
Jooooooooo 2020-12-17 20:12:33 +08:00
@chaleaoch 没学过那个语言. 看不太懂. 我猜是 py
|
4
xupefei 2020-12-17 20:14:10 +08:00 via iPhone
这两个 publisher 不是同一个变量…
|
6
aloyuu 2020-12-17 20:16:46 +08:00
面向对象编程思想究竟是什么?
过程写着写着,就成了函数 函数写着写着,就成了对象 对象是函数的集合,说白了,就是函数的再次封装,有些特性提供了很大的便利,比如。。这个。。。那个。。。 |
7
haosamax 2020-12-17 20:34:48 +08:00 via iPhone
可以看下面向对象之父 Alan kay 的理解 面向对象意味着消息传递...
|
8
renmu123 2020-12-17 20:41:20 +08:00
这种设计的好处就是开源直接作为类函数使用,而不是强依赖该类的这个参数,设计这个的时候应该和面向对象没什么关系(
|
9
xuanbg 2020-12-17 20:57:56 +08:00
这个问题首先要从什么是对象说起。什么是对象?对象是对事物的抽象,具体就表现为:数据模型+能力。也就是用字段来描述和存储数据,组成数据模型,用方法来实现对象能力。
所以,面向对象编程,就是通过将事物抽象为对象,来实现数据和逻辑的封装的一种编程方式。是「封装」这一思想的一种具体实现。 |
10
f6x 2020-12-17 21:00:34 +08:00
一般遇到匪夷所思的写法, 可以看下 git/svn 的历史记录.
罗 shi 马 shan 不是一天写成的,必有原因. |
12
xuanbg 2020-12-17 21:06:38 +08:00 1
和面向对象不同的是更加古老的面向过程的编程方式。
在面向过程的编程方式中,数据和逻辑是割裂的。数据存在内存之中,就如同存储在一张表里面。你必须要先规划好内存的使用,然后才能管理数据。而逻辑呢,就是一个个函数,你输入数据,函数就返回处理的结果,或者输出到内存,或者输出到屏幕,或者输出到别的什么设备。这倒是和面向对象中的方法没什么不同。 两者的根本的不同点就在数据的管理方式。面向过程需要自己管理数据,而面向对象则把数据和方法绑在了一起。 |
14
nuistzhou 2020-12-17 21:06:49 +08:00
图片中这样把 class member 当参数传的好处是,一眼就可以看到方法 maybe_due()的 dependency,比如图片中的 publisher.
至于面向对象的编程思想,我资格不够,答不好。 |
15
Mohanson 2020-12-17 21:43:47 +08:00 via Android 1
erlang 之父如何评价面向对象:我想要一只香蕉,但你给了我一只拿着香蕉的猴子,还有它背后的整个森林。
|
16
aijam 2020-12-18 09:21:29 +08:00
maybe_due 还有其他地方调用呗,你瞅瞅
|
18
mrtrying 2020-12-18 09:47:44 +08:00
传参这事,能让这个方法更加通用,其他的地方也可以调用,如果外部没有调用写成私有方法直接用也可以吧!我是这么认为的
|
19
spbcu 2020-12-18 09:52:11 +08:00 1
maybe_due 应该不止 tick()里的这一个调用吧。tick()里传入 self.publisher,其他地方不一定是用 self.publisher,可能会传入其他 publisher 啊。
|
20
jswh 2020-12-18 10:11:52 +08:00
同意楼上
|
21
taowen 2020-12-18 11:28:35 +08:00
面向对象的目的是为了依赖倒置,依赖倒置就是 a 做为底层模块,被 b 和 c 所依赖。这样做的好处是 b 和 c 中的实现细节,a 是完全引用不到的。这样就可以避免写 a 的时候做过多的假设,导致代码纠缠在了一起。b 和 c 之间没有直接引用关系,b 的作者就可以不用知道 c 的作者在搞什么幺蛾子。这样大家的知识边界就清楚了。
面向对象实际上是利用运行时组装来实现依赖倒置。如果你有编译期组装的方案,也可以实现同样的依赖倒置的效果,不一定需要运行时组装。 |
22
raaaaaar 2020-12-18 12:37:10 +08:00 via Android
我的理解是封装,信息的隐蔽。
如果代码都是一些函数,每个函数做了什么事,这种方法效率并不是很高,为了模块化封装,最好是抽象出一个数据结构,然后对这个数据结构进行操作,对外就暴露这个数据结构和这些方法。 这就有点像面向过程和面向对象的思想,但是最终,其实还是那个思想,封装。 |
23
YUyu101 2020-12-18 15:17:40 +08:00
传不传参这个区别只是作者希望这函数纯不纯的问题吧,面向对象只是把函数和数据结构聚合在一起,把 eat(human,apple) 变成 human.eat(apple) ,原来的 eat 是纯函数随便用,现在默认隐含了 human 的属性,顺便也要给 human 这个数据结构加上一个类指针,让他随时可以找到自己名下有哪些方法可以用。
|