惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hacker News: Front Page
P
Palo Alto Networks Blog
T
ThreatConnect
Apple Machine Learning Research
Apple Machine Learning Research
博客园_首页
T
True Tiger Recordings
P
Privacy & Cybersecurity Law Blog
B
Blog
IT之家
IT之家
Last Week in AI
Last Week in AI
F
Full Disclosure
Hacker News: Ask HN
Hacker News: Ask HN
C
Comments on: Blog
Microsoft Azure Blog
Microsoft Azure Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Microsoft Security Blog
Microsoft Security Blog
博客园 - 【当耐特】
N
News and Events Feed by Topic
NISL@THU
NISL@THU
腾讯CDC
雷峰网
雷峰网
Security Latest
Security Latest
李成银的技术随笔
M
Microsoft Research Blog - Microsoft Research
L
LangChain Blog
L
Lohrmann on Cybersecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Check Point Blog
Y
Y Combinator Blog
Recent Announcements
Recent Announcements
博客园 - Franky
N
News | PayPal Newsroom
V
V2EX
A
About on SuperTechFans
The Register - Security
The Register - Security
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google Online Security Blog
Google Online Security Blog
MyScale Blog
MyScale Blog
Cisco Talos Blog
Cisco Talos Blog
Vercel News
Vercel News
WordPress大学
WordPress大学
C
Cyber Attacks, Cyber Crime and Cyber Security
The Hacker News
The Hacker News
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
爱范儿
爱范儿
A
Arctic Wolf
L
LINUX DO - 最新话题
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - 春鱼

在文档中正确地使用中英文 文档还是程序? Smart Document 技术概述 拟成立Office团队 实现类型化的数据绑定(列表)控件 数据与操作的分离、数据实体设计及零、一与多(单体与集合)的辨证统一 推荐一个关于"架构"的演示文稿(PPT) 设计一个 validatable control(可校验控件)、兼论“三级联动” 浅论taglib设计 HTC 编程思想 录友人一曲清歌 log4net 配置与应用 Visual SourceSafe应用守则 应用程序设计/命名及编码规范方案 TreeView穿新衣: 以优雅的名义 回忆一支有意境的老歌... 列表和分页器之间的对话 统一、标准、扩展:模块间数据传送实践 重新画差不多一摸一样的UI? - ASCX的MVC模式实现 Custom Control 设计初论
ASP后遗症种种
春鱼 · 2004-07-14 · via 博客园 - 春鱼

[按]
本文原名“ASP遗留的十大积习“。源出处为作者个人文集。原作均保持不定期改动,请保持到原文主站的连接:http://www.cnblogs.com/jayxu

有很大一部分ASP.NET程序员是由ASP迁移过来的. 这本是一个很自然的过渡. 殊不知ASP.NET与ASP相比是一个全新的技术. 他们仅仅是名字上相似. 或者为了技术的延续性而特意保留了一些类似的API而已. 但是这带来了问题. 很多人仅仅以为ASP.NET是ASP的升级, 或者是.NET版本. 哪里知道.NET是一项全新的应用平台. 如果把ASP看作贝壳, 那么ASP.NET将是海洋.

但是太多的人没有意识到这一点. 或者看不全. 很多人按照他们习惯了的方式继续写ASP.NET应用. 纵然积习的力量是巨大的, 但改变就必须有阵痛, 不彻底根除一些不合适的做法, 就难以获得真知。

以下列举的都是错误的做法, 请不要误以为是推荐的做法而进行推广:

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

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

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

4.使用一系列 session 管理用户连接状态
这种方法在ASP里被滥用. 引入过多的 session 将会使应用变得极难管理. 在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.

22. 研究在“页间传值“
典型的做法是讨论总结出几种页间“传值的方法“. 例如使用query string, 使用session, 使用form post 等等. 岂不知ASP.NET下的form是缺省的post到本页的. 我们也许再也不需要使用Request.Form[“name“]获得表单的值了. 虽然框架保留了这样的接口.
实际上, 在ASP.NET环境下, 很少在模块或者程序单元间传送常规类型的值. 在事件驱动的机制下, 我们一般不会让某页去主动获取想象中的“传值“, 这些过程一般被封装在事件或者状态中. 所以也就不存在页间或者窗口或者框架间传值的问题. 一般而言, 我们会有专用的深层机制隐藏这一过程. 掌握这样一个原则: 在业务过程中避免接触过多系统的接口.

作者毕业于西北工业大学。主要从事web应用系统开发。可通过邮件 xujian(a)nwpu.edu.cn与之联系。