这是一个真实的案例。

这是一个用.net + sqlserver写的web站点。我自认不是一个对什么都看不惯的人,不过我能从这个系统看出这么多问题,对方又是一个使用.net超过3年的程序员,开始我不相信,我觉得他这么做,一定有他自己的理由,我不懂的理由,但是就在我和他准备一个个探讨时,遭到了辱骂,最后演变成对骂。咳咳。所以我在这里写下这些问题,如果有理解不对的地方,欢迎大家给我写信。如果我的系统能被人review出这么问题,我在难过的同时会很高兴的。

后来我想想其实他也挺可怜的,如果你写了多年的程序,突然有一天有人告诉你做的全部都是错的,这个情景,连续剧里类似的应该很多吧。后人指出前人的问题,领导对一个完美的系统提出意见,这是很正常的,不过问题这么多,我没什么词,只能说:强!

真的很强!

写机器看得懂的程序大家都会,只有高手才会写人看得懂的程序。他的程序只能归入机器看得懂的程序,100多行代码的方法到处都是,大量冗余的函数,命名,编码都非常混乱。程序没有版本控制,没有自动化测试,数据库是想到什么建什么,而不是使用脚本生成或者建模。

sql注入漏洞。现在写程序会有sql漏洞真的很不应该。而且数据库部署是使用sa用户,也就是这个站点挂到网站上,这台机器就已经被黑客控制了。由于sql语句散布在各个页面里,直接可以宣布这个系统白做了。

整个站点由Frame构成!对于大部分站点,页头和页尾一般都是无需改变的,这是一个做web站点的人都会遇到的问题。在asp时代,我们只需include header.asp和footer.asp就完美地解决了这个问题,.net最好的方法是masterpage技术,次之的有继承basepage,或者用user control的。最次的。。。我不知道,没有人用的,就是使用 桢 了,其实桢这种技术,从我开始做web就知道不能使用的,美工不喜欢桢,桢会影响他的发挥。用户不喜欢桢,因为如果上面下面都是桢的话,滚动条只能在内容桢里,相当于用户的可视范围变小了。

整个站点所有文件,100多个页面,300多个文件,均放在同一个目录下!他的工作用机一定很强,因为我在vs.net里打开这个项目的时间足够我沏开一壶茶。他对不同的模块页面使用一个固定的前缀,由于不能像文件夹一样折叠,你必须拖动滚动条才能找到你要修改的页面。你的工作就是拖过来拖过去。我后来思考为什么他要采取这种模式,可能是web编程中的相对路径和绝对路径的问题。.net有一套机制解决这个问题的,比如ResolveURL,~符号,ApplicationPath可能等等。

数据库大量使用了触发器!把业务逻辑写在触发器里的人很强,因为触发器是难于调试的,如果你在触发器里面修改了别的表,会激发那个表触发器,造成连锁反应,你会不知道你的触发器的执行顺序是什么。

存储过程里输出web颜色代码!在某几个存储过程里,他会做个判断,如果是奇数行,是某种颜色,偶数行,是另外一种颜色。

分层!能想到分层已经很牛了,不过他的分层就更牛了。他有个类叫中间层,首先不说这个类是典型的函数式编程,这个中间层using system.web,然后在里面既访问数据库又输出web代码。这个中间层,除了他的名字叫中间层,我的智力无法理解他和中间层有什么关联。

他又有一个好的想法,他实行了一个小框架,对于repeater,datalist,datagrid,radiobuttonlist等等,他不管你是什么,只需你传入control id,就会给你自动绑定数据。不过很可惜.net没有对上面几个类提取一个interface,所以你会在代码里看到很多if ctrl is xxx然后强制转换再绑定,相同的代码一大堆。具体问题具体分析,其实在这里相同的代码是可以允许存在的,我们为什么防止程序里出现相同的代码?就是为了防止修改了一个地方而忘记修改另外一个地方造成bug。但是这里这些代码是永远不需要修改的,因为这些代码肯定不会出错。虽然这样设计不够优雅,但是我会允许这种代码存在,实在太有空,可以来重构这些代码。真正好的做法可以是在这几个类再实现一个proxy类,这样才可以有效去除冗余代码,把会出问题的集中在proxy类中,你要多加一个类,无需添加很多个if,只需在proxy类中修改即可。

web界面友好性!我把他做为一项来说,实际上包含了很多东西。一个东西要给别人用,首先自己要使用。你不能让自己用起来都想摔鼠标。对于web的数据验证,他的做法是使用他自己的中间层,用户填写后点击提交,服务器判断规则,如果不对,调用自己的中间层,中间层会输出web代码,而且是传说中的alert弹出框!你是在整人么?.net里一大堆XXXValidator就是做web验证的,而且没提交之前就可以先验证,可以适应不同的web客户端。开始我以为是他不知道,后来我在看web代码时看到了实际上他是有使用validator,不过把他禁止了。我觉得很奇怪,研究了会儿,发现了问题,原来他在诸如填写表单的地方右上角有个search框。这又是一个典型的.net问题,因为.net页面只能有一个form,整个form共享一个validator,所以如果你在填写表单的地方做了限制,那你如果单独想search时,会提示你填写表单的地方需要输入。这个2.0解决了,1.0只能使用第3方解决方案,或者他的解决方案。

数据库的自动增长类型!对于使用sqlserver2k,他自己实现了一个自动增长类型,强!有些人为了数据库的可移植性,会不使用自动增长的字段,而采用字符串的guid或者自己实现,但是我不觉得一个使用了sqlserver2k的触发器和存储过程的数据库会有移植到别的数据库的想法。而且这个实现根本没有考虑互斥的情况,在他写代码和测试的情况下是一切正常的。只能寄希望这个站点的在线人数一直为1了。

使用cookie控制权限。在你登录后,他会给你生成一个cookie,里面记录了你的权限,如果是A,你就是管理员,B,一般管理员,C普通老百姓。“郑海山,你就瞎编吧。”,你拍案而起。不过这是真的,你只需编辑cookie目录下的那个文本文件就可以从老百姓变成管理员。其实还好了,我帮他辩解,你不是我,你没看过源代码,你能知道这个漏洞?

问题还很多,不过我写得也太多了,休息一下。