感谢 ChinaUnix 上 @supermegaboy 的讨论

中山野鬼 发布于 2012/10/24 13:59
阅读 787
收藏 5

在 bbs.chinaunix 上, http://bbs.chinaunix.net/thread-3776610-3-1.html 的 28楼, @supermegaboy 对我的一些言论给出了意见。

首先,非常感谢他的一些评论。其中绝大部分我都很赞同,对C的理解也很一直,也望chinaunix 上的朋友能多提意见。谢谢。不过我经常在OSC上,另原本想给对应网友发送消息,但注册了中山野鬼,一些行为需要有观察期,哈,时间不等。就在此隔空推送了。

针对chinaunix 上的朋友,还是重复一下,毕竟现在只是先把内容挤出来,不足,缺失,错误点还有很多,无论内容和观点,我都是欢迎及希望被提意见的。

@supermegaboy的言论我摘抄如下,有我展开讨论的地方我进行了补充:

初步看了一下那三篇节选,有写得好的地方,也有不好的地方,例如:


C语言,只是一个编程语言,对于工程师或程序员无非是个可选择的工具。是否选择,根据设计目标和任务以及执行团队的习惯、特长。
--------------------------------------------------------------------------------------------------------------------------------------------
这种理解是不错的


而工具,从此篇开始,新手始终要明确,C语言是用拿来用的,不是拿来研究的。
------------------------------------------------------------------------------------
但后面这句,又太极端了,不符合事实。(哈,这个我仍然要作为宣讲的目标,C始终当作用具而不要当作研究对象)


C语言虽然称为高级语言,那也只是相对汇编语言等早期的面向指令的语言。而C语言从语言的高级程度来谈,更应该定性为,面向计算机组成原理的语言。
------------------------------------------------------------------------------------------------------------------------------------------------------------------
这个语言的定位描述偏离得有点离谱,(哈,这个有待大家讨论和整理出更正确的描述,以上仅是我个人开发背景得结论,一个侧面而已,确实不全面)


因此,在数字计算机的世界,0一定是起点。位宽如此,地址也一样。计算机的惯例,我们对存储区域,每8个位,我们认为是同一个地址,
----------------------------------------------------------------------------------------------------------------------------------------------------
0不一定是起点,而一个字节的二进制宽度也不一定是8位。在起点问题上,应该强调选择0的合理性,而不是绝对性 ,(哈,关于这方面,无非是针对新人,强化一下0的概念,显然0并不是绝对的,但起篇讨论合理性,可能很多例子铺开,要称述的辅助信息太多)


32位系统,从硬件角度看,是能提供32位数据并发传输,计算,存储的系统。从OS角度看,最小指令为32位,逻辑寻址宽度为32位。
-----------------------------------------------------------------------------------------------------------------------------------------
这一句也有问题,CPU的字长,不是由“数据传输、计算、存储”等这些因素来定义的,而是根据内部寄存器的二进制宽度来定义的,例如8088,16位CPU,
但外部数据总线只有8位,后面描述的OS角度,也存在类似的问题。(哈,你说的是个事实,如同386DX还是真正32位一样,我的称述愿意是通常的多少位,会由很多信息来决定,并没有定式,数据和地址总线宽度,数据计算指令长度,内部寄存器等都可能辅助决策,很难通过某一个部分的宽度来描述系统,甚至包括OS是32位还是64位等的讨论)


C是面向模块和过程的,C++是面向对象的
-------------------------------------------------------
相信多数人都知道这句话存在什么问题。


C++就是C++,和C没有任何关系,只是历史原因导致不叫D,而叫C++。
----------------------------------------------------------------------------------
C++从C那里借鉴了几乎所有的语法及相当一部分原理,这不是“关系”是啥?(哈,全当借鉴关系,我说的是狭义关系,意思没有直接对应关系)


简单说,面向对象,看到的是个体之间的差异与关联。面向模块或面向过程,看到的是行为之间的差异和关联。
----------------------------------------------------------------------------------------------------------------------
这句应该赞扬一下

加载中
1
宏哥
宏哥

回复 @billzheng : 取决于你如何界定领域. 换个例子. 汽车悬挂, 如果设计一个汽车悬挂类, 有个成员, 叫做 避震弹簧, 那么奥迪的空气悬挂怎么办? 这种问题解决的办法, 首先是隔离, 而不是抽象.

把 数据 和 方法 揉成一团对象, 是危险的, 但不意味着,  必然出事.

软件设计, 功夫在诗外, 和面向对象, 毫无关系.

还有mysql 那个令人恶心的last_insert_id, 怎么个抽象法? 其他都不是如此操作.

无论你怎么设计类, 总有人打破你的抽象. 

让你的的代码要么不能重用,要么重用的地方,都得修改.

billzheng
billzheng
@zcfox It's up to you. I don't think this kind of conversation will benefit anyone, it's just wasting time.
zcfox
zcfox
回复 @billzheng : 那么就变成了,面向对象能不能 更好地 适应变化
billzheng
billzheng
回复 @zcfox : 或者任何设计都不能阻挡破坏者
zcfox
zcfox
回复 @billzheng : 难道这里说的不是设计是语言
billzheng
billzheng
回复 @zcfox : 任何语言都不能防备破坏者
下一页
0
宏哥
宏哥

感觉, 所谓对象, 无非就是 把数据 和 逻辑放在一个名字里面,叫做类

至于类之间的诸多关系, 讲白了, 就是代码拷贝的方法而已,本身就违反了DRY

至于模块化编程嘛, 一句话, 就是输入输出, 逻辑 和 数据本身就是分离的

殊途同归

无非就是  无关系 比 有关系 更加松耦合

对象之于模块, 是倒退, 是历史进步的一个短暂倒退

C++ 之于C , 是一种巨大的倒退, 幸好这种倒退还留了一个能够嵌入C代码的缺口

0
byhard
byhard
支持,越讨论越清晰,领教了。
0
billzheng
billzheng

引用来自“宏哥”的答案

感觉, 所谓对象, 无非就是 把数据 和 逻辑放在一个名字里面,叫做类

至于类之间的诸多关系, 讲白了, 就是代码拷贝的方法而已,本身就违反了DRY

至于模块化编程嘛, 一句话, 就是输入输出, 逻辑 和 数据本身就是分离的

殊途同归

无非就是  无关系 比 有关系 更加松耦合

对象之于模块, 是倒退, 是历史进步的一个短暂倒退

C++ 之于C , 是一种巨大的倒退, 幸好这种倒退还留了一个能够嵌入C代码的缺口

1. 对象是不包含逻辑的。

2. 类:就是抽象数据类型定义, 加上具有继承和多态.

0
宏哥
宏哥

引用来自“billzheng”的答案

引用来自“宏哥”的答案

感觉, 所谓对象, 无非就是 把数据 和 逻辑放在一个名字里面,叫做类

至于类之间的诸多关系, 讲白了, 就是代码拷贝的方法而已,本身就违反了DRY

至于模块化编程嘛, 一句话, 就是输入输出, 逻辑 和 数据本身就是分离的

殊途同归

无非就是  无关系 比 有关系 更加松耦合

对象之于模块, 是倒退, 是历史进步的一个短暂倒退

C++ 之于C , 是一种巨大的倒退, 幸好这种倒退还留了一个能够嵌入C代码的缺口

1. 对象是不包含逻辑的。

2. 类:就是抽象数据类型定义, 加上具有继承和多态.

1: 这个是描述不够准确. 对象应该是类的一个实例. 类是对象定义.

2: 集成就是代码拷贝, 至于多态吗, 我叫它 共用名字, 都算是 违反 清晰, 简单, 一致... 原则的设计, 要极力避免, 除非有足够的证据表明,是不可避免

0
billzheng
billzheng

引用来自“宏哥”的答案

引用来自“billzheng”的答案

引用来自“宏哥”的答案

感觉, 所谓对象, 无非就是 把数据 和 逻辑放在一个名字里面,叫做类

至于类之间的诸多关系, 讲白了, 就是代码拷贝的方法而已,本身就违反了DRY

至于模块化编程嘛, 一句话, 就是输入输出, 逻辑 和 数据本身就是分离的

殊途同归

无非就是  无关系 比 有关系 更加松耦合

对象之于模块, 是倒退, 是历史进步的一个短暂倒退

C++ 之于C , 是一种巨大的倒退, 幸好这种倒退还留了一个能够嵌入C代码的缺口

1. 对象是不包含逻辑的。

2. 类:就是抽象数据类型定义, 加上具有继承和多态.

1: 这个是描述不够准确. 对象应该是类的一个实例. 类是对象定义.

2: 集成就是代码拷贝, 至于多态吗, 我叫它 共用名字, 都算是 违反 清晰, 简单, 一致... 原则的设计, 要极力避免, 除非有足够的证据表明,是不可避免

继承就是代码拷贝? 非也, 继承是代码重用.

这个是我的理解:

http://my.oschina.net/u/659357/blog/84654


0
宏哥
宏哥

引用来自“billzheng”的答案

引用来自“宏哥”的答案

引用来自“billzheng”的答案

引用来自“宏哥”的答案

感觉, 所谓对象, 无非就是 把数据 和 逻辑放在一个名字里面,叫做类

至于类之间的诸多关系, 讲白了, 就是代码拷贝的方法而已,本身就违反了DRY

至于模块化编程嘛, 一句话, 就是输入输出, 逻辑 和 数据本身就是分离的

殊途同归

无非就是  无关系 比 有关系 更加松耦合

对象之于模块, 是倒退, 是历史进步的一个短暂倒退

C++ 之于C , 是一种巨大的倒退, 幸好这种倒退还留了一个能够嵌入C代码的缺口

1. 对象是不包含逻辑的。

2. 类:就是抽象数据类型定义, 加上具有继承和多态.

1: 这个是描述不够准确. 对象应该是类的一个实例. 类是对象定义.

2: 集成就是代码拷贝, 至于多态吗, 我叫它 共用名字, 都算是 违反 清晰, 简单, 一致... 原则的设计, 要极力避免, 除非有足够的证据表明,是不可避免

继承就是代码拷贝? 非也, 继承是代码重用.

这个是我的理解:

http://my.oschina.net/u/659357/blog/84654


这个 "重用" 和拷贝区别不大, 尽管实际是指针副本而已.  如果连"重用"都不需要, 直接用呢?

所以

我的方法更简单

只把 类 作为 名字, 作用域管理,相当于函数下划线前缀 + 方便的资源申请释放

 能够static 的就不public. 

知道越少越好, 能不用则不用


宏哥
宏哥
回复 @billzheng : static可以证明 c和C++是两种语言. 并且C的static可以实现任何 C++ 用1000种方法实现的"隐藏".
billzheng
billzheng
对C static可以多用但是对C++慎用
0
hanxh
hanxh

引用来自“宏哥”的答案

引用来自“billzheng”的答案

引用来自“宏哥”的答案

引用来自“billzheng”的答案

引用来自“宏哥”的答案

感觉, 所谓对象, 无非就是 把数据 和 逻辑放在一个名字里面,叫做类

至于类之间的诸多关系, 讲白了, 就是代码拷贝的方法而已,本身就违反了DRY

至于模块化编程嘛, 一句话, 就是输入输出, 逻辑 和 数据本身就是分离的

殊途同归

无非就是  无关系 比 有关系 更加松耦合

对象之于模块, 是倒退, 是历史进步的一个短暂倒退

C++ 之于C , 是一种巨大的倒退, 幸好这种倒退还留了一个能够嵌入C代码的缺口

1. 对象是不包含逻辑的。

2. 类:就是抽象数据类型定义, 加上具有继承和多态.

1: 这个是描述不够准确. 对象应该是类的一个实例. 类是对象定义.

2: 集成就是代码拷贝, 至于多态吗, 我叫它 共用名字, 都算是 违反 清晰, 简单, 一致... 原则的设计, 要极力避免, 除非有足够的证据表明,是不可避免

继承就是代码拷贝? 非也, 继承是代码重用.

这个是我的理解:

http://my.oschina.net/u/659357/blog/84654


这个 "重用" 和拷贝区别不大, 尽管实际是指针副本而已.  如果连"重用"都不需要, 直接用呢?

所以

我的方法更简单

只把 类 作为 名字, 作用域管理,相当于函数下划线前缀 + 方便的资源申请释放

 能够static 的就不public. 

知道越少越好, 能不用则不用


我也搀和一下吧。面向对象,其实我有个奇怪的说法,就是其实是面向“客观”。

“客观和对象”都是object.  是和面向“主观“相对应的。这个说法当然也是不是我的, 我无意中在哪个英文文献上看到了,找不到出处了。我觉得挺有道理。

人只有不能控制整个局面的时候才客观,比如gui,游戏。 而控制力极强,或者需要极强的控制的时候,都是主观的。比如某些需要特殊优化的地方。没发现么,游戏里面,其实需要特殊优化的地方也要面向过程的。面向客观是为了节省下来精力能集中去应对所必须仔细应对的主观。


hanxh
hanxh
回复 @billzheng : 因为“对象”这个词太俗了,什么是一个对象,什么时候引入对象没有定论。如果认为是“客观”就好一些,再说明点,如果认为自己控制力度差,或者不需要严格控制的东西,就建个对象。 需要严格控制的东西体现为“对象”之间的关系。我一直以来就这么干的,对象当成一个垃圾车。
billzheng
billzheng
这个理解有什么大的帮助?
宏哥
宏哥
太抽象了,我居然没有看懂
0
hanxh
hanxh
回复 @宏哥 : 呵呵我这个说法是有点二,而且对解决没太大实际意义,就是聊天有用。闲扯一下,“对象”和“客观”有很大的相似性。人能客观的时候肯定是对客体的控制力差的时候。控制力越差就越能感觉到”对象“的存在,因此才会"客观"起来。比如你很少能有意识的感觉自己的手存在。很少感觉到自己老婆存在(当前长期不在还是有感觉的..)。对老婆态度很容易主观。 我这纯属闲着没事瞎想+遐想的。有些时候有些看起来不相关的东西叫一个词是不是有深刻含义呢,因为创立语言的人通常是真的大牛。
0
hanxh
hanxh

@billzheng

我觉得是不ddd这种东西就是引入对象的准则。首先划分你要处理的业务范围,也就是domain,然后这里面的元素和关系会形成。这样建立的对象稳定。

只不过domain这种东西的划分需要很耗时间,很专业。我一直以来没做到过,至少没有一上来就做到过。所以造成我把对象当成垃圾车,因为我没法recognize哪些是”稳定的“对象

宏哥
宏哥
回复 @billzheng : 单独的类,耦合了数据 和 逻辑, 前提是,这个数据和这个逻辑, 有必然"耦合"关系. 最简单可靠的关系, 就是输入输出
billzheng
billzheng
回复 @宏哥 : hmm,类就是为了隐藏数据。专注,单独的类没有增加耦合.
宏哥
宏哥
回复 @billzheng : 所以我的结论也很清楚, 对象并没有在解决"数据隐藏" 上带来更好的方法, 只是让各种 耦合,拷贝更容易而已, 而耦合,拷贝则是需要避免的.
billzheng
billzheng
@宏哥 我不认为这是C或C++的问题。C软件设计也要讲究软件复杂度控制和数据隐藏,如我的博客所写的
宏哥
宏哥
回复 @billzheng : 我的看法正好相反. 类的设计, 解决不了任何实际问题. Domain, Function才是解决问题之本.
下一页
返回顶部
顶部