什么才叫面向对象呢

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

老实说,关于 OOP ,有时我会怀疑自己深信不疑的那一套,是不是真的正确...
hpeng
2016-08-28 23:34:14 +08:00
等你用到的时候会恍然大悟的,原来这么写可以少复制粘贴这么多,然后就会变成,好无聊,照着这个结构写好无聊。
Spike
2016-08-28 23:34:54 +08:00
@Spike 虽然升级版和原来的工序有些不一样, 但是造门要用木材, 造墙也要用木材, 就把木材的加工方法记录下来。这个高级的木材就是对象。
如果说木材是对树木的加工做制成, `对象`就是我们对数据类型的自定义。而`类`则是制造木材的工序, 是定义这种数据类型的**模板**。所以 OOP 的过程就是不断定义抽象类型的过程。
如果你的大部分的类并不是由这样的定义抽象数据类型的类所组成, 那么那只是套了一个 class 的壳。灵魂还是过程式的。
fiht
2016-08-28 23:54:55 +08:00
发表一下我不成熟的观点:
面向对象是哲学家用来描述这个世界的一种方式,所有的东西都属于一个类,都有自己的属性(方法)
一个最最最合适的例子,就是游戏中的机器人。
每个机器人都是继承自某个父类(实现某个接口)然后重写一些自己的方法。(不知道游戏编程是不是这样子写的)
要是有面向对象的东西不明白的时候我就想想如果我编写游戏中的 robot 的时候会怎么写。然后就慢慢明白了。
majik
2016-08-29 00:07:23 +08:00
所有健康的代码都应该是树状结构,那么这些代码本质都是面向过程的。 oo 的处理方式和模块的分装本无差别,只能说是一种更易用的复杂封装方式。
我自己在用的时候只有在大概念上会用到类,一因为这是整个程序的基础概念,复用和更改的频率都会比较高,这部分使用 oo 比较便捷,其他辅助部分用函数式一并解决。我觉得把类的数量精简到刚好能描述整个程序最佳,没事想想剃刀原理对写程序帮助挺大。
8023
2016-08-29 00:52:11 +08:00
我现在还没太明白面向对象到底是啥, 所谓的类就感觉是一个比较 6 的结构体.
但并不影响我写什么...
对我来说, 变化的:
面向过程: 实现一个功能先想算法
面向对象: 实现一个功能先查类库
WalkingEraser
2016-08-29 01:09:49 +08:00
@buckyRRRR 清新脱俗的喷点,你开心就好
hrong
2016-08-29 01:19:11 +08:00
@lianghudou 你除了喷还会点什么。干点正事
lianghudou
2016-08-29 01:22:21 +08:00
@hrong 喷子你好,喷子再见
williamx
2016-08-29 05:44:08 +08:00
@21grams 突然想想好邪恶
kran
2016-08-29 08:08:25 +08:00
linux40
2016-08-29 08:15:47 +08:00
@majik 不可能的,除非比较简单, java 不是都有接口吗。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/302284

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX