V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
chaleaoch
V2EX  ›  程序员

我又来了...面向对象编程思想究竟是什么?

  •  1
     
  •   chaleaoch · 2020-12-17 19:44:12 +08:00 · 3109 次点击
    这是一个创建于 1440 天前的主题,其中的信息可能已经有所发展或是发生改变。

    下图中的 self.pushlisher 为啥要作为参数穿进去, 直接用不好么?

    image

    提前感谢大佬.

    23 条回复    2020-12-18 15:17:40 +08:00
    Jooooooooo
        1
    Jooooooooo  
       2020-12-17 19:52:27 +08:00
    面向对象我理解是针对某种实体定义行为的描述

    举个例子, 对于一个订单, 下单后对这个订单得做一些操作, 不同类型的操作可能不一样

    比如这个第三方的订单下单之后需要回调第三方接口, 某种做法是

    if(订单来源 == A) {
    回调 A 的接口;
    } else if (订单来源 == B){
    回调 B 的接口;
    }

    而面向对象是都围绕这个对象干活, 写出来是这样的

    订单.回调接口()

    而对于不同来源订单来说这个回调方法不一样, 直接省去了上面还要判断类型再去回调的问题
    chaleaoch
        2
    chaleaoch  
    OP
       2020-12-17 20:11:35 +08:00
    @Jooooooooo 大佬没看图说话, 只看标题了. 谢谢大佬.

    大佬在根据图给讲讲.
    Jooooooooo
        3
    Jooooooooo  
       2020-12-17 20:12:33 +08:00
    @chaleaoch 没学过那个语言. 看不太懂. 我猜是 py
    xupefei
        4
    xupefei  
       2020-12-17 20:14:10 +08:00 via iPhone
    这两个 publisher 不是同一个变量…
    xupefei
        5
    xupefei  
       2020-12-17 20:15:25 +08:00 via iPhone
    @xupefei 哦看错了,使用一个。

    可能原作者想要把第一个函数写成 static 吧
    aloyuu
        6
    aloyuu  
       2020-12-17 20:16:46 +08:00
    面向对象编程思想究竟是什么?


    过程写着写着,就成了函数


    函数写着写着,就成了对象


    对象是函数的集合,说白了,就是函数的再次封装,有些特性提供了很大的便利,比如。。这个。。。那个。。。
    haosamax
        7
    haosamax  
       2020-12-17 20:34:48 +08:00 via iPhone
    可以看下面向对象之父 Alan kay 的理解 面向对象意味着消息传递...
    renmu123
        8
    renmu123  
       2020-12-17 20:41:20 +08:00
    这种设计的好处就是开源直接作为类函数使用,而不是强依赖该类的这个参数,设计这个的时候应该和面向对象没什么关系(
    xuanbg
        9
    xuanbg  
       2020-12-17 20:57:56 +08:00
    这个问题首先要从什么是对象说起。什么是对象?对象是对事物的抽象,具体就表现为:数据模型+能力。也就是用字段来描述和存储数据,组成数据模型,用方法来实现对象能力。

    所以,面向对象编程,就是通过将事物抽象为对象,来实现数据和逻辑的封装的一种编程方式。是「封装」这一思想的一种具体实现。
    f6x
        10
    f6x  
       2020-12-17 21:00:34 +08:00
    一般遇到匪夷所思的写法, 可以看下 git/svn 的历史记录.
    罗 shi 马 shan 不是一天写成的,必有原因.
    wellsc
        11
    wellsc  
       2020-12-17 21:02:38 +08:00
    @haosamax 这不是 armstrong 说的话吗?
    xuanbg
        12
    xuanbg  
       2020-12-17 21:06:38 +08:00   ❤️ 1
    和面向对象不同的是更加古老的面向过程的编程方式。

    在面向过程的编程方式中,数据和逻辑是割裂的。数据存在内存之中,就如同存储在一张表里面。你必须要先规划好内存的使用,然后才能管理数据。而逻辑呢,就是一个个函数,你输入数据,函数就返回处理的结果,或者输出到内存,或者输出到屏幕,或者输出到别的什么设备。这倒是和面向对象中的方法没什么不同。

    两者的根本的不同点就在数据的管理方式。面向过程需要自己管理数据,而面向对象则把数据和方法绑在了一起。
    haosamax
        13
    haosamax  
       2020-12-17 21:06:49 +08:00 via iPhone
    @wellsc 不是吧,难道我记错了
    nuistzhou
        14
    nuistzhou  
       2020-12-17 21:06:49 +08:00
    图片中这样把 class member 当参数传的好处是,一眼就可以看到方法 maybe_due()的 dependency,比如图片中的 publisher.
    至于面向对象的编程思想,我资格不够,答不好。
    Mohanson
        15
    Mohanson  
       2020-12-17 21:43:47 +08:00 via Android   ❤️ 1
    erlang 之父如何评价面向对象:我想要一只香蕉,但你给了我一只拿着香蕉的猴子,还有它背后的整个森林。
    aijam
        16
    aijam  
       2020-12-18 09:21:29 +08:00
    maybe_due 还有其他地方调用呗,你瞅瞅
    chaleaoch
        17
    chaleaoch  
    OP
       2020-12-18 09:22:01 +08:00
    @renmu123 谢谢这就是开源项目.我也不敢把公司项目贴图上来啊.
    celery 源码
    mrtrying
        18
    mrtrying  
       2020-12-18 09:47:44 +08:00
    传参这事,能让这个方法更加通用,其他的地方也可以调用,如果外部没有调用写成私有方法直接用也可以吧!我是这么认为的
    spbcu
        19
    spbcu  
       2020-12-18 09:52:11 +08:00   ❤️ 1
    maybe_due 应该不止 tick()里的这一个调用吧。tick()里传入 self.publisher,其他地方不一定是用 self.publisher,可能会传入其他 publisher 啊。
    jswh
        20
    jswh  
       2020-12-18 10:11:52 +08:00
    同意楼上
    taowen
        21
    taowen  
       2020-12-18 11:28:35 +08:00
    面向对象的目的是为了依赖倒置,依赖倒置就是 a 做为底层模块,被 b 和 c 所依赖。这样做的好处是 b 和 c 中的实现细节,a 是完全引用不到的。这样就可以避免写 a 的时候做过多的假设,导致代码纠缠在了一起。b 和 c 之间没有直接引用关系,b 的作者就可以不用知道 c 的作者在搞什么幺蛾子。这样大家的知识边界就清楚了。

    面向对象实际上是利用运行时组装来实现依赖倒置。如果你有编译期组装的方案,也可以实现同样的依赖倒置的效果,不一定需要运行时组装。
    raaaaaar
        22
    raaaaaar  
       2020-12-18 12:37:10 +08:00 via Android
    我的理解是封装,信息的隐蔽。

    如果代码都是一些函数,每个函数做了什么事,这种方法效率并不是很高,为了模块化封装,最好是抽象出一个数据结构,然后对这个数据结构进行操作,对外就暴露这个数据结构和这些方法。

    这就有点像面向过程和面向对象的思想,但是最终,其实还是那个思想,封装。
    YUyu101
        23
    YUyu101  
       2020-12-18 15:17:40 +08:00
    传不传参这个区别只是作者希望这函数纯不纯的问题吧,面向对象只是把函数和数据结构聚合在一起,把 eat(human,apple) 变成 human.eat(apple) ,原来的 eat 是纯函数随便用,现在默认隐含了 human 的属性,顺便也要给 human 这个数据结构加上一个类指针,让他随时可以找到自己名下有哪些方法可以用。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1885 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 00:00 · PVG 08:00 · LAX 16:00 · JFK 19:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.