I've said many unkind things about ASP.Net WebForms in the past. While it leaves a lot to be desired as a web development environment, its event driven approach does map to a lot of folks understanding of software. Click a button, execute code in response. Change a radio button, execute code in response. A simple, easy to understand architecture.
Well, sometimes simple and easy to understand.
A number of years ago, Kyle was tasked with updating his employer's "benefits election" site for the new year, and found this:
Protected Sub rdoSmokeYes_CheckedChanged(sender As Object, e As System.EventArgs)
Dim rdoEmployeeYes As RadioButton
rdoEmployeeYes = CType(CType(sender, RadioButton).Parent, Panel).FindControl("rdoSmokeYes")
[...snip...]
End Sub
This is an event handler. If the user altered the rdoSmokeYes
radio button, this event handler will fire. The ASP.Net event handler takes two parameters: the sender
(as an Object
), aka the rdoSmokeYes
radio button, and an EventArgs
object, containing some details about the event itself.
I want to stress: sender
contains the radio button which triggered this event.
Which is why the next two lines are so stupid. We create a variable to hold a RadioButton
, and then we populate it. We populate it by converting the sender
back into a radio button, finding its parent, converting its parent back into a Panel
, then finding the control called rdoSmokeYes
- the very control that triggered this event.
A simple rdoEmployeeYes = CType(sender, RadioButton)
would do the same thing.
But this code contains another WTF. FindControl
returns the type System.Web.UI.Control
, not a RadioButton
. Which means this is a narrowing conversion, which should be a compile time error. Except this is VB.Net, which means you can turn Option Strict Off
, permitting such conversions.
And, as Kyle informs us, this is just an example snippet of a codebase that has huge piles of code very similar to this. But it's even worse- because this convention isn't followed consistently. Nothing about the code is consistent, actually, as the development was done over many years by many developers following no specific kind of standard.