免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: Ager
打印 上一主题 下一主题

[C] 学生为什么搞不懂C语言?不论是对于老师还是学生自己,这通常是一个谜 [复制链接]

论坛徽章:
0
41 [报告]
发表于 2012-12-08 12:44 |只看该作者
本帖最后由 ___BlueGuy___ 于 2012-12-08 12:46 编辑
shan_ghost 发表于 2012-12-08 12:05
至于UML,你知道有这样一种玩法吗:
我见过不少这种项目。比如一个做了两年半还没完成,据说耗资有5000多万。而且其中部分“疑难”模块还是外包给hw的……
后来偶在另一家公司,和另外两个同事用了大概一周时间就完成了那个5000万做不到的东西(嗯嗯,业务核心部分,我们三个都不会搞美工,所以界面是个白板)。


不知道你们三做的那个业务核心部分值不值个 5万

论坛徽章:
30
摩羯座
日期:2013-12-23 17:28:38牛市纪念徽章
日期:2015-07-13 11:35:582022北京冬奥会纪念版徽章
日期:2015-08-07 17:10:57青铜圣斗士
日期:2015-11-27 17:45:3815-16赛季CBA联赛之天津
日期:2016-02-15 13:44:3615-16赛季CBA联赛之江苏
日期:2018-05-02 16:56:2715-16赛季CBA联赛之辽宁
日期:2018-08-08 13:41:1015-16赛季CBA联赛之深圳
日期:2018-10-02 18:05:0315-16赛季CBA联赛之天津
日期:2019-05-31 15:05:0615-16赛季CBA联赛之北京
日期:2022-06-30 13:34:1115-16赛季CBA联赛之同曦
日期:2022-07-06 19:33:5415-16赛季CBA联赛之吉林
日期:2022-12-28 14:16:22
42 [报告]
发表于 2012-12-08 13:11 |只看该作者
学以致用已经过时了,用以致学才是这个时代的主题,需求产生学习,才会有追根和求正

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
43 [报告]
发表于 2012-12-08 14:37 |只看该作者
嗯,A兄: 很好!

论坛徽章:
0
44 [报告]
发表于 2012-12-10 08:32 |只看该作者
本帖最后由 darrenlee3 于 2012-12-10 08:40 编辑
shan_ghost 发表于 2012-12-08 12:07
OO的重要目标之一是:代替文档,让行家一看就知道做什么。

所以,没有文档就看不懂的OO代码,八成就 ...


sun的jdk doc 白写了,你真NB
没文档,你直接把eclipse的源代码分析一遍试试

面向对象不是为了替代文档(你这结论从哪来的?),面向对象、面向接口,面向×××编程的主要目的是为了decoupling,从而进行复用

论坛徽章:
0
45 [报告]
发表于 2012-12-10 08:44 |只看该作者
shan_ghost 发表于 2012-12-08 12:07
OO的重要目标之一是:代替文档,让行家一看就知道做什么。

所以,没有文档就看不懂的OO代码,八成就 ...


再不,你去把OSGi的包下来,别看specs,你就对着包里接口编程,我看你怎么写代码

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
46 [报告]
发表于 2012-12-10 14:13 |只看该作者
本帖最后由 shan_ghost 于 2012-12-10 14:16 编辑

http://zh.wikipedia.org/wiki/%E5%B0%81%E8%A3%9D_(%E7%89%A9%E4%BB%B6%E5%B0%8E%E5%90%91%E7%A8%8B%E5%BC%8F%E8%A8%AD%E8%A8%8

在物件導向程式設計方法中,封裝(英语:Encapsulation)是指,一種將抽象性函式介面的實作細節部份包裝、隱藏起來的方法。同時,它也是一種防止外界呼叫端,去存取物件內部實作細節的手段,這個手段是由程式語言本身來提供的。這兩個概念有一些不同,但通常被混合使用。封裝被視為是物件導向的四項原則之一。
適當的封裝,可以將物件使用介面的程式實作部份隱藏起來,不讓使用者看到,同時確保使用者無法任意更改物件內部的重要資料。它可以讓程式碼更容易理解與維護,也加強了程式碼的安全性。


另,面向对象的设计并不一定需要直接支持面向对象的语言才能实现。只是后者可以显式的把自己的设计思想、模块划分等等表达出来——也正因此,java才可以做到“直接由程序注释生成文档”。这就是著名的javadoc技术。

当然,即便是面向过程的C,read the fucking code也不是什么难的不得了的事。只是同样精良的设计,设计者利用面向对象可以更清晰、有效的表达自己的设计意图而已。

比如,从第一次接触ncurse到写出一个类bios界面就花了我差不多一周时间。
(当然,这更主要是因为它的抽象方法和设计思想都太老了,远不如后期的MVC架构清晰,以至于即便有文档也极其难用。)

而从第一次接触GTK到用它写出一个钻石迷城小游戏,则只用了我三天时间——期间仅花了半天时间通过读概述搞清了它的设计思路和预期的使用方式,之后全都是根据继承关系和公开接口猜用法,基本一猜一个准,极少需要去RTFC……

GTK还只是一个用C实现的面向对象库,它还不可能有其他面向对象语言在语法上的明确提示。但,即使是这样的代码,借助于里面的一些约定,仍然可以把设计思路、预期用法给清晰直观的表达出来。

——这两个是在一个月内连续学习的。目标是为了找出更好的技术方案。所以不存在使用者本人技术水平差异问题。

显然,两者相比,后者带来的生产力提升是明显的。


——————————————————————————
另一方面,当读者技术水平不到时,他甚至可能不会理解public域的东西就是接口、private域的东西外部使用者不必关心也不准关心;至于那些常见的实现策略(如回调、消息等)甚至设计模式,他自然是更摸不到边了。

相关的代码,对他显然是太过艰深了。


但这并不能说明面向对象的代码比面向过程的更难读。恰恰相反,面向对象当年最大的卖点之一,就是可以在语法层面表达设计思路,从而实现“代码即文档”。

当然,现在那些崎岖的面向对象党,早已把这个给忘光光了……甚至还有矢口否认这一点、乃至以为面向对象代码=难读难懂的奇葩出现。

这也从另一个侧面,佐证了“面向对象、UML等等会在国内迅速流行并变异,最终成为一害”这句话。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
47 [报告]
发表于 2012-12-10 15:41 |只看该作者
Ager 发表于 2012-11-30 19:58
好!

好个屁。
理解上应该是真和假,0 和 非0 这是实现。

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
48 [报告]
发表于 2012-12-10 15:57 |只看该作者
本帖最后由 shan_ghost 于 2012-12-10 15:58 编辑
flw 发表于 2012-12-10 15:41
好个屁。
理解上应该是真和假,0 和 非0 这是实现。


真和假是本质。

和算法+数据结构类似,算法+数据结构是本质;其他东西,则不过是本质的某种衍生物或者对本质的某种模拟。

学习这类概念时,当然可以借助衍生物/模拟这些拐杖去理解本质;但最终形成概念时,必须割除这些衍生物/模拟方法,直指本质。否则必将导致知识结构拖沓,应用时缺乏灵性和洞察力。

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
49 [报告]
发表于 2012-12-10 16:27 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
50 [报告]
发表于 2012-12-10 16:29 |只看该作者
其实,楼主提到的案例中的B,就是学不会割除衍生物/模拟方法,自然也就无法接触本质。


对for语句来说,它的确是对循环执行一段代码,且其中循环变量的取值会遍历“一个范围”。但范围只是表象,学习不能止步于此。

下一步,当然是要割除容易理解、但非本质的“范围”,学习“循环起止控制机制”。

然后,起靠赋值,终止靠判断——i<=100就是判断。

这里,我不认为B是“没有i<=100的数学概念”。他当然知道当i取2和i取101时,i<=100是否正确;但他不知道这个判断的确切含义。

或者说,他不知道计算机的“能力上限”,所以他认为计算机一定有办法知道什么是“一个范围”——这和很多初学者喜欢问“xx程序怎么写”类似:他们并不是想问“XX程序的实现原理”,而是想问“有什么我不知道的神秘咒语,可以把xx程序搞出来”。

对B来说,i<=100就是个等于“100以内”的咒语。而咒语是没有道理好讲的。


————————————————————
但,我们知道,真正的计算机只知道真/假两个值、与或非三种基础逻辑。这就是本质。其他一切,都只能通过真/假两个值、与或非三种逻辑衍生出来。这就是计算机的能力上限。

而程序员要做的,就是利用人类的智慧,去拓展计算机的能力上限。
其中之一,就是“用真和假两个值、以及与或非三种逻辑”,给计算机扩展出“循环范围”这个概念——这就是for语句。


然后,从简单的扩展出for开始,再一步步学会其他种种扩展(如数学运算乃至排序、搜索等等),甚至最终扩展出应用程序。这就是编程的本质。
然后,就是研究怎样的扩展最简洁、高效、容易理解了。

那些说起编程就抓狂、饥不择食抓拐杖的人,就是完全没理解这些基础知识,所以只好抓拐杖,试图“从更高的层面设计程序”。但,不懂扩展,再怎么折腾也只是从一种咒语切换到另一种咒语而已——程序员是工程师,不跳大神。谢谢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP