IntroduceCreationObject

Last edit November 28, 2014
Refactoring Object instantiation to introduce fake constructors in VisualBasic6

Problem
Bruce Mckinney mentions that one of the biggest failures in VisualBasic (actually now VbClassic) up to version 6 is it's lack of constructors. This causes the problem that once you create a new object in VB, it is in an invalid state until you initialize each field, one at a time, unless you have a convention like, say: "always call the 'Init' method after creating a new object.

However, you have no way to impose the use of such convention and therefore you can't prevent users from using invalid instances of your objects.

Solution
One way I've found I can cope with that is by making all public classes in an ActiveX DLL to be PublicNotCreatable and introducing one single GlobalMultiuse class which I call CCreator, whose only purpose it's to create and initialize the other public classes in the DLL. Notice that this is not a Factory Object pattern, and hence the different name. (It may help to explain the difference for those who are only somewhat familiar with the Factory pattern.)

How to
  • Create a new Creator Class in your ActiveX DLL project. I use CCreator for its name as a convention, but you can use what you like.
  • Change your new class' instancing property to be GlobalMultiuse. This way you can use it's methods like they're part of VB's global functions.
  • Pick one of the other public classes in your DLL and change it's instancing property to PublicNotCreatable.
  • Add a new public method to your Creator Class. I use the convention of concatenating "New" & "ClassName" for the creation method names. So if you're refactoring your "CCustomer" class you'd add a

 Public Function NewCCustomer(sName as String) As CCustomer
	Set NewCCustomer = New CCustomer
	With NewCCustomer
	.Name = sName

' Add your initialization code here

End With End Function
method to the class.

  • Find and substitute every use of
 Set obj = New CCustomer
 obj.Name = sValue
with

 Set obj = NewCCustomer(sValue)
Since your CCustomer class is now PublicNotCreatable, the compiler will warn you if you miss any occurrence of new.

  • Compile and test.
  • Repeat for all your other classes.

-- AlfredoChavez


CategoryVisualBasic