V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
soulmine
V2EX  ›  程序员

什么才叫面向对象呢

  •  1
     
  •   soulmine · 2016-08-28 17:18:18 +08:00 · 8499 次点击
    这是一个创建于 3038 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我现在写 class 写着写着就感觉只是把原来的代码分了几个步骤出来 感觉还是面向过程啊 迷惑 ing
    还有 class 里面循环感觉很麻烦 yield 感觉理解不了含义....
    62 条回复    2019-09-01 14:19:10 +08:00
    Cbdy
        1
    Cbdy  
       2016-08-28 17:20:41 +08:00 via Android
    封装、继承、多态
    pynix
        2
    pynix  
       2016-08-28 17:26:15 +08:00
    面对你女朋友。。
    daemonghost
        3
    daemonghost  
       2016-08-28 17:30:51 +08:00
    找个对象,面对着 ta 编程
    lianghudou
        4
    lianghudou  
       2016-08-28 17:35:18 +08:00
    这需要慢慢理解,可能需要几年以后,才会发现它的方便之处
    lianghudou
        5
    lianghudou  
       2016-08-28 17:37:02 +08:00
    所以面向对象也是有争议的,很多人坚持认为,它带来的麻烦比方便多。
    总之,类带来的方便没有函数那样立竿见影。
    clino
        6
    clino  
       2016-08-28 17:46:34 +08:00   ❤️ 1
    我觉得主要还是有内聚性的数据和方法合并在一起作为对象来用会比较方便,继承多态什么的是为了代码重用才产生的
    至于楼主的问题感觉和面向对象好像关系不太大的样子
    liqingcan
        7
    liqingcan  
       2016-08-28 17:50:43 +08:00
    找个对象你就知道什么叫做面向对象了
    liqingcan
        8
    liqingcan  
       2016-08-28 17:50:58 +08:00
    其实我是开玩笑的,逃~
    levn
        9
    levn  
       2016-08-28 17:52:13 +08:00 via iPad
    没错,面向对象就是拆分和管理过程。所以对象携带了状态。
    caola
        10
    caola  
       2016-08-28 18:02:14 +08:00   ❤️ 2

    这样才是真正的面向对象,
    什么?没有对象?
    不知道 new 一个吗?
    wizardoz
        11
    wizardoz  
       2016-08-28 18:38:55 +08:00
    @caola 有这样的对象你也只来一个 hello world 吗?
    buckyRRRR
        12
    buckyRRRR  
       2016-08-28 19:00:42 +08:00 via iPhone   ❤️ 4
    面向对象,函数,这些都只是抽象的方法,没什么特别的,什么封装,继承,多态本来是很简单的概念,我只能说大多数程序员的表达能力太差,程序里的好多概念都很简单,都是本这群人给搅浑了,好多程序员喜欢写博客,写教程,写作是很容易的事情吗,只会创造垃圾去误导别人
    em70
        13
    em70  
       2016-08-28 19:19:49 +08:00
    这个东西没有语言可以很好的解释,我记得我是大二暑假的一个晚上看书突然顿悟的
    rogwan
        14
    rogwan  
       2016-08-28 19:28:28 +08:00   ❤️ 3
    我要说这真是中文的悲哀!因为 IT 科技是美国起源,所以最早的技术定义、资料都是源自英语语境,到后来传入中国的时候,我们必须要沿用这些概念的定义,汉语只好尽量去翻译这些专业术语,但始终无法让学习者快速领悟其内涵。

    object-oriented , Class 这些概念对美国的孩子来说,要容易理解的多!让中国的学生在英语环境之外理解翻译过来的“面向对象”,“类”真的在开始不是一个容易的事情。

    吐个槽而已,也没什么好办法。
    soland
        15
    soland  
       2016-08-28 19:49:39 +08:00   ❤️ 1
    翻译的问题,有些地方的翻译是“对象导向”,觉得更好理解一些。

    就是什么问题都看成由一个对象完成的,设计就由对象来导向。
    21grams
        16
    21grams  
       2016-08-28 19:59:41 +08:00 via Android
    要面向接口,不要面向对象
    kevinzhow
        17
    kevinzhow  
       2016-08-28 20:10:41 +08:00 via Android
    编程的时候对面坐着你对象
    WalkingEraser
        18
    WalkingEraser  
       2016-08-28 20:20:10 +08:00 via Android
    可维护、可扩展、可复用,能理解这个就能明白为什么面向对象设计会出现。面向对象是设计思想,不是代码模板。
    lianghudou
        19
    lianghudou  
       2016-08-28 20:25:39 +08:00
    @WalkingEraser “可维护、可扩展、可复用”就像 XX 主义优越性一样假大空。说的就跟不面向对象就不可维护、不可扩展、不可复用似的。
    buckyRRRR
        20
    buckyRRRR  
       2016-08-28 20:28:51 +08:00 via iPhone
    @lianghudou 无脑复制粘贴的人太多
    q397064399
        21
    q397064399  
       2016-08-28 20:44:21 +08:00
    无论是面向对象还是面向过程,所有的编程语言提出的各种思想,
    其目的在于减少代码的重复性,提高代码的重用性,这并没有错,
    类似于面向过程的语言,想想你用 C 自己写一个优先队列试试,
    估计要拷贝一大堆写好的代码,还要考虑类型之类的问题,搞不好还容易出错,
    java 里面 PriorityQueue 就搞定了
    就像 ArrayList LinkedList 虽然你不知道底层实现,但是并不妨碍他们实现了 List 接口,这样 like a 就是复用的思想
    @lianghudou
    @buckyRRRR
    Fleey
        22
    Fleey  
       2016-08-28 21:40:38 +08:00
    尽管我很喜欢面向过程,并不喜欢面向对象。但是我写 java 只能写面向对象...因为我 java 没学过面向过程的
    Spike
        23
    Spike  
       2016-08-28 21:49:45 +08:00 via Android
    首先对象是抽象数据结构。
    假设要建一座房子,我们最初只有树,泥巴在,草这些最原始的材料(基本数据结构 int,bool...),第一个小茅屋勉强造出来了。
    在造第一间房子的时候,掌握了用这些原始材料加工顺序,以后每次我们用这个顺序,就能顺利造出一座一样的房子。
    第一个茅屋太破了,老是漏雨,要加固屋顶,然后我们要加入新的材料,改变加工顺序。可是这个顺序和原来有差异,总是会不小心搞错某些部分。
    我们发现,虽然升级版和
    hinate
        24
    hinate  
       2016-08-28 22:32:08 +08:00
    @kevinzhow 所以你就教你女票编程了
    WalkingEraser
        25
    WalkingEraser  
       2016-08-28 22:40:02 +08:00
    @lianghudou @buckyRRRR
    Exo me ???我不知道是我表达能力有问题,还是搞技术的喜欢找人扯皮。是否假大空可以用六大设计原则衡量。我也不知道我哪里表露出来面向对象是银弹、无脑复制粘贴了? Unix 和 Linus 都用面向过程的 C 实现了可维护、可扩展和可复用,我不说就是我只知道面向对象的 Java 、 C++??。本人现在工作主语言是函数式的,做出来的东西遵循设计原则,也可以做到可维护、扩展和复用。面向对象就跟图灵机模型一样,符合人类思维习惯,落实到编程语言,可以在语言层面做到封装、接口与实现的约束、分离和分发,由编译器帮人完成这些事情,减少程序员工作量。一根筋的菜鸡盲目信以为教条、处处使用导致的恶心场面就是面向对象的锅吗?各种设计思想都是基于其使用背景提出来的,有其适用的场景。我真的是不明白喷点何在?
    yehon
        26
    yehon  
       2016-08-28 23:04:23 +08:00
    前提是,你得先有个对象。^_^
    buckyRRRR
        27
    buckyRRRR  
       2016-08-28 23:11:40 +08:00 via iPhone
    @WalkingEraser 喷点就是你在自说自话,大多数人即使自身的技术好。也很难成为一个好老师,写东西说话从来不考虑自己的受众,打那么多字有意义吗,如果都这样,大家都去看书就好了,要老师干什么
    snnn
        28
    snnn  
       2016-08-28 23:12:41 +08:00 via Android
    封装、继承、多态
    nozama
        29
    nozama  
       2016-08-28 23:25:54 +08:00
    我看到周围很多人脑袋里没有‘多态’的概念,说到封装,就写一个巨无霸的 class ,各种 switch ;需要一个依赖,不假思索变成单例,然后心中暗喜“我对设计模式已经运用自如了”。
    但是, So what ?别人依然活得好好的...

    老实说,关于 OOP ,有时我会怀疑自己深信不疑的那一套,是不是真的正确...
    hpeng
        30
    hpeng  
       2016-08-28 23:34:14 +08:00 via iPhone
    等你用到的时候会恍然大悟的,原来这么写可以少复制粘贴这么多,然后就会变成,好无聊,照着这个结构写好无聊。
    Spike
        31
    Spike  
       2016-08-28 23:34:54 +08:00
    @Spike 虽然升级版和原来的工序有些不一样, 但是造门要用木材, 造墙也要用木材, 就把木材的加工方法记录下来。这个高级的木材就是对象。
    如果说木材是对树木的加工做制成, `对象`就是我们对数据类型的自定义。而`类`则是制造木材的工序, 是定义这种数据类型的**模板**。所以 OOP 的过程就是不断定义抽象类型的过程。
    如果你的大部分的类并不是由这样的定义抽象数据类型的类所组成, 那么那只是套了一个 class 的壳。灵魂还是过程式的。
    fiht
        32
    fiht  
       2016-08-28 23:54:55 +08:00
    发表一下我不成熟的观点:
    面向对象是哲学家用来描述这个世界的一种方式,所有的东西都属于一个类,都有自己的属性(方法)
    一个最最最合适的例子,就是游戏中的机器人。
    每个机器人都是继承自某个父类(实现某个接口)然后重写一些自己的方法。(不知道游戏编程是不是这样子写的)
    要是有面向对象的东西不明白的时候我就想想如果我编写游戏中的 robot 的时候会怎么写。然后就慢慢明白了。
    majik
        33
    majik  
       2016-08-29 00:07:23 +08:00 via iPhone
    所有健康的代码都应该是树状结构,那么这些代码本质都是面向过程的。 oo 的处理方式和模块的分装本无差别,只能说是一种更易用的复杂封装方式。
    我自己在用的时候只有在大概念上会用到类,一因为这是整个程序的基础概念,复用和更改的频率都会比较高,这部分使用 oo 比较便捷,其他辅助部分用函数式一并解决。我觉得把类的数量精简到刚好能描述整个程序最佳,没事想想剃刀原理对写程序帮助挺大。
    8023
        34
    8023  
       2016-08-29 00:52:11 +08:00
    我现在还没太明白面向对象到底是啥, 所谓的类就感觉是一个比较 6 的结构体.
    但并不影响我写什么...
    对我来说, 变化的:
    面向过程: 实现一个功能先想算法
    面向对象: 实现一个功能先查类库
    WalkingEraser
        35
    WalkingEraser  
       2016-08-29 01:09:49 +08:00
    @buckyRRRR 清新脱俗的喷点,你开心就好
    hrong
        36
    hrong  
       2016-08-29 01:19:11 +08:00 via Android
    @lianghudou 你除了喷还会点什么。干点正事
    lianghudou
        37
    lianghudou  
       2016-08-29 01:22:21 +08:00
    @hrong 喷子你好,喷子再见
    williamx
        38
    williamx  
       2016-08-29 05:44:08 +08:00
    @21grams 突然想想好邪恶
    kran
        39
    kran  
       2016-08-29 08:08:25 +08:00 via Android
    linux40
        40
    linux40  
       2016-08-29 08:15:47 +08:00 via Android
    @majik 不可能的,除非比较简单, java 不是都有接口吗。
    jinhan13789991
        41
    jinhan13789991  
       2016-08-29 08:32:17 +08:00
    《 think in java 》里有一章对象导论。时间万物皆对象,太极生两亿,两亿皆对象
    Ixizi
        42
    Ixizi  
       2016-08-29 09:01:59 +08:00
    什么又是结队编程呢
    kideny
        43
    kideny  
       2016-08-29 09:15:53 +08:00
    没结婚以前叫对象,很多人已经从面向对象过度到面向老婆了。
    jint
        44
    jint  
       2016-08-29 09:21:13 +08:00
    结对编程,对是 pair 不是 team 。
    fengmenggaokao
        45
    fengmenggaokao  
       2016-08-29 09:27:36 +08:00
    1 、觉得自己还是面向过程编程的时候最直接的原因是自己懒。没去思考,没去想如何保持代码优雅的可伸缩性。工作过程更多的可能是问题解决就完事了
    2 、 oo 强调把所有功能或者特性相似的方法或者变量封装为一个对象,简而言之就是自己打造一把针对某方面问题的万能钥匙
    3 、实际 oo 开发初期会比面向过程初期耗费很多时间,但是后期的维护时间会大大减小
    fengmenggaokao
        46
    fengmenggaokao  
       2016-08-29 09:29:28 +08:00
    oo 设计的好坏直接取决于编码者对现实事物的抽象能力。也就是逻辑思考,建立模型这些。所以你看见大多数面试都会有逻辑题
    zjqzxc
        47
    zjqzxc  
       2016-08-29 09:37:21 +08:00
    楼主别急,大二的时候跟一个同学讨论了一晚上(超过 4 小时)的面向对象,然而讨论完了还没觉得怎么样;
    后来工作后开始大量写代码,用不了俩月就能理解面向对象了;

    从面向过程到面向对象,有点自然演化的意思;代码量大了 /复杂了,面向过程吃不消了,自然会转向面向对象的;
    xieyudi1990
        48
    xieyudi1990  
       2016-08-29 09:45:22 +08:00 via Android
    当初面试时我直接一句话 ”面向对象没有存在的必要“。然后就没下文了。
    程序员就喜欢搞些没鸟用的东西,所以我不当程序员了。
    zhangyi2099
        49
    zhangyi2099  
       2016-08-29 09:46:07 +08:00 via iPhone
    现在的 swift 是不是推面向协议编程? struct , enum ,反而 class 用的少
    littleshy
        50
    littleshy  
       2016-08-29 10:03:13 +08:00
    @soland 台湾叫“物件导向”,作为闽南人,我觉得很容易理解。😃
    SilentDepth
        51
    SilentDepth  
       2016-08-29 10:57:08 +08:00
    业务逻辑复杂度上去了,面向过程吃不消了,就会想办法改进,于是就有面向对象了。过程会有很多,对象(的类型)却不一定很多,于是把逻辑编写的重心(或者说视角)放到对象上,整个过程就清晰或者整齐多了。试试抽象出来两种思想下编写代码的过程做下对比看看?
    andypinet
        52
    andypinet  
       2016-08-29 13:14:28 +08:00
    首先要有对象 坐的时候面朝对象编程 不论男女
    kamikat
        53
    kamikat  
       2016-08-29 13:57:11 +08:00
    看了上面的评论感觉自己曾经理解过什么是面向对象。
    ericls
        54
    ericls  
       2016-08-29 13:58:05 +08:00
    函数默认带一个参数 这个参数包含了状态和很多的不确定性
    kepenj
        55
    kepenj  
       2016-08-29 14:20:19 +08:00
    这是在引战
    qa2080639
        56
    qa2080639  
       2016-08-29 14:29:48 +08:00
    万物皆对象
    megatron
        57
    megatron  
       2016-08-29 16:02:19 +08:00
    1-先不要钻牛角尖儿,那些抽象的“名词”(范畴),容易让人失去对全局的把握。
    2-太原理工大学公开课 面向对象编程思想概览
    engHacker
        58
    engHacker  
       2016-08-29 22:49:17 +08:00
    台湾地区用的是“物件导向”吧。
    16500682
        59
    16500682  
       2016-08-30 16:08:51 +08:00
    首先你要有一个女票
    Xinghx
        60
    Xinghx  
       2016-08-30 21:39:29 +08:00
    面向妹子编程
    Balthild
        61
    Balthild  
       2016-08-31 14:51:50 +08:00 via Android
    首先 object 翻译成「对象」就让人有些摸不着头脑了……
    liushuishui
        62
    liushuishui  
       2019-09-01 14:19:10 +08:00
    @williamx 你不说我还不那么想,你一说我就。。。哈哈哈
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2889 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 12:40 · PVG 20:40 · LAX 04:40 · JFK 07:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.