由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Java版 - 封装
相关主题
hibernate和ejb3local变量被赋值了几次?
谁给推荐一个简单的ORM吧其实有很多概念都是误导性的
那里能下载到ibatis 2.3.2或者以上版本?unidentified_title
一大堆Java的 web app framework,学那个最有用啊JDBC & Firewall
hibernate和jdbc的比较。How to connect to SQL2000?
现在 Java Web 开发过时了么?Re: SQL Server 2000 Driver for JDBC - Er
报offer咯a question regarding JDBC driver?
反驳JAVA无用论Java练习题 5
相关话题的讨论汇总
话题: java话题: 结构话题: 封装话题: 所以话题: 效率
进入Java版参与讨论
1 (共1页)
z****e
发帖数: 54598
1
前两天在某一个同事的课堂上,遇到一个经典的问题
就是问当地大学的孩子,你们学过c没有?
有趣的是,普遍的回答是没有,但是听说过
这其实倒也不怪他们,因为大学已经把java列为所有接触编程的学生的入门语言
而不是c,更让我觉得有趣的是,我看到有些中国人张大嘴巴觉得不可思议
这让我想起前一段我问过的问题
就是曾经在中国那片土地上,有个计算机等级考试
连法律系的都跑去学c语言,这么多年过去了,这批人在c相关领域又做出了什么贡献?
屁贡献都没有,中国的企业几乎在所有系统软件领域落败
所以全民c了又能怎样?还不是一样残了?
今天闲着的时候随手翻了翻图灵奖获得者的贡献列表
发现,面向对象程序编程获得了两次图灵奖,01年和03年
再想起当时那个课堂上的提问,觉得这是一个蛮有意思的现象
我个人是完全赞同把java作为入门编程语言的,而不是c
因为面向对象这是一个思维方式,而java是一门完全的面向对象语言,不像c++那样
的半吊子
而c是面向过程的语言,当然用c也能写出面向对象的程序,但是在打基础阶段
最好不要给初学者以选择的余地,否则初学者很容易落入盲目追逐速度的陷阱
而把结构给彻底忽视,这是非常非常非常危险的
因为java为了结构可以牺牲速度,而c允许为了速度牺牲结构
初学者往往急着实现某些功能,想把hello world写出来,给他们说太多的对象,他们
不愿意听的
他们认为,这些高级功能将来是可以通过某些技术予以解决的,这实际上最大的误区
而事实上,在现实生活中,你遇到的legacy code大部分都是这种追逐效率而牺牲结构
的垃圾
无比头疼,看代码看得死去活来,上头还不愿意让你去重构这些代码
现实中,程序的结构如果一开始错了,几乎就注定了这个项目失败的结局
这个星球上有一半以上的项目是失败的,如果你学过项目管理就知道,有足够的统计数
据支撑这个说法
因为太多的人一开始就不把结构当成首要考虑的目标,而把速度当成唯一考量的方式
我记得我工作时候上的第一堂课就是,写程序之前,不要急着写,想清楚,问清楚之后
再写
至今为止我非常感谢教我那堂课的师傅,现在回头看看,我今天有的一切,从那一刻开
始改变
他教给我的让我从一个什么都不是的本科生,到后来出国
到现在还能自主创业,有一个无限接近实现梦想的机会
而当时跟我同时毕业的人……
扯远,回到主题
想起在佛偷鸡版的一次聊天,说某人学java
第一堂课就是老师在黑板上写了一个牛字
说以前的程序员总是以为自己很牛,所以什么都追求最高效率
别人很难扩展,而阿三直接上的就是大数组,代码容易懂,但是效率不高,但是别人拿
来改写也容易
所以现在你们应该学会如何不装逼,世界很大,你算个屁
可以说你屁都不是,你要学会如何跟别人合作
真正的效率来自于代码的易读性和模块的耦合度的降低以及内聚性的提升
其实还有出错的概率
所以这种效率和结构之争,很多初学者搞不清楚,他们往往会因为某些东西做得快而选
择这些东西
事实上这些东西比比皆是,flash开发就很快,.net也很快,php开发也不慢
而事实上这些东西都有结构性的错误,而后续要解决这些结构性的错误,不是说不可能
而是我觉得这些是没有必要做出的牺牲,一开始就不应该在结构上做出这种让步
当然我说的是大项目,不是小项目,不是论坛这种档次
而是商业银行,保险公司,大型运输枢纽的核心系统,这种档次
为什么我们赚钱多呢?因为我们就没有考虑过做小项目
我不反对你去做,这个世界需要无私贡献的人,你满意就行
所以一开始学java会强迫你形成一个以对象为基本单位的思维方式
你看到这个东西不是对象,你就有种浑身不自在的感觉,你就像把他用某个对象给它包
起来
c很难形成这种思维方式,而且思维方式一旦定型,很难调整
举个简单例子,对于一个普通的entity对象,你会用set/get方法做基本的封装
但是那些没有这种思维方式的人,他们会直接访问public变量
而且他们会不理解你为什么用set/get方法做封装,你要解释半天,而且更可怕的是
他如果是你的上级,他会以这种方式效率太低而否定你的封装,那后果就严重了
而且更可怕的是,你还不能跟他argue,因为他是你的上级,所以将来出了问题之后
他才有可能意识到,哦,原来是这样,而这个问题很有可能实在几个月甚至几十年后才
有可能出现
那个时候他有可能早就升为管理人员了,而你正好是留下来给他擦屁股的人
当然你也有可能跳槽了,就像我一样,一看这个形势不对,赶快跑路了
但是问题是,现在很多公司都遗留有这种代码,尤其是大公司,你到哪里都有可能给他
们擦屁股
我的方式是把这些家伙的名字从文档中找出来,然后把这些家伙的名字给写到注释中去
将来谁接手的话,不让他们骂我,我要告诉他们我是擦屁股的,而不是拉屎的
别特意写邮件来骂我
其实回头看看计算机发展的各个阶段,你会发现,封装是如此滴重要
以至于在各个阶段,不完全的封装始终存在
比如很早以前的汇编和c之争,后来的c++和java之争,再到后来的ibatis和hibernate
之争
这都是速度和结构之争,其实最终的解决都是以完全封装的胜利而告终
c就战胜了汇编,java干掉了c++,hibernate得到了官方承认,而ibatis还是游击队
也就是说,你要做一件事,就不要做得一半半,把不好的地方直接去掉
你要想写一个完全的高级语言,就不要搞汇编那一套,虽然理论上汇编的速度应该是要
比c快的
同理,你要写一个完全的面向对象编程,就不要去搞指针,不要尝试去想内存是怎么分
配的
很无聊,也没有必要,你要想用数据库,就没有必要去写sql语句,sql就是一个半吊子
的封装
因为政治斗争太激烈了,以至于很多重要的标准都没有出来
简单说,为了结构,你应该毫不犹豫滴牺牲效率,你可以忍受慢也要尽一切可能减少出
错的概率
因为在软件工程中,你很难控制别人的程序是否会出错,因为他们都是人,是人就有可
能犯错
其实你如果对m$的产品有所了解的话,你应该会感觉到微软做的东西是如此的丑陋
不管是windows还是word还是什么.net,结构上都很难受
学操作系统的时候老师第一堂课就会告诉你,为什么unix漂亮,而windows丑陋
不仅仅是对公司有意见,而是你如果有那种专业的美感的话,你应该会感觉出来
.net在appserver层面的实现就让我觉得很丑陋,不是不能这么做
而是我不愿意这么做,就像我不愿意跟一个丑女做爱一样
当然有些人靠这个混饭吃,那好,我已经脱离了混饭吃这个层次
我已经不需要为基本的生活而奔波的时候,我完全没有必要为了这种垃圾而破坏我的美感
看sqlserver也是一样的丑陋,sql语句最重要的一点就是缺乏对分页标准的支持
sqlserver的分页的方式简直让我想砍人,不知道现在怎样了
但是我记得我当时问了一下sqlserver如何实现分页
很简单的一个功能,但是sql标准不支持,就是现实生活中
我们很有可能遇到一个大型数据库,里面有几万几十万条数据
但是呢,我希望的是,一页页翻过去看,然后直接定位到2326页看
那这个时候,分页的功能就很重要,大多数数据库都提供这种支持
比如mysql的limit offset子句,以及firebird的rows to子句,比如oracle的rownum子句
你知道sqlserver做不到么?或者说,它只能先top多少个之后,然后把前面的全部去掉
么?
参考:
http://en.wikipedia.org/wiki/Select_(SQL)#Result_limits
不知道现在这种垃圾的实现改变了没有,我记得在菌版有个傻鸟要跟我争哪个数据库怎样
我就用这个问题问它,结果也在我的意料之中,最后跟我说,不好意思,我是做mobile的
处理的数据最大只有几百条……
事实上微软这么做也是在意料之中,其实这是由一个商业公司本质所决定的
盖茨这个人就是一个红果果的资本家,它是一个合格得不能再合格的ceo,教科书式的
ceo
这个公司的每一个毛孔都流着血和肮脏的东西,他们做的一切,都是为了股东利益的最
大化
除此以外所有人,都是剥削的对象,这是盖茨牛逼的地方,所以盖茨是世界首富,而你
我屁都不是
但是区别在于,我不会迎合这种资本家,而不像你,被强奸了还要为它叫好
当然还有一种可能,你买了微软的股票,哇哈哈哈,那恭喜你,来告诉我你赔了多少?
sun作为一家公司是不合格的,但是sun作为一个大学的研究机构,是完全合格的
所以java得到这么多人和公司的支持,因为它作为公司不合格,作为一个资本家水平太差
你可以欺负他,以至于最后所有人都欺负他的结果是,他不得不公开java的源代码
你见过比sun更傻逼的公司么?我看古往今来很难找到了
oralce也是一家赤裸裸的商业公司,ceo也是合格的
所以前面说了,sql的标准不彻底,很多功能都是各自实现
所以同一个sql语句,在不同的数据库中会有不同的表现
虽然不少是共通的,但是少部分是不共通的,而且有趣的是
这个少部分的不同,足以让你在迁移数据库的时候玩完
也就是你想把oracle的db换成mysql,嘿嘿,没那么容易
ellison从中做了不少梗
所以我们要感谢hibernate的存在,在hibernate的努力下
这个问题不能说完全解决,但是大部分解决了,剩下的部分
你可以不碰,但是这又来了,你会遇到速度和结构的冲突
如果你没有考虑过将来要换数据库,盲目滴迎合你现有的数据库
等到将来你要换的时候,那就热闹了
这是一个博弈的世界
这个世界中处处是陷阱,所以我们要强调封装,本意是要减轻依赖
我写的程序要减轻对所有产品和公司的依赖
因为哪怕是开源的,也不保险,你看看mysql的今天就知道了
今天这个社会,哪怕是游戏都在减轻对各个系统的依赖
你玩过cs就知道了,有两个选择,一个是directx,另外一个opengl
directx是微软的东西,opengl是开源的产品,也就是说
cs的引擎完全可以做到不对windows的依赖
只是当时没有必要做而已,其实用opengl玩cs更快,我们都喜欢改成opengl的玩cs
同样的,暴雪的各个游戏现在也推mac版
他们也在减轻对m$的依赖
因为长期以来,帝国时代一直是星际争霸的主要竞争对手
所以你写程序,就应该想到如何减轻对各个东西的依赖
别管这个东西是什么,os也好,db也罢,还有browser
有些html语句是只能在ie上跑
所以ajax推出的时候就是因为它能兼容ie和firefox而大受欢迎
同样ibm也有类似的trick
只要是商业公司,就会想办法把你捆到他们的产品中去,然后所有的都用他们的就好了
这又回到结构和速度之争上去了
商业公司会用速度快做诱饵,诱引你进入他们的陷阱,然后你就仍他们摆布了
尤其是当你做大了之后,看看微软怎么宰netscape的,教科书一般的案例
c*****n
发帖数: 75
2
同意你的结论,但觉得例子有些勉强。 其实封装是一个很广泛的概念,不是OOP独有的
。 C也封装,在java里不用set/get的人在c里也不会用
static. 一切都global. 如果你用多态性做例子肯更让人信服。
中国的企业几乎在所有系统软件领域落败,和全民学java或C有关吗?学java的一定会
学OOP 吗?如果全民都C了, 并且把pointer搞得清清楚楚,
那中国早就是软件大国了。 问题时律师们和非律师们学的学的都是皮毛。中国的计算
机等级考试和现在的Java certification有本质区别吗?都是圈钱的把戏吧了。
java作为入门编程语言,没问题。 学不学OOP呢? 学不学J2EE 呢? 其实, 这些都超
出了语言(编译器)本身的范围, 而加入了库。而要搞清楚库,就涉及操作系统的东
西。学好了C和软件设计加上操作系统, 一样可以写出large scale的好code.
java的garbage collector正是为律师们和非律师们服务的。 和OOP 并无关系。
是的, legacy code大部分都是这种追逐效率而牺牲结构。 但如果说那些到处用
global 或public variable的人是在追逐效率而牺牲结构, 那真是抬举他们了。 他
们更可能根本不知道什么是效率, 什么是结构。他们只是在想办法拿到那个变量的值
罢了。这些legacy code 的问题不在语言本身,在使用的人上。
s********r
发帖数: 394
3
学院派的檄文啊,多做几个行业的项目可能就写不出这么爱憎分明的文章了。

★ 发自iPhone App: ChineseWeb - 中文网站浏览器

【在 z****e 的大作中提到】
: 前两天在某一个同事的课堂上,遇到一个经典的问题
: 就是问当地大学的孩子,你们学过c没有?
: 有趣的是,普遍的回答是没有,但是听说过
: 这其实倒也不怪他们,因为大学已经把java列为所有接触编程的学生的入门语言
: 而不是c,更让我觉得有趣的是,我看到有些中国人张大嘴巴觉得不可思议
: 这让我想起前一段我问过的问题
: 就是曾经在中国那片土地上,有个计算机等级考试
: 连法律系的都跑去学c语言,这么多年过去了,这批人在c相关领域又做出了什么贡献?
: 屁贡献都没有,中国的企业几乎在所有系统软件领域落败
: 所以全民c了又能怎样?还不是一样残了?

q********8
发帖数: 467
4
也不能否认有的语言更容易产生好的代码,语言其实和编程思想有不少绑定性的。
原贴写的很好

【在 c*****n 的大作中提到】
: 同意你的结论,但觉得例子有些勉强。 其实封装是一个很广泛的概念,不是OOP独有的
: 。 C也封装,在java里不用set/get的人在c里也不会用
: static. 一切都global. 如果你用多态性做例子肯更让人信服。
: 中国的企业几乎在所有系统软件领域落败,和全民学java或C有关吗?学java的一定会
: 学OOP 吗?如果全民都C了, 并且把pointer搞得清清楚楚,
: 那中国早就是软件大国了。 问题时律师们和非律师们学的学的都是皮毛。中国的计算
: 机等级考试和现在的Java certification有本质区别吗?都是圈钱的把戏吧了。
: java作为入门编程语言,没问题。 学不学OOP呢? 学不学J2EE 呢? 其实, 这些都超
: 出了语言(编译器)本身的范围, 而加入了库。而要搞清楚库,就涉及操作系统的东
: 西。学好了C和软件设计加上操作系统, 一样可以写出large scale的好code.

b******M
发帖数: 1162
5
写的好。
我记得计算机等级考试我考的是c.
可是工作后没啥机会用。似乎所有的项目都偏向.net和java.

【在 z****e 的大作中提到】
: 前两天在某一个同事的课堂上,遇到一个经典的问题
: 就是问当地大学的孩子,你们学过c没有?
: 有趣的是,普遍的回答是没有,但是听说过
: 这其实倒也不怪他们,因为大学已经把java列为所有接触编程的学生的入门语言
: 而不是c,更让我觉得有趣的是,我看到有些中国人张大嘴巴觉得不可思议
: 这让我想起前一段我问过的问题
: 就是曾经在中国那片土地上,有个计算机等级考试
: 连法律系的都跑去学c语言,这么多年过去了,这批人在c相关领域又做出了什么贡献?
: 屁贡献都没有,中国的企业几乎在所有系统软件领域落败
: 所以全民c了又能怎样?还不是一样残了?

L*****s
发帖数: 24744
6
以前计算机等级还考,现在已是昨日黄花了..
b******M
发帖数: 1162
7
是我也跟着黄花了

【在 L*****s 的大作中提到】
: 以前计算机等级还考,现在已是昨日黄花了..
w***a
发帖数: 432
8
服了楼主了。真是横扫CS啊。
看了第一段,让人感觉是美国人因为学习了java, 而不是C语言,才创造对系统软件领
域的贡献。
难道大部分系统软件是用java写的不成?
学习面象对象应该从基础开始学习,对象的基础就是java?不知道楼主对动态语言中的
面向对象技术,比如perl和R或者GObject, 有什么评价。也许楼主不认为那是面向对
象的软件。但我倒觉得那才是真正的面向对象的基础。java才是盲目追逐结构的陷阱好
不好,才是牺牲效率而追逐结构的,那个楼主所谓的垃圾。
如果一句话可以改变楼主的一生,楼主的一生可以改变很多次。如果只有那一句话可以
改变楼主,那楼主的一生只有那次改变。这二个情况都让人好是纠结啊。
希望楼主在写这个文章的时候不是感觉在装B。
算了,就看到这里吧。楼主也是漫无边际的讲讲。只是上了头版,让人看了总是不爽。
此打住。
f****n
发帖数: 208
9
Java and its frameworks are good tools for business applications because
once you follow the general rules writing Java code, you can just focus on
the business logic, instead of worrying about the language itself. Also Java
is better modularize and standardized.
j******l
发帖数: 10445
10
Java is slower than C.
Java is better to manage than C when developing large scale software.
c****7
发帖数: 4192
11
"hibernate得到了官方承认,而ibatis还是游击队"
我们吃hibernate的亏吃太多了,现在开始用ibatis了

【在 z****e 的大作中提到】
: 前两天在某一个同事的课堂上,遇到一个经典的问题
: 就是问当地大学的孩子,你们学过c没有?
: 有趣的是,普遍的回答是没有,但是听说过
: 这其实倒也不怪他们,因为大学已经把java列为所有接触编程的学生的入门语言
: 而不是c,更让我觉得有趣的是,我看到有些中国人张大嘴巴觉得不可思议
: 这让我想起前一段我问过的问题
: 就是曾经在中国那片土地上,有个计算机等级考试
: 连法律系的都跑去学c语言,这么多年过去了,这批人在c相关领域又做出了什么贡献?
: 屁贡献都没有,中国的企业几乎在所有系统软件领域落败
: 所以全民c了又能怎样?还不是一样残了?

T*******x
发帖数: 8565
12
这个得顶。

【在 z****e 的大作中提到】
: 前两天在某一个同事的课堂上,遇到一个经典的问题
: 就是问当地大学的孩子,你们学过c没有?
: 有趣的是,普遍的回答是没有,但是听说过
: 这其实倒也不怪他们,因为大学已经把java列为所有接触编程的学生的入门语言
: 而不是c,更让我觉得有趣的是,我看到有些中国人张大嘴巴觉得不可思议
: 这让我想起前一段我问过的问题
: 就是曾经在中国那片土地上,有个计算机等级考试
: 连法律系的都跑去学c语言,这么多年过去了,这批人在c相关领域又做出了什么贡献?
: 屁贡献都没有,中国的企业几乎在所有系统软件领域落败
: 所以全民c了又能怎样?还不是一样残了?

Q**g
发帖数: 183
13
以偏概全。拿Java写点网站项目就是软件的全部了?说白了Java就是IT shop的工具罢
了,呵呵

【在 z****e 的大作中提到】
: 前两天在某一个同事的课堂上,遇到一个经典的问题
: 就是问当地大学的孩子,你们学过c没有?
: 有趣的是,普遍的回答是没有,但是听说过
: 这其实倒也不怪他们,因为大学已经把java列为所有接触编程的学生的入门语言
: 而不是c,更让我觉得有趣的是,我看到有些中国人张大嘴巴觉得不可思议
: 这让我想起前一段我问过的问题
: 就是曾经在中国那片土地上,有个计算机等级考试
: 连法律系的都跑去学c语言,这么多年过去了,这批人在c相关领域又做出了什么贡献?
: 屁贡献都没有,中国的企业几乎在所有系统软件领域落败
: 所以全民c了又能怎样?还不是一样残了?

p*********t
发帖数: 2690
14
现在 数据结构 的书都用java来演示链表了。java的流行是必然,因為它不需要考虑指
针,内存这些很烦人的东西。c,c++ 的bugs,很多时候都是数组越界,溢出造成的,非
常烦人。
c还好,能打赢汇编语言.c++完全就是大杂烩了,学习曲线太陡,以致现在java,c#,.
net 都比它流行。
每一个语言,为了不被淘汰,都会搞一些出格的东西,比如perl里面if...elsif. 所以
也不能怪oracle.都是为了生存,没办法而为之。

【在 c*****n 的大作中提到】
: 同意你的结论,但觉得例子有些勉强。 其实封装是一个很广泛的概念,不是OOP独有的
: 。 C也封装,在java里不用set/get的人在c里也不会用
: static. 一切都global. 如果你用多态性做例子肯更让人信服。
: 中国的企业几乎在所有系统软件领域落败,和全民学java或C有关吗?学java的一定会
: 学OOP 吗?如果全民都C了, 并且把pointer搞得清清楚楚,
: 那中国早就是软件大国了。 问题时律师们和非律师们学的学的都是皮毛。中国的计算
: 机等级考试和现在的Java certification有本质区别吗?都是圈钱的把戏吧了。
: java作为入门编程语言,没问题。 学不学OOP呢? 学不学J2EE 呢? 其实, 这些都超
: 出了语言(编译器)本身的范围, 而加入了库。而要搞清楚库,就涉及操作系统的东
: 西。学好了C和软件设计加上操作系统, 一样可以写出large scale的好code.

1 (共1页)
进入Java版参与讨论
相关主题
Java练习题 5hibernate和jdbc的比较。
有没有大牛在搞cloud?-- 包子贴现在 Java Web 开发过时了么?
Re: salesforce用的什么数据库产品呀?报offer咯
准备做一个旅游的网站,需要前台web design 和 后台的解决方案反驳JAVA无用论
hibernate和ejb3local变量被赋值了几次?
谁给推荐一个简单的ORM吧其实有很多概念都是误导性的
那里能下载到ibatis 2.3.2或者以上版本?unidentified_title
一大堆Java的 web app framework,学那个最有用啊JDBC & Firewall
相关话题的讨论汇总
话题: java话题: 结构话题: 封装话题: 所以话题: 效率