迟来的博客

常用链接

统计

最新评论

2008年3月3日 #

我与一个女程序员的聊天记录一

     摘要: 去年12月的一天夜里,我在网上百无聊赖地瞎逛了一通,正准备下线睡觉,突然,发现windows右下角一个陌生的QQ头像一闪一闪的,随手就点开了,从此,我就和这个叫做*雪的女孩子开始了几乎每天不断的聊天。  阅读全文

posted @ 2008-03-03 22:14 语风 阅读(86) | 评论 (0)编辑

2007年5月6日 #

你是我的玫瑰-类关系阐微

        世界是普遍联系的,因此程序世界中的类,也不可能是孤立的。UML为我们定义了它们之间的关系,就是:依赖、关联、聚合、组合还有泛化。

       泛化关系比较好理解,就是表示类之间的继承关系。容易混淆的是依赖、关联、聚合和组合的关系。这里做一些甄别:

       1、 依赖和关联的颠倒颠

       在网上查找了一下依赖和关联的区别,有说“关联本身即是一种依赖”,亦有说“依赖是一种弱关联”,其实说来说去是一档子事。依赖和关联都是说一个类用到了另一个类。其区别在于一个是使用,一个是拥有。

      依赖:具有某种偶然性。比如说我要过河,没有桥怎么办,我就去借来一条小船渡过去。我与小船的关系仅仅是使用(借用)的关系。表现在代码上,为依赖的类的某个方法以被依赖的类作为其参数。或者是class A 的某个方法创造了 class B 的实例抑或对class B静态方法的调用。如果A依赖于B,那意味着B的变化可能要求A也发生变化;

       这是uml图表示的依赖关系:
       
代码表现:

1public class Person{    
2    /** 划船 */   
3    public void oarage (Boat boat){    
4        boat.oarage();    
5 }
    
6}
 
7

 

关联:有名的客户和订单的关系以及公司和员工的关系,都是关联关系。还有就是我和我的单车的例子,他们都是一种“拥有”的关系。表现在代码上,就是一个类包含另一个类的实例,通常表现为被关联类以类属性的形式出现在关联类的类定义中,也可以表现为关联类引用了一个类型为被关联类的全局变量。关联可以使单向的,也可以使双向的。

从网上找到的公司和员工的UML图和代码 :


公司和员工的关联关系
 1public class Company{    
 2    private Employee employee;    
 3    public Employee getEmployee(){    
 4        return employee;    
 5    }
    
 6    public void setEmployee(Employee employee){    
 7        this.employee=employee;    
 8    }
    
 9    //公司运作    
10    public void run(){    
11        employee.startWorking();    
12    }
    
13}
  
14

 

可见依赖于与关联亦有动静之别,关联的类静态地引用了被关联类的实例变量,而依赖的偶然性也正说明了它的动态性。

      2、 聚合与组合同出而异体

      聚合与组合其实都是关联的特例,都是整体和部分的关系。他们的区别在于聚合的两个对象之间是可分离的,他们具有各自的生命周期。而组合往往表现为一种唇齿相依的关系。

聚合:一种容纳或曰包含的关系,如同机场和飞机,汽车和轮胎的关系。其实仔细想想,前面的公司和员工的关系也有聚合的味道在里面。

组合:也可称之为强聚合,整体和部分是不可分的,整体的生命周期结束时也就是部分的生命周期到头时。很有名的就是桌子和桌子腿的关系。

      聚合的UML

组合的UML图:




 

然而,聚合与组合的代码表现形式是一样的,都可以表现为以下的形式,它们仅仅具有语义上的区别。

网上找到的电脑和CPU的关系的代码表现:

 1public class Computer{    
 2    private CPU cpu;    
 3    public CPU getCPU(){    
 4        return cpu;    
 5    }
    
 6    public void setCPU(CPU cpu){    
 7        this.cpu=cpu;    
 8    }
    
 9    //开启电脑    
10    public void start(){    
11        //cpu运作    
12        cpu.run();    
13    }
    
14}
  
15

 

   结语:

      一般情况下,当某个类被当作参数传递并且被当作结果返回的时候,或者被当作某个方法内的临时变量使用的时候,可以运用依赖关系,使用关联来表示一个拥有关系,而不是整体-部分关系。使用聚合来表示一个动态的整体-部分关系,而是用组合来表示一个静态的整体-部分关系。但是需要指出的是,所谓“关系”只是在某个问题域才有效,离开了这个问题域,可能这些关系就不成立了,例如之前我和小船的关系,可能在某个问题域中,我是船夫,我的工作就是驾着小船在河上摆渡,那我和小船的关系就上升为关联关系了。试想一下,武侠小说中的那些剑仙们,修炼到人剑合一的境地,剑在人在,剑亡人亡,那它们之间的关系就似乎与组合关系类似了。又如在关心汽车的领域里,轮胎是一定要组合在汽车类中的,因为它离开了汽车就没有意义了。但是在卖轮胎的店铺业务里,就算轮胎离开了汽车,它也是有意义的,这就可以用聚合了。这说明关系是在特定的问题域中的“关系”,会随着问题域的迁移而改变的。最后顺便问一句:老公和老婆的关系是依赖还是关联呢?一笑……

posted @ 2007-05-06 00:11 语风 阅读(125) | 评论 (4)编辑

2007年2月1日 #

asp.net后台长时间操作时,向前台输出“请等待"信息的方法

     摘要: 在asp.net中,有时候页面加载时,后台需要进行一些操作,比如查询数据库等。而且可能这些操作需要花费较长时间,致使前台长时间无响应,甚至有可能造成页面超时。可以采用以下方法解决  阅读全文

posted @ 2007-02-01 22:11 语风 阅读(366) | 评论 (0)编辑

2006年9月3日 #

DataSet的加密解密(续)

        在上次DataSet的加密解密一文发布后,有网友提出采用XML序列化的方式速度较慢,建议用二进制序列化。我觉得很有道理,下面是在VS2005种采用二进制序列化方式结合对称加密算法对DataSet进行加密解密的代码:
 1using System;
 2using System.Collections;
 3using System.Security.Cryptography; 
 4using System.IO ;
 5using System.Data;
 6using System.Runtime.Serialization.Formatters.Binary;
 7namespace zjz.ClsDoCode
 8{
 9    /// <summary>
10    /// ClsEncryption 的摘要说明。
11    /// </summary>

12    public class ClsEncryption
13    {
14        public ClsEncryption()
15        {
16            //
17            // TODO: 在此处添加构造函数逻辑
18            //
19        }

20        //密钥
21        //获取或设置对称算法的机密密钥。机密密钥既用于加密,也用于解密。为了保证对称算法的安全,必须只有发送方和接收方知道该机密密钥。有效密钥大小是由特定对称算法实现指定的,密钥大小在 LegalKeySizes 中列出。
22        private static byte[] DESKey = new byte[] {11239310272411812};
23        //获取或设置对称算法的初始化向量
24        private static byte[] DESIV = new byte[] {75158469778571736};
25
26                public static void EncryptDataSetToBinary(DataSet objDataSet, string outFilePath)
27        {
28             DESCryptoServiceProvider objDES = new DESCryptoServiceProvider();
29             FileStream fout = new FileStream(outFilePath, FileMode.OpenOrCreate, FileAccess.Write);
30            //用指定的 Key 和初始化向量 (IV) 创建对称数据加密标准 (DES) 加密器对象
31            CryptoStream objCryptoStream = new CryptoStream(fout, objDES.CreateEncryptor(DESKey, DESIV), CryptoStreamMode.Write);
32            //StreamWriter objStreamWriter = new StreamWriter(objCryptoStream);
33            objDataSet.RemotingFormat = SerializationFormat.Binary;
34            BinaryFormatter bf = new BinaryFormatter();
35            bf.Serialize(objCryptoStream, objDataSet);
36            objCryptoStream.Close();
37            fout.Close();
38
39        }

40        public static DataSet DecryptDataSetFromBinary(string inBinFilePath)
41        {
42            DESCryptoServiceProvider objDES = new DESCryptoServiceProvider();
43            FileStream fin = new FileStream(inBinFilePath, FileMode.Open, FileAccess.Read);
44            //用指定的 Key 和初始化向量 (IV) 创建对称数据加密标准 (DES) 加密器对象
45            CryptoStream objCryptoStream = new CryptoStream(fin, objDES.CreateDecryptor(DESKey, DESIV), CryptoStreamMode.Read);
46            BinaryFormatter bf = new BinaryFormatter();
47            DataSet ds = (DataSet)bf.Deserialize(objCryptoStream);
48            fin.Close();
49            return ds;
50   }

51    }

52}

posted @ 2006-09-03 23:25 语风 阅读(168) | 评论 (4)编辑

2006年8月31日 #

在InstallShield中加密字符串,在C#中解密

     摘要: 一般情况下,Asp.Net程序中,数据库连接字符串大多存储在配置文件中。如果程序不是手工发布,而是通过安装程序部署,那么通常在安装过程中需要用户输入数据库管理员帐号和密码,以便安装数据库。同时将管理员帐号和密码以及数据库服务器地址(或者数据库连接字符串)写入配置文件中。但是如果不加密,尤其是数据库管理员密码,若以明码形式存储,极容易被窃取。
这就需要对字符串进行加密处理。但是在安装制作软件(我用的是InstallShield 12)中没有提供专用的加密方法,而且在InstallShield中加密过的字符串在Asp.Net(我用的是C#编写Asp.Net)中要能够被解密,则必须用两者通用的加密解密方法。因此我想到,每个字符的ASCII码都是通用的,只要在InstallShield中对字符的ASCII码进行处理,比如加一或移位,得到一个新的字符串,再到C# 中进行逆向操作,就可以还原为原来的字符串。
  阅读全文

posted @ 2006-08-31 22:55 语风 阅读(341) | 评论 (2)编辑

2006年6月11日 #

DataSet的加密解密

        最近在一个工程中需要对DataSet进行加密,然后以文件形式传输后在另一端解密还原。于是查询了一些资料,发现多是对字符串和文件加密的方法。于是只好自力更生,参考.net的对称加密技术和网上的一些资料,研究出了DataSet的加密方法。
    代码比较简单,附下:

 1  using System;
 2  using System.Collections;
 3  using System.Security.Cryptography; 
 4  using System.IO ;
 5  using System.Data;
 6  using System.Xml.Serialization;
 7  namespace zjz.ClsDoCode
 8  {
 9      /**//// <summary>
10    /// ClsEncryption 的摘要说明。
11    /// </summary>

12     public class ClsEncryption
13    {
14        public ClsEncryption()
15         {
16             //
17            // TODO: 在此处添加构造函数逻辑
18             //
19         }

20         //密钥
21        //获取或设置对称算法的机密密钥。机密密钥既用于加密,也用于解密。为了保证对称算法的安全,必须只有发送方和接收方知道该机密密钥。有效密钥大小是由特定对称算法实现指定的,密钥大小在 LegalKeySizes 中列出。
22         private static byte[] DESKey = new byte[] {11239310272411812};
23         //获取或设置对称算法的初始化向量
24         private static byte[] DESIV = new byte[] {75158469778571736};
25 
26          /**//// <summary>
27         /// 加密DataSet
28        /// </summary>
29         /// <param name="objDataSet"></param>
30        /// <param name="outFilePath"></param>

31        public static void EncryptDataSetToXml(DataSet objDataSet,string outXmlFilePath)
32        {
33            DESCryptoServiceProvider objDES = new DESCryptoServiceProvider();
34            FileStream fout = new FileStream(outXmlFilePath, FileMode.OpenOrCreate, FileAccess.Write);
35            //用指定的 Key 和初始化向量 (IV) 创建对称数据加密标准 (DES) 加密器对象
36            CryptoStream objCryptoStream = new CryptoStream(fout, objDES.CreateEncryptor(DESKey, DESIV), CryptoStreamMode.Write);
37            StreamWriter objStreamWriter = new StreamWriter(objCryptoStream);
38            XmlSerializer objXmlSer = new XmlSerializer(typeof(DataSet));
39            objXmlSer.Serialize(objStreamWriter, objDataSet);
40            objStreamWriter.Close();
41
42        }

43        public static DataSet DecryptDataSetFromXml(string inXmlFilePath)
44        {
45            DESCryptoServiceProvider objDES = new DESCryptoServiceProvider();
46            FileStream fin = new FileStream(inXmlFilePath, FileMode.Open , FileAccess.Read );
47            //用指定的 Key 和初始化向量 (IV) 创建对称数据加密标准 (DES) 加密器对象
48           CryptoStream objCryptoStream = new CryptoStream(fin, objDES.CreateDecryptor(DESKey, DESIV), CryptoStreamMode.Read);
49            TextReader objTxrReader = new StreamReader(objCryptoStream);
50            XmlSerializer objXmlSer = new XmlSerializer(typeof(DataSet));
51            DataSet ds = (DataSet)objXmlSer.Deserialize(objTxrReader);
52            return ds;
53        }

54    }

55}

56
        小结:关于对称加密算法,大家可以参考微软的资料和网上的资料,这里就不多做解释了。下面是源代码文件,里面还包含有字符串和文件加密的方法,当然那些是别人的代码。
/Files/zjzkiss/ClsDoCode.rar

posted @ 2006-06-11 23:20 语风 阅读(2141) | 评论 (2)编辑