2005年12月6日
当开发者听到“设计模式”这个词时,他们通常联想到两个场景。一组开发者正在讨论许多创造性意见,正在开会,但是却没有进行编码。另外一组人能制定出正确的计划,保证系统能够开发成功,代码可以重用。
而现实一般都处于两者中间。在为他们的公司设计解决方案的时候,结构设计者和系统设计者应该寻找重复的模式。但是模式只是开发健壮、可重用代码的一个指导。结构设计者不能过多的去设计一个解决方案的结构,因为要定期交货。
过多的设计系统结构的主要受害者是Web应用程序。因为多数Web应用程序是用来浏览数据的,它们设计的目标是数据显示的速度能跟得上数据更新的速度。在很多情况下,建立一个复杂的、多层次的体系结构并不是为了满足用户或者开发者的需要。让我们看看开发.NET Web应用程序的一个简单的例子:
用ASP.NET实现一个经典的设计模式
Smalltalk,最早的一种面向对象的编程语言,给开发者提供了一个快速开发面向对象系统的平台。经典的Model, View, Controller(MVC)设计模式就是从这个研究上发展起来的,并且现在仍在作为一个参考模型使用。Model保存由View显示,由Controller控制的数据。View负责向用户发送输出,Controller负责反应用户的动作并相应地更新Model。
ASP.NET提供了一个很好的实现这种经典设计模式的类似环境。开发者通过在ASPX页面中开发用户接口来实现View。Controller功能在逻辑功能代码(code-behind)文件(Foo.aspx.vb或者Foo.aspx.cs)中实现。
在.NET中实现这种设计提供了一个两层的系统,较经典的ASP结构来说有明显的优点。将用户显示(View)从动作(Controller)中分离出来提高了代码的重用性。将数据(Model)从对其操作的的动作(Controller)分离出来可以让你设计一个与后台存储数据无关的系统。
如果设计正确的话,一个基于MVC设计模式的系统将不会知道、也不会关心提供给Model组件的数据是存储在SQL Server或是Oracle数据库中,还是存储在一组XML文档中。
很多人会说,开发者可以使用ASP页面和COM对象很容易地实现这种模式。但是事实是,我检查的多数系统根本没有使用COM对象,或者只是使用COM对象来访问数据库;他们依然在ASP页面中嵌入脚本来完成商业逻辑。我并不是说MVC模式提倡在ASP页面中不使用脚本。我只是说在ASP页面中的脚本应该只局限于用来支持View功能和Controller功能。
2005年9月30日
道听途说之后,为了分层而分层,往往令人烦恼。
那本OA书我在一个朋友那里看到过,简单一翻,就知道跟作者一年多前打工时写的OA代码一样,没有什么架构概念,沙丘上的碉堡,好看不好用。照着那种东西写出来的东西笨笨的,上手快但是很长时期也搞不出适应用户业务使用的可灵活修改的交互性系统。
为什么分层?是为了真正节省劳动。实际上,你只需要在业务对象的类型定义上定义一些属性,数据库就给你自动创建了或者升级/更新了,同样只要在类型或者类中方法、属性上说明一下,界面就能自动给你创建了。例如你设计控件的时候只要声明以下属性,设计器上的属性编辑界面就会自动根据你的要求生成不同的辅助操作画面。那种把一些数据库操作的公共函数封装在一起的,根本不能叫做数据层,那纯粹是很原始的过程库概念。因为所有业务系统中都有数据库操作代码,把他们有效剥离出来,使得程序员几乎不用去过程性编码而只需要针对目的进行声明就能自动生成有关的代码,这个完整的系统才叫做数据库层。对于UI层也是这样,传递给一个页面一个业务对象,这也页面根据业务对象自动找出合适的UI控件显示它,例如如果是主表——明细表结构的业务数据会自动解释生成带有明细录入和汇总等丰富内容的画面,完成这个功能的系统才叫做 UI层。把一些琐碎的底层代码拼凑起来,程序员写业务处理过程的时候还是要大量写过程化的代码来处理调用这些琐碎的代码片断,这就让人怀疑所谓的分层到底有多大的作用了。
所以我比较强调开发组织要创造工具,少为了教条而单纯在口号上去约束程序员。一个中小型mis系统可能有七、八十个业务类型、两三百个页面,其实UI表现形式只有五六种,如果在声明业务类型的时候用一句代码声明一下UI类型就行了,程序员肯定不会去费力气一个一个业务类型去去写单独的页面。你有现成的工具,能够提高效率十倍,不信他不遵循。
2005年9月17日
2005年9月14日
两个月的实习时间很快就结实了,这段时间里也学到了很多东西。知道自己存在的差距,然后就是朝目标努力了。要不以后一个月买一个平方就难拉!!
回到学校才想念在解放碑打望的日子,真是PLMM云集啊,会聚四方精华,三步一张蔓玉,五步一林青霞!一句话:养眼,都不用珍视明了。5K的实习报告,俺搞了13K,当然也是东凑西拼了,书上COPY了不上的基础知识,再加上做过的项目规格说明书,一切就小意思了,呵呵。论文格式还真是难倒了我,还不容易才整出个样子来,结果还是不行。还好,多多感谢同班了一个MM才帮我搞定拉!现在终于可以出版发行了,好了,找导师去。。。GO。。。GO。。。
2005年9月11日
当我们的网站访问量很大的时候,客户端的每一次POST都去大量调用数据库服务器是一件多么可怕的事。系统性能会大打折扣,轻则速度很慢、数据库锁死,重则系统崩溃。本文将通过实现静态HTML页面解决这个问题。
1、建立Conn.cs类文件
using System;
//记得添加以下三引用
using System.Text;
using System.Web;
using System.IO;
namespace myservers
{
/// <summary>
/// Conn 的摘要说明。
/// </summary>
public class Conn
{
public Conn()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
public bool WriteFile(string strText,string strContent,string strAuthor)
{
string path = HttpContext.Current.Server.MapPath("/myservers/news/");//定义html文件存放路径
Encoding code = Encoding.GetEncoding("gb2312");//定义文字编码
// 读取模板文件
string temp = HttpContext.Current.Server.MapPath("/myservers/text.html");
StreamReader sr=null;
StreamWriter sw=null;
string str="";
try
{
sr = new StreamReader(temp, code);
str = sr.ReadToEnd(); // 读取文件
}
catch(Exception exp)
{
HttpContext.Current.Response.Write(exp.Message);
HttpContext.Current.Response.End();
sr.Close();
}
string htmlfilename=path + DateTime.Now.ToString("yyyyMMddHHmmss")+".html";
// 替换内容
// 这时,模板文件已经读入到名称为str的变量中了
str = str.Replace("ShowArticle",strText); //模板页中的ShowArticle
str = str.Replace("title",strText);
str = str.Replace("content",strContent);
str = str.Replace("author",strAuthor);
// 写文件
try
{
sw = new StreamWriter(htmlfilename,false,code);
sw.Write(str);
sw.Flush();
}
catch(Exception ex)
{
HttpContext.Current.Response.Write(ex.Message);
HttpContext.Current.Response.End();
}
finally
{
sw.Close();
}
return true;
}
}
}
2、AddNews.aspx文件
<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="myservers.WebForm1" %> 添加三和TextBox分别为:tbx_Title、tbx_Content、tbx_Author和一个Button:btn_AddNews。
AddNews.aspx.cs文件
private void btn_AddNews_Click(object sender, System.EventArgs e)
{
Conn Hover = new Conn();
if(Hover.WriteFile(this.txb_Title.Text.ToString(),Server.HtmlDecode(this.txb_Content.Value),this.txb_Author.Text.ToString()))
{
Response.Write("添加成功");
}
else
{
Response.Write("生成HTML出错!");
}
}
3、添加模板text.html文件
<head>ShowArticle</head>
<body>
title<br>
content<br>
author
</body>
说明:news文件夹必须赋予asp.net用户写入的权限。这是一个简单的实现例子,实际项目必须先将数据保存到数据库下面,在datagird中调用数据库下面html文件的URL地址。