After four years of .NET, n-tier and service-oriented architectures, object-oriented programming and design patterns, I have been assigned a small… “Classic ASP” project, for Reuters. Yeah, you got it, the good’ol plain vanilla ASP, VBScript and so on.
Geez.
The good news is that my technical contact at Reuters is Adam, a good friend and ex-boss of mine (yeah you can become a good friend of your boss… after the company they’ve worked in together has gone bankrupt :) )
Dusting out my (by know fairly limited and mostly forgotten) ASP knowledge, the first thing I found out is that it is increasingly difficult to find information on the web about ASP; the trick was to Google like this: “Session ASP -.NET”, that is, specifying that I do not want .NET-related stuff in my results list…
Once I found this trick, life was easier. The messy part came right after, when I (re-)discovered that “Classic ASP”… is the Land of the Forbidden Maneuver. What I mean is this: ASP development gets harder and longer, not because of the complexity of the business rules or something like that, but just because of (among others) these Major Commandments:
- Thou shalt not store a VBScript class object in the ASP Session unless it is a VBScript Array or a Scripting.Dictionary object: “A somewhat more technical problem can arise when using VBScript classes on the ASP Web server. The ASP server is multithreaded and assigns a different thread to each page request (and hence each script engine). But VBScript class instances are apartment-threaded objects, which means that they must run on the thread that created them. Therefore, attempts to use one instance of a VBScript class on two different pages via storage in Session or Application scope are doubly doomed to failure.”
- Thou shalt not create a disconnected ADO Recordset using JScript unless you mix VBScript and JScript in the same page (which can be tricky, see the next commandment for details)
- Thou shalt not mix freely VBScript and JScript on the same page, even if they say you can; compiler problems may arise and the behavior of your page becomes random…
- Thou shalt not use “Server.GetLastError()” freely; it can be only called from a page that has been set-up as the 500-100 error handler in IIS (which is a problem, if, like me, you don’t have access to the IIS MMC of your client’s server… and your client either - too long to explain…)
- Thou shalt not inherit VBScript classes; code reuse is done through server-side includes: “VBScript 5.0 is not strictly an object-oriented language like C++ or Java. There is no notion of polymorphism or inheritance in VBScript 5.0. Though VBScript classes allow you to define your own objects, you cannot define an object hierarchy where, say, a Terrier class is a subclass of Dog, which is a subclass of Mammal. VBScript classes are merely a way to group data and the operations on the data together to improve encapsulation.”
- Thou shalt not use any “Return” keyword to return a value from a Function; thou must use the (awkward) way of using the function name for that (what if I want to change the name of the Function afterwards, introducing a bug?); if you forget to do this, you will not get a compilation error, not even a runtime error; just a “Nothing” as a return value, and some new white hair for free.
- Thou shalt not use parenthesis when calling a Sub with more than 2 parameters (whoever came up with this idea in Microsoft should be sent to Mars to change the batteries of Spirit and Opportunity, without a space suit)
- Thou shalt define Class properties using the “Property Get”, “Property Let” and “Property Set” (?) statements; the meaning of the first is quite simple, the difference between the second and third one… is arcane.
- Thou shalt always use “Set” when filling up a variable that contains… anything that is slightly bigger than a String: ADO Recordsets and Connections, COM objects of any kind, instances of your own classes… you name it. If you don’t, you will get a meaningless runtime error; not even a compile-time error, a runtime one, and God bless your soul, kid.
- …
Anyway, you get the idea.
A last commandment of the Land of the Forbidden Maneuver, just for our salvation:
- Thou shalt not forget to scan the open-source world to finish in time your Microsoft-related project!
Update 2005-09-25: I forgot to add this one:
- Thou shalt not use the “Multiple Recordsets” feature of the ADODB.Recordset class if you use disconnected recordsets…