首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

资源推荐:代码自动生成、Com开发、串行化反串行化、UI等太多了,该如何解决

2012-12-31 
资源推荐:代码自动生成、Com开发、串行化反串行化、UI等太多了本帖最后由 zhou13816878600 于 2009-06-07 16:

资源推荐:代码自动生成、Com开发、串行化反串行化、UI等太多了
本帖最后由 zhou13816878600 于 2009-06-07 16:21:50 编辑 图片等,贴不出来,更详细内容请在此地址下载:http://99ef.com/我的技术概要.doc
本人目前刚到上海,赋闲在家,坐待识珠之慧眼,Email:63298118@qq.com 
Msn:justthisone@hotmail.com
MobilePhone:13761816466


                     也许我能给您带来不一样的开发体验
 [前言]
      以下要讲到的一系列技术,都是本人在去年的创业过程中,进行的基础技术研发所取得的成果,创业项目虽然失败了,但是技术却攒了下来,这里头结晶着我多年来的软件开发感悟,领域涉及到三层架构搭建、.NET FrameWork在COM下的简易实现、数据库编程、网络通信、UI设计、串行化、通用报表组件等等,成果不敢独享,特拿出来分享。这是我第一次整理它,历时一天,时间很仓促,恐有疏漏之处,请多指教。论述中,叙述性的文字内容较少,更多的是以图片和代码的方式展现。
      
      读完这些,您将会在以下方面有所收获:
1、关于开发成本的节约:
   独有的代码生成体系:配置好脚本后,可自动生成业务逻辑层、数据访问层(包括数据库)及部分界面表示层,约占系统研发的60-70%的代码量,节省60-70%的成本投入,对后期的升级和维护来说,节省的成本,就不好计算了。
2、COM+Html+JavaScript模式,招人不再很难:
   独特的COM+Html+JavaScript模式,让您的研发团队,专业程序员比例大大降低,推荐配置是1名VB(6Or .NET)程序员配2-3名网页设计师,即可完成开发。COM部分,由代码生成体系自动生成,界面表示层部分,由Html+JavaScript来完成,即您的界面,每个窗口内置一个WebBrowser控件,界面以网页(Html)的形式展现在用户面前,通过JavaScript来和COM进行交互,完成网络通信、数据访问、界面展现、用户交互等。
3、VB6下使用.NETFrameWork的简易实现:
   您将可以在VB6下使用.NETFrameWork在COM下的简易实现,可使用.Net下的常用数据类型,如ArrayList、HashTable、Stringbuilder等,可象.NET那样在VB6下进行代码写作,代码复制至.NET IDE下,大多是可以运行的。
另外,我们的代码生成体系,未来会支持生成.NET代码,也方便您的系统未来向.NET迁移。
坦率地说,现在找VB6程序员,是越来越难了,但是.NET程序员铺天盖地都是,就人才的选择来说,只要熟悉. NETFrameWork的人,都可以为我所用。
4、关于部署:绿色化+0配置
   实现纯绿色化,系统由EXE调用若干DLL完成,DLL,可以不注册,程序运行时动态加载,方便系统的升级维护。
界面表示层部分,大多由Html+JavaScript 完成,这些发生变动,也不需要重新编译和发布。
0配置会在该章节中有所描述。 
5、串行化。
   可提供2种方式的串行化,一种是实现了.NET下的IXmlSerializable接口,所有类实例可串行化至Xml,,类实例也可从Xml进行反串行化。二是类实例可串行化至Bytes字节流,方便互联网传输,也可以从Bytes字节流反串行化成类实例。
这个在VB6下的意义是很重大的,到底有多重大,如果您写过文件的结构化存储和网络通信方面的应用,就深有感触了,具体的使用,就不赘述了。
6、UI。
   如果您是从事触摸屏开发的,请一定要留意,不是的,也可稍加留意,将向您诠释一种全新而优雅的界面表达方式。
7、其他。
   网络通信、报表等,这是所有管理类软件都会碰到的问题。

[正文]      
一、关于代码生成体系
    VB6是一门没落的语言,曾经的辉煌已是昨日黄花,新的技术层出不穷,每一门语言新出伊始,都在炫耀自己在面向对象方面的成就,比如继承,比如多态,有了这些特性,如何地实现了代码复用,如何节省了代码,但是如果有一天,您都不需要写代码,大部分的代码都是生成的,继承、多态等等,又能算得了什么呢?我有独特的代码生成体系,配置脚本后,可直接生成业务逻辑层、数据访问层(包括数据库)及部分界面表示层,跟市场上的代码生成器不一样的地方,他们更像是一个工具,作为IDE的一个插件存在,一个个类模块或是存储过程单独生成,而我的代码生成器,除了是个工具外,它生成的是一个解决方案,直接生成的是Dll 工程的文件,大致如下:
    图片(请下载原文:http://99ef.com/我的技术概要.doc) 
    Classes文件夹下存有这个工程里的所有类,其下有 Common、Private、Public、Static四个文件夹,分别存的是通用类、私有类、公共类及静态类,DataBase文件夹存放的是数据库文件、Docs存放的是关于这个Dll的html格式的说明文档,Tasks存放的是一个任务列表文件,即脚本中定义的需要手动完成的代码部分,其他文件夹,就不再特殊说明了。在我的项目中,自动生成的代码,约占总代码量的70%之巨。您想象成本可以节省多少?

   以下举的例子是一个学生信息管理的简单例子,管理了每个学生和家长的信息。生成的类库叫DySchoolMgrLib,结构比较简单,仅仅有 Student、Father两个类,其他的类都是辅助类。不废话了,贴图。
   图片(请下载原文:http://99ef.com/我的技术概要.doc) 

   Student类成员列表,熟悉.NET FrameWork 的朋友是不是看到一些似曾相识的东西呢?Clone,GetHashCode,ToString,Equals等等,当然,还有Serialize等,Clone代表这个类实现了ICloneable接口,GetHashCode,ToString,Equals代表了这个类继承自Object, Serialize代表了这个类实现了IXmlSerializable接口。
   图片(请下载原文:http://99ef.com/我的技术概要.doc) 

   Student类的静态成员。比如,我们可以写这样的代码:
   

Call Student.Delete("001")   ‘//删除学号为 001的学生信息。

   此时,Student是不用初始化的, 熟悉.NET编程的人,是不是很眼熟呢?其实Delete就是Student类的静态成员。
我们来看看,在以下窗口中,显示学号为001的信息及其父亲的姓名,修改后,点 Ok 按钮保存至数据库。
   图片(请下载原文:http://99ef.com/我的技术概要.doc) 
   其代码如下:

   Option Explicit
   Private m_Frm          As DyADODB.dyForm      '//对当前窗口生成其DyForm


   Private m_Std           As DySchoolMgrLib.Student  '//当前学生信息
   Private Sub Form_Load()
     Set m_Frm = NewdyForm(Me)              '//以本窗口来生成 DyForm  
     Set m_Std = Student.GetInstance("001", , , , _
                             dyPropsFtGUID Or dyPropsFtName)  
        '//关联查询的示例,从学生表中,获得学号为 001的学生实例,同时从父亲表中'//获得其父亲的信息。
        '//dyPropsFtGUID Or dyPropsFtName代表同时获取其父亲的 GUID 和 姓名。
     Call Student.WriteTo(m_Std, m_Frm, , "S")   
        '//显示学生信息
        '//理解成,将 学生 实例m_Std,写入m_Frm,,按照名称为 "S" 的视图写入
     Call Father.WriteTo(m_Std.Father, m_Frm, , "F")                  
        '//显示其父亲信息,解释同上 
   End Sub
   Private Sub cmdOk_Click()
     Call Student.ReadFrom(m_Std, m_Frm, , "S") 
        '//将当前窗口控件中的数据读至 m_Std 实例,按照名称为 "S" 的视图读入
     If Student.Update(m_Std) Then           
        '//向后台更新该Student 实例
        MsgBox "Succeed"
     Else
        MsgBox "Failure"
     End If
   End Sub



    整个过程,看不到数据库连接的部分,看不到SQL语句,看不到 Recordset,看不到从Recordset中取值赋值到窗口控件的过程,所有的操作,都是通过操作对象的方式完成,仅仅1行代码,完成了数据访问读取,并且是对两个表的关联查询,两行代码,进行了界面展示,1行代码,进行数据的后台写入。如果都是手写,手写SQL语句,手动操作Recordset,手动赋值到窗口控件等等,大概需要多少代码呢?有兴趣,不妨测试一下。

   再来一些例子,比如按条件获取某个学生实例,会用如下函数:
   Function GetInstanceFor([vCondition], [vSort], [ByVal lProps As dyPropsStudentEnum], [ByVal sViewName As String], [lTableOn], [ByVal lPropsFather As dyPropsFatherEnum]) As Student                                        DySchoolMgrLib.StudentStatic 的成员
vCondition条件
vSort排序的方式
lProps指定获取哪些属性字段,以Or 的方式连接。
sViewName字段名是否有前缀。
lTableOn指定表,默认是 Student表。也就是说 Student实例可以不只在 Student 表读取。
lPropsFather读取Student的同时,选择对其 Father 的哪些字段进行读取


   Set m_Std = Student.GetInstanceFor(Student.NewCondition(dyPropsStNo, dyEqual, "001"), , , , , dyPropsFtGUID Or dyPropsFtName)
   vCondition 我们用了一个条件(Condition)的对象,当然,这段代码我们还可以这样写:
   Dim oCd           As DyADODB.Condition  
   Set oCd = Student.NewCondition(dyPropsStNo, dyEqual, "001")


   Set m_Std = Student.GetInstanceFor(oCd, , , , , dyPropsFtGUID Or dyPropsFtName)



   虽然代码冗长了,但是更加明了,代码的可维护性也增强了,运行效率跟前一段没有区别。如果条件是多组的呢?比如学号为 001 同时 姓名为 毛主席。我们可以这样写:

   Dim oCd           As DyADODB.Condition  
   Set oCd = Student.NewCondition(dyPropsStNo, dyEqual, "001").Append(Student.NewCondition(dyPropsStName, dyEqual, "毛主席"), dyClauseUseForDB, dyAND)
   注意到Append了没?或是这么写:
   Dim oCds          As DyADODB.ConditionClause
   Set oCds = NewConditionClause
   Call oCds.Append(Student.NewCondition(dyPropsStNo, dyEqual, "001"))
   Call oCds.Append(Student.NewCondition(dyPropsStName, dyEqual, "毛主席"))
   Set m_Std=Student.GetInstanceFor(oCds,, , , , dyPropsFtGUID Or dyPropsFtName)
   这里的oCds相当于这样的 WhereClause : No =’001’ And Name = ‘毛主席’


   这样的程序风格,应用到整个体系中了,比如Update函数,其原型如下:
   Function Update(ByVal oInstance As Student, [ByVal lProps As dyPropsStudentEnum], [ByVal sViewName As String], [lTableOn]) As Boolean
   上述窗口示例代码中的保存代码如下
     Call Student.Update(m_Std) 
   如果我们只想保存姓名和地址,那么这段代码可写成
     Call Student.Update(m_Std, dyPropsStName Or dyPropsStAddress)
   类似这样的函数,几乎囊括了大部分的数据库访问应用,就不一一赘述了。

   在上述的若干示例中,我们看到了dyForm、Condition、ConditionClause 等数据类型,他们来自 DyADODB 库,是我们的一个核心库,代码生成器生成的Dll,调用这个核心类库来完成相关工作,当然,您也可以直接调用它来完成相关工作。这里用的是Lite版,由38个类组成,涉及到数据访问、界面表示、多语言的支持、类的反射机制(概念来自.NET,JAVA)等。如下图所示:
    图片(请下载原文:http://99ef.com/我的技术概要.doc)

    比如ADOShape,熟悉Shape语句的人,可以看看,不熟悉的,建议熟悉熟悉Shape语句,对您的开发工作有帮助的。比如我们要查商品的信息,及其厂家的信息,以及厂家老板的信息,千万不要写成三个SQL语句,然后分别进行查询,我们可以写下面的Shape语句,由ADO的Connection.Execute后返回形状Recordset,具体如何从形状Recordset中读取数据,请参考MSDN:
    SHAPE {Select GUID,Name From Goods} 
      APPEND 
      (( SHAPE {Select GUID,Name From Factory} 
           APPEND 
           ({Select GUID,Name,Address From Boss} 
              RELATE Boss_GUID TO GUID ) AS RsBoss)
         RELATE Factory_GUID TO GUID ) As RsFactory
    这里是个三层的Shape语句,有兴趣的人手写看看,3层该没问题,但是层数多了,问题就大了。有了ADOShape后,所有问题都迎刃而解,以下代码,将输出上述的Shape语句,并且是格式化过的:


    Dim o                As ADOShape
    Dim oChild           As ADOShape  
    Set o = NewADOShape("Select GUID,Name From Goods")                     '//查出商品
    Set oChild = o.AppendChild("Select GUID,Name From Factory", "Factory_GUID", 


                               "GUID", "RsFactory") 
      '//查处商品对应的厂家信息
    Call oChild.AppendChild("Select GUID,Name,Address From Boss", "Boss_GUID", 
                            "GUID", "RsBoss")      
      '//查处厂家对应的老板信息  
    Debug.Print o.ToClause
       '//输出上述的 Shape 语句。



   再如 ListValueSeed(列举子) 类

    Dim oLs             As DyADODB.ListValueSeed  
    Dim v               As Variant
    Set oLs = Student.NewListValueSeed(dyPropsStName, dyListValueDistinct Or dyListValueWithoutNull Or     dyListValueWithSinglequotes)
    ‘//初始化列举子,列出 Name 的列表
    ‘//dyListValueDistinct 代表不重复,
    ‘//dyListValueWithoutNull代表排除 Null 值
    ‘//dyListValueWithSinglequotes代表每个值以双引号包含返回。
    Call Student.ListValue(oLs)
      ‘//进行列举
    For Each v In oLs.Result
      Debug.Print v
    Next  
     ‘//输出结果


    再如 Datas 类。其中内置了 SelfEnum机制,如下例

    Dim oStudents       As DyADODB.Datas
    Dim oStudent        As Student  
    Set oStudents = Student.GetInstances(True, 10, , dyPropsStName Or dyPropsStNo, , _
                                         Student.NewSort(dyPropsStNo, dySortASC))
       '//获得学生的集合,按照 No 进行排序,取出前10名
    For Each oStudent In oStudents
      Debug.Print oStudent.Name
    Next
      '//输出 学生的姓名
    说到这里,我们将.NET下的枚举子概念引入进来,您会发现很方便应用。
    Dim en       As IEnumerator 
    Set en = oStudents.GetEnumerator  
    Do While en.MoveNext
      Debug.Print en.Current.Name
    Loop
      '//输出 学生的姓名


    看到这里,细心的您会发现,比上一段示例来说,实现了相同的功能,但是减少了一个变量的声明(oStudent)。
   
    DyADODB 由38个类组成,数目也不算少,涉及的面也比较广,我就不一一介绍了。

    我始终认为,编程中,少些明文形式的字符串是好的习惯,毕竟以明文方式存在的字符串,其本质来说是常量,是不参与编译的,其内容只会产生运行时错误,而不会产生编译错误,就软件产品的品质来说,我们就很难控制了,在这套体系中,您不用手写SQL语句,相关的代码写作,更多的是以选择枚举的方式进行辅助编辑的,如 Update 函数


    Function Update(ByVal oInstance As Student, [ByVal lProps As dyPropsStudentEnum], [ByVal sViewName As String], [lTableOn]) As Boolean
    我们在实际编码时是如下的这番情形:
    图片(请下载原文:http://99ef.com/我的技术概要.doc)

    相比手写 Update 语句sSQL = "UPDATE Student Set No = '001',Name ='NewName'",我们编程的体验,会更轻松,而且将错误控制住了,因为手写的机会大大减少,更多的是在做选择。

    这套体系,让您不用关心数据库是什么,比如到底是Access还是SQLServer,都不需要关心,也不用关心各数据库平台的保留字冲突,我的框架替您搞定,在您的眼里只有类,基础的业务逻辑层及数据访问层由生成器生成,并且提供界面展现的辅助,您只需要考虑业务,只需要考虑如何在界面表示层尽忠地表达自己的想法,满足用户的需求。

    这套体系,也让您将来跨越到.NET成为了可能,提供了类似.NET的开发体验。这是一种全新的开发理念,将彻底改变管理类软件的生产方式,也将改变产品品质控制的局面,让软件的生产过程由 纯手工 向 程序半自动化 的方向转变。快来搭上这班车吧,除此之外,您还等什么呢?




[解决办法]
谢谢!
[解决办法]
thanks very much
[解决办法]
jf
[解决办法]
csdn改版了?
[解决办法]
学习一下
[解决办法]
敢问楼主是做了什么 项目,有如此的众多的积累?
[解决办法]
前段时间在做序列化(反序列化)时失败了,用纯VB6编写、TCP/IP协议,难度太大了。
[解决办法]
顶个,辛苦了e
[解决办法]
学习的好地方啊

[解决办法]
UP
[解决办法]
mark
[解决办法]
学习下。
[解决办法]
thanks a lot
[解决办法]
支持
[解决办法]
思路非常不错,支持一下!
[解决办法]
我看过到楼主的另一篇文章,非常佩服楼主.
[解决办法]
就是你找工作的那篇.
[解决办法]
LZ 精神灰常不错!顶起
[解决办法]
好贴,不可不顶!哇塞....牛X的....
[解决办法]
继续学习

热点排行