主题:  (转载) ASP遗留的二十大积习

damoo

职务:普通成员
等级:1
金币:1.0
发贴:28
#12004/11/25 20:03:41
好久不来了。转贴一篇文章,很不错的——
在技术更新的进程中, 仍然有一些人死抱着已经过了气的东西不放. 也有一些人虽然进入到新的世界, 但仍摆脱不了陈旧的习惯. 我没有用”陋习”这个词, 因为我对这个词也非常反感.
新技术应该有新技术的做法, 进入ASP.NET的世界, 就应该把以往的习惯改正, 全新的进入新的世界, 把ASP的破烂扔掉.
以下列举的都是错误的做法, 请不要误以为是推荐的做法而进行推广:

1. 使用server side include给ASPX引入共同的页面构图.
在ASP.NET的机制下, 应使用ASCX(web user control)来实现. ASCX提供了更多可控制接口. 并且更重要的是, ASCX是一个类. 一个实实在在的类. 可以全面控制它.

2.不使用web.config
web.config提供了非常丰富的配置管理接口. 是一个应用程序最核心的部分. 但是很多人的web.config往往是空的. 或者就从来没有修改过.

3.使用Response.Write向前端输出消息
ASP.NET平台下的Response和ASP的Response有很大的不同. 虽然表示同一含义, 但用法上已经大不相同. Response.Write的内容只会输出到页的最前端. 向前端输出消息的正确方法是使用PlaceHolder.

4.使用一系列session管理用户连接状态
这种方法在ASP里被滥用. 在ASP.NET环境下, 正确的做法应该是设计一个类. 结构化地保存数据. 将对session或者cookie的访问封装起来.

5.使用session验证身份
这几乎是通病. ASP.NET提供了一组用于用户身份验证的API. 类型是forms验证或者windows验证. 这一点quick start有一节讲解得很清楚. 可以绝大部分人还是依靠给session赋值来保持用户身份验证状态.

6.使用Response.Redirect重定向页
这一点在必要的时候可以使用. 但不可滥用. 事实证明滥用重定向将导致逻辑上的严重混乱. 这是在以页为程序单元的时候的做法. 使用front controller模式将使用户的操作逻辑集中起来]

7.使用太多ASPX页
ASP环境下的程序单元只有*.asp页, ASP.NET可不是这样, 还有后端的类库, ASCX等等. 应将业务逻辑分别集中在不同的单元, 而不应该一项操作使用一个ASPX. 更多时候ASPX将做为ASCX或者custom control的容器而管理页内逻辑. ASPX重用ASCX的同时, ASPX也做为统一的页构图重用.

8.在多个逻辑单元之间复制代码并修改相应逻辑
重用. 重用. 重用. 处理此类问题的原则是不出现任何相同或相似的过程. 如果你用上面的方法, 一旦出现重大逻辑更改, 带来的结果将是灾难性的.

9.害怕使用DataSet.
很多人被DataSet吓坏了. 认为”肯定”影响性能. 但连最初的尝试都不敢. 他们总认为他们的产品一定重大, 设计上应该”慎重”. 他们往往使用ArrayList或者设计低级的类来保存集合数据. 进行艰难的数据倒入工作.

10.对“性能”过多注意.
对ASP.NET ViewState的机制特别不满. 或者总是挖空心思迫害人家. 反倒把自己弄得很累. 如果在对付ViewState的同时多注意少连几次数据库也许更文明些.

11.应用程序根目录很乱.
ASP.NET是开发项目. 不是网站. 应该把不同的资源分类放置. 例如把所有静态资源(样式表, 脚本, 图像)组织到一起. 甚至可以写一组API来管理他们. ASPX应该放在一起. ASCX应该放在一起. .*.cs呢? 应该把他们放到另外一个project里.

12.不厌其烦的写访问数据库的过程
应该把这工作交给DataAccess Application Block. 你自己还要开关connection, 何苦呢.

13.自己写的东西最靠得住.
事实往往正好相反. 多注意使用人家写好的产品. 又不收你钱, 何苦那么爱面子呢.

14. 胡乱命名ASPX文件名
这是最让人痛苦的了. ASPX文件名不仅需要容易识别. 还应该遵循一定规则. 因为behind每个ASPX都会有一个同名的类, 想象一下, 多难受. 另外大部分人不知道管理自己的项目的name space. 让人好像看到一本帐一样.

15.从来不作继承或派生
一些具有相同行为的类, 应该从公共的基类派生出来. 实际意义上, 我们的ASPX应该有一个基类PageBase. 因为总有一些公共的特性需要抽象出来.

16.零property
他们的类(ASPX所对应)里只有private method. 不公开自己的任何秘密. 可以这一定是JAVA的遗老干的事.

17. 零ASCX
不用说, 他还没学会ASP.NET

18.使用DreamWeaver“画“ASPX
这批人是美工. 甚至有一些人在非常陶醉地讨论如何更好地“整合“ DreamWeaver和Visual Studio.

19.只熟悉System.Web.UI.WebControl和System.Data.SqlClient应该还有一些值得熟悉的类库.

20.零注释
这些都是心里很明白的快手. 一任IDE生成的缺省注释横在那里不管.

21.零事件
对“事件驱动“一无所知. 只知道在Page_Load()里写过程. 或者双击一个按钮写Xxx_Clock()过程. 在他们的程序里看不到event和delegate.

以上是想到哪写到哪, 大家如果碰上让你深恶痛绝的事, 也可以补充.我一直以为, 工作是人品最直接的反映. 对程序员来说, 代码就是最真实的心灵写照.仅仅是个人看法.



缺缺

职务:管理员
等级:8
金币:41.0
发贴:9620
#22004/11/25 22:49:52
呵呵
我也有一些毛病..



蓝鲸

职务:版主
等级:5
金币:42.1
发贴:2614
#32004/11/26 0:37:21
不错,ASPNET真不同于ASP。可能ASP习气太深了吧。
事件驱动方面,一直认为好象不太关于WEB编程。虽然有时也想到WEB上是否可用,但一直不得要领。
对于类封装、事件驱动及工程管理,对初学者确实在深了些,没经过实战很难想象。

另外也想补充一点,就是对错误处理,用ASP的方法是直接跳到一个页面或一个对话框什么的。一些方法很好,就是对错误机制也可以包装起来。比如打开数据库是,可能触发一些自定义的错误信息类,这样就可以避免不厌其烦地写“****错误了”。另外,以前常不太理解throw(ex)的用法,原来很有用,在一些类的封装中可以抛出异常,使在调用中可以接受到自定义异常信息,而不是系统的。


非常大鱼

蓝鲸

职务:版主
等级:5
金币:42.1
发贴:2614
#42004/11/26 9:47:49
18.使用DreamWeaver“画“ASPX
这批人是美工. 甚至有一些人在非常陶醉地讨论如何更好地“整合“ DreamWeaver和Visual Studio.

我个人推荐使用两者结合,至少是目前,几种理由:
第1是,VS的界面设计极不友好,比如画表格,自由伸缩很不方便。虽然现在有其它方法,但html还是主流。特别是用xhtml与css结合的页面,vs2003显示是一塌糊涂,对css支持并不好。
第2是,VS中编辑aspx页面,VS总是自作聪明地给个重新排版,格式非常令人不舒服。这也算了,但是象< /br>,<li>...</li>之类的标签全给换了,没有关闭符,真是让人头疼。VS2005版好些了,改正了这些。
第3是,Dreamweaver是目前最完善的网页编辑器,对CSS的支持最好,这点很重要。网页是给人用的,要达到美观与性能的平衡,使用什么工具并不重要,对开发有益的方法都值得尝试。


非常大鱼

缺缺

职务:管理员
等级:8
金币:41.0
发贴:9620
#52004/11/26 9:56:22
VS在页面设计方面简直很糟糕.基本上在VS里面想要调整页面是不可能的.他还子作多情给你加上很多标签.



老刀把子

职务:普通成员
等级:1
金币:0.0
发贴:207
#62004/11/26 10:34:49
这文章真的很不错啊



chinaflame

职务:普通成员
等级:1
金币:0.0
发贴:22
#72004/11/27 9:59:08
看不懂吖



蓝鲸

职务:版主
等级:5
金币:42.1
发贴:2614
#82004/11/27 20:16:56
对于身份验证,主要有三种,WINDOWS验证、护照验证、WEB窗体验证,三者验证有较大区别,前者一般用于企业局域网,护照需要安装SDK(微软下载),可以用于成员网站的共享访问,后者一般用于单个应用程序。但有个共同点,就是需要在web.config中设置,并且添加用户名、口令、角色、授权等。对于能控制IIS的,可能比较方便,可以把一个站点分成很多的应用程序,并且每个应用程序设置用户权限。但是如果一个庞大的社区,在web.config中设置显然是不适合的,应该用数据库。
用Session来验证还是存在一定合理性的,因为租用的服务器一个网站只能是一个应用程序,因为无法控制IIS。但网站的功能很多,也就是无法用一个web.config文件设置那么多的应用程序设置。也许到2.0能用程序控制吧,但目前还不能,除非通过服务商去设置。
大型数据的用户,传统方法还是合适的,至以用Session还是Cookie,或是加密Cookie涉及一些验证的手段,并没有根本上否认ASP的方法。


非常大鱼

风之密码

职务:普通成员
等级:2
金币:2.0
发贴:398
#92004/11/28 11:04:54
很受启发



ndxia

职务:普通成员
等级:1
金币:0.0
发贴:13
#102004/11/29 23:17:55
很不错,有启发!



=ridincal=

职务:管理员
等级:7
金币:20.0
发贴:5886
#112004/12/1 17:25:40
很久没来,又有不少好贴。
有很多有益的启示,尤其是关于DataAccess Application block,以前没注意到。但不能完全认同所有观点:
.Net 是提供了多种用户认证方式,然而,在实际研究和使用后我仍然认为,Session 是最为灵活有效的手段。Windows 方式就不说了,Asp.Net 辅助进程实际上是直接使用IIS的User Token,无法直接用于身份判定;Passport 我想除了M$和大型Intranet系统,没有人会用;Forms 非常好,结合Role设置能够简明的实现基于角色的用户判定和权限管理,但在实际使用中感觉仍不时需要借助 Session(可能我火候不够 )。
ascx 技术很重要,但依此判断是否学会 Asp.net 似乎有卖弄之虞…… -_-
DW有效的弥补了.Net IDE在Design方面的不足,结合使用没有什么不好的吧?
至于说注释……看个人风格了……我很少写注释,可我的代码同事都能理解。我觉得把精力放在编写格式良好的代码上比放在写注释上强,当然,技术要点是要注释一下的。



缺缺

职务:管理员
等级:8
金币:41.0
发贴:9620
#122004/12/1 17:33:14
说到注释
这两天我狂写注释,当日记来写.在里面发牢骚啊写心得啊
我想以后有人看到我的注释也是一种趣事

//Allinhands
//2004-11-30 魔法道具...不知道是不是比PP秀简单一些.-_-#
//2004-12-1	是简单一些....^^

//Version 测试版
//2004-11-19 Allinhands
//数据会在服务器段作验证

//2004-11-26 核心代码初步完成.头晕中,还需要整理
//2004-11-29 再次整理.主要在搞套装.:(
	//alert(ItemWeard(ID,Colors));
	//同颜色同ID脱下
	//同ID不同颜色换衣服
	//不同ID,直接穿
	if(ItemWeard(ID,Colors)){	//如果已经穿上,则脱下来恢复到之前的衣服 //MD,还有颜色没有考虑
		//alert("身上有,脱下")
		returnDefault(Layer);
	}else{	//穿上
		//穿上,并且需要脱掉前一个试穿的 同层的 衣服,不能穿一下的都扔购物车里面吧?
		//NewItem=NewItem.replace(CurrendItem+",","");
		//alert("身上没有");
		//考虑套装.穿上套装必须把别的衣服都脱掉.
		if(Layer==30||Layer==40){
//**********************************************************************
//保存身上的衣服
function SaveWearOn(){
	//如果有套装的话,那么一些衣服就不需要保存了
	//套装和衣服想冲突的有:12,11,10,9,8,7
	//alert("xiamia")





=ridincal=

职务:管理员
等级:7
金币:20.0
发贴:5886
#132004/12/1 17:36:21
我晕~这样也可以?



蓝鲸

职务:版主
等级:5
金币:42.1
发贴:2614
#142004/12/1 18:42:11
allinhands在上个帖子中说
引用:
说到注释
这两天我狂写注释,当日记来写.在里面发牢骚啊写心得啊
我想以后有人看到我的注释也是一种趣事

//Allinhands
//2004-11-30 魔法道具...不知道是不是比PP秀简单一些.-_-#
//2004-12-1	是简单一些....^^

//Version 测试版
//2004-11-19 Allinhands
//数据会在服务器段作验证

//2004-11-26 核心代码初步完成.头晕中,还需要整理
//2004-11-29 再次整理.主要在搞套装.:(
	//alert(ItemWeard(ID,Colors));
	//同颜色同ID脱下
	//同ID不同颜色换衣服
	//不同ID,直接穿
	if(ItemWeard(ID,Colors)){	//如果已经穿上,则脱下来恢复到之前的衣服 //MD,还有颜色没有考虑
		//alert("身上有,脱下")
		returnDefault(Layer);
	}else{	//穿上
		//穿上,并且需要脱掉前一个试穿的 同层的 衣服,不能穿一下的都扔购物车里面吧?
		//NewItem=NewItem.replace(CurrendItem+",","");
		//alert("身上没有");
		//考虑套装.穿上套装必须把别的衣服都脱掉.
		if(Layer==30||Layer==40){
//**********************************************************************
//保存身上的衣服
function SaveWearOn(){
	//如果有套装的话,那么一些衣服就不需要保存了
	//套装和衣服想冲突的有:12,11,10,9,8,7
	//alert("xiamia")






会不会程序写好了,小说也写好了,一稿二投了


非常大鱼