我被赋予了修改VB6项目的任务.没有什么是非常严重的,添加了几个表单并修复了一些bug.该项目使用SQL Server(如果有任何相关性).
我在编程方面的背景是VB/C#.NET,PHP,C++和MySQL,尽管我使用的SQL Server规模要小得多.任何人都可以给我什么样的建议或VB6编程的资源.自从我完成任何VB .NET工作已经有几年了,虽然我可以阅读VB6代码并了解发生了什么,但我不确定我能够开始写作和/或修改没有破坏任何东西的机会.
别人可以提供什么样的建议?任何资源和/或故事都会很棒.随意提供你可能感觉相关的东西,但我忽略了.
谢谢!
它可能已经存在,但请确保Option Explicit位于所有文件的顶部.它强制变量声明,并减少错误无意中动态创建变量的机会.
VB6有一个破碎的类型系统 - 实际上它有两个不完全兼容的类型系统.在架构上,VB4-6是一个比COM更薄的包装器,并使用COM的类型系统.VB的早期版本有自己的类型系统,它是传统BASIC和C之间的交叉.两者不能自由混合和匹配.
没有继承,也没有真正的异常处理,所以期望为错误处理和反复重复的基本表单函数编写大量的样板代码.这就是VB获得剪切和粘贴软件工程的声誉.
您可以在VB中声明的某些类型不是"自动兼容",这意味着它们不能在COM边界上序列化或存储在Variant中(稍后将详细介绍).这些类型可以追溯到VB不支持COM的VB4-6之前的日子.其中一种类型是记录(如ac结构)类型,其名称会使我逃避,因此结构的可扩展集合或关联数组(这是人们可能想要做的自然事情)是不可能的.定义一个类(见下文)是可能的,但有点笨拙.
VB不支持多线程,其解决方法有许多问题.如果您使用MTS或COM +进行3层开发,第一个可能会咬你.创建VB模块实际上是在幕后创建一个单独的COM对象.这将住在自己的单线程公寓.公寓本质上是轻量级运行COM服务器,具有序列化/反序列化机制(称为消息泵),其中调用被序列化并排队等待单个线程.如果您(在表面上)做了明智的事情并尝试模块化您的代码,您将在您的中间层创建热点.解决方案:更多剪切和粘贴.
第二个主要问题是COM的垃圾收集是相当基本的 - 一个简单的引用计数机制.这意味着COM组件崩溃或由于某种原因在自身泄漏内存后没有整理.还记得VB6如何只是COM上的薄层吗?这种紧密耦合意味着在使用UI管理代码时必须非常小心,该代码保存对控件的引用,外部应用程序上的OLE自动化(例如Excel)或任何其他设置引用的内容.VB很擅长做背后隐藏的东西而不知道什么时候自己清理.它也是幕后产生的循环引用的来源.得到这个错误,它会泄漏资源 - 你需要小心这一点.
另一个主要问题是变种.我见过的Variant类型的最佳描述是'Spreadsheet Cell'.这些可能会造成很多恶作剧,特别是Variant Arrays.许多API仅适用于变体或具有使用变体的随机部分(Excel会执行此操作),因此您无法始终避免使用它们.如果你在COM边界上串行化(例如多个断开连接的Recordset),你很快就会学会厌恶Variant Arrays.
您可能会发现VB的类型系统如此破碎,以至于维护非平凡复杂数据结构的最简单方法是执行一个库,该库以字符串形式对其进行编码,并基本上对其进行串行化和反序列化.VB6应用程序中的复杂数据结构几乎不是起始者.
最后,在使用VB6的GUI工具包之后,您将了解到WinForms团队从VB6团队的错误中学到了多少.
虽然它被宣传为简单易用,但是由于所有的架构缺陷和小问题,在VB中构建一个非平凡的应用程序而不会弄得一团糟.这是Spolsky的Leaky抽象定律的一个很好的例子..
Appleman 在Visual Basic 6中开发COM/ActiveX组件对COM与VB6交互的细节有很好的处理.他在Win32和VB编程方面也做得很好..
PS(谢谢你提醒我Daok),如果你发现有人一直在使用On Error Resume Next
,你有我的许可,头撞他们.
因为我在Visual Basic上切了我的话(简历说VB3-6 10多年),我会尝试用"On Error Resume Next"以外的东西来回答你的问题(它确实如此,但你会发现它)到处都是,或者你不会,这更糟糕).您可以执行以下操作:
当你接管一个VB项目时,最困难的事情通常是让它在你的机器上编译.这通常是由于对原始开发人员机器上安装的内容的破坏引用,而不是在您的机器上(也就是"DLL Hell").您只能希望安装程序仍然存在于某处,或者如果不存在,您总是可以将DLL和OCX删除到系统目录中(请记住注册它们).有时DLL Hell来自破坏的内部引用.VB开发人员通常喜欢将应用程序划分为尽可能多的不同组件项目.当你将所有内容组合到一个应该是最初的一个该死的项目中时,你的兼容性问题通常会消失很多或全部.
一旦所有内容都编译完成,那么你就有99%.这里的帖子中提到的大多数常见问题都是立即在应用程序中出现的问题.如果您继承的应用程序是一个简单,可靠的应用程序,这些年来一直在悄悄地嗡嗡作响(它发生在VB中),您可能会很好.
一旦你从IDE编译和工作的应用程序(我认为那是当时的名称),你可以开始尝试在这里和那里进行小的改动.
在这里发布您的问题.提醒过去很有趣.
关于Visual Basic一般来说,我会说不相信反炒作.它是一种允许良好代码或错误代码的语言,与其他语言非常相似.请记住,所有可怕的VB程序员现在都是可怕的C#程序员.
请不要使用" On error resume next ".
如果您的应用程序使用ActiveX DLL项目,那么您确保这是最小化DLL地狱的情况
将您的DLL设置为BinaryCompatibility.
确保您有一个Compatible目录.
把Last版本的DLL放在那里.
将二进制兼容性指向该DLL.
确保您的EXE和DLL编译到它的项目目录.
在测试时从它的项目目录运行EXE.它将使用您编译的DLL.
您需要编写一个实用程序,以便您可以按正确的顺序单独编译每个项目.VB6 Compilier可以从命令行运行.
使用Virtual PC或其他计算机测试您的设置.
尽管缺少继承,您会发现VB6能够实现许多常见的面向对象设计模式.如果您查看设计模式,可重用面向对象软件的元素,您将看到大多数模式涉及实现接口而不是继承行为.他们从第16页开始讨论这个问题.
强类型集合不是直接实现的,您可以使用包括readonly Item属性在内的所有内容编写集合.完成后,您需要点击{F2}并调出对象浏览器.找到您创建的集合类,然后右键单击Item.
你需要
选择属性
单击"高级"按钮
将过程ID更改为默认值
然后Item将成为默认属性,Strongly类型集合将按预期运行.
要在集合类上启用For Each,您需要添加它
Public Property Get NewEnum() As IUnknown Set NewEnum = mCol.[_NewEnum] End Property
mCol是私有Collection变量的名称
再次使用对象浏览器并右键单击NewEnum.
你需要
选择属性
单击"高级"按钮
将过程ID更改为-4
请记住,Integer是16位,Long是32位.我建议将大多数整数变量声明为Long.在当天,它对于速度和内存占用至关重要,但对于今天的计算机,最好只使用Long而不用担心超出限制.
像其他地方建议使用Option Explicit.
Visual BASIC 6非常擅长隐式类型转换.如果您想确定,您可以使用Cxxx系列转换功能.
Variant在处理各种对象类型(包括类)时优于.NET的对象.如果您需要创建一个处理数据库的自定义表单,并且用户可以选择要用于该表单的表,您可能会发现它很有用.使用Variant可以更轻松地处理不同表的字段属于不同类型的事实.
Visual Basic 6可用于制作多层应用程序.表单可以实现类可以的接口.
请记住,在编译和编辑表单时会运行ActiveX控件.如果您不了解它,可能会引起各种陌生感.如果您有自己的ActiveX控件,这尤其成问题.