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

zhou13816878600 2009-06-07 04:01:10
加精
图片等,贴不出来,更详细内容请在此地址下载: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的开发体验。这是一种全新的开发理念,将彻底改变管理类软件的生产方式,也将改变产品品质控制的局面,让软件的生产过程由 纯手工 向 程序半自动化 的方向转变。快来搭上这班车吧,除此之外,您还等什么呢?



...全文
1453 55 打赏 收藏 转发到动态 举报
写回复
用AI写文章
55 条回复
切换为时间正序
请发表友善的回复…
发表回复
brambleslx 2010-10-28
  • 打赏
  • 举报
回复
楼主很强大,要坚持下去
LQ_651119244 2010-09-25
  • 打赏
  • 举报
回复
my13513480001 2010-02-15
  • 打赏
  • 举报
回复
话说学vb也好几年了
不知为啥,怎么都转不到net中去
哪位大牛给俺指引方向啊
leer168 2009-12-14
  • 打赏
  • 举报
回复
MARk 崇拜一下
Lee 2009-07-06
  • 打赏
  • 举报
回复
继续学习
码之魂 2009-07-02
  • 打赏
  • 举报
回复
好贴,不可不顶!哇塞....牛X的....
zhou13816878600 2009-06-15
  • 打赏
  • 举报
回复
UP
su272009 2009-06-14
  • 打赏
  • 举报
回复
LZ 精神灰常不错!顶起
zhou13816878600 2009-06-14
  • 打赏
  • 举报
回复
呵呵。是一篇。
lyserver 2009-06-14
  • 打赏
  • 举报
回复
就是你找工作的那篇.
zhou13816878600 2009-06-14
  • 打赏
  • 举报
回复
TO:lyserver,请问你看的是哪一篇?呵呵
lyserver 2009-06-14
  • 打赏
  • 举报
回复
我看过到楼主的另一篇文章,非常佩服楼主.
zhou13816878600 2009-06-12
  • 打赏
  • 举报
回复
开源暂时没想,但是有想过组成一个联盟性质的,联盟内部免费使用,大家一起合作。呵呵。
嗷嗷叫的老马 2009-06-12
  • 打赏
  • 举报
回复
思路非常不错,支持一下!
jhone99 2009-06-11
  • 打赏
  • 举报
回复
支持
proer9988 2009-06-11
  • 打赏
  • 举报
回复
非常棒的想法。项目开源吗 ? 可否试用一下 ?
zhou13816878600 2009-06-11
  • 打赏
  • 举报
回复
谢谢各位,谢谢所有捧场的。
zhou13816878600 2009-06-10
  • 打赏
  • 举报
回复
UP
zhou13816878600 2009-06-10
  • 打赏
  • 举报
回复
UP
Dogfish 2009-06-10
  • 打赏
  • 举报
回复
thanks a lot
加载更多回复(35)

1,066

社区成员

发帖
与我相关
我的任务
社区描述
VB 资源
社区管理员
  • 资源
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧