- Feature Articles
- CodeSOD
- Error'd
- Forums
-
Other Articles
- Random Article
- Other Series
- Alex's Soapbox
- Announcements
- Best of…
- Best of Email
- Best of the Sidebar
- Bring Your Own Code
- Coded Smorgasbord
- Mandatory Fun Day
- Off Topic
- Representative Line
- News Roundup
- Editor's Soapbox
- Software on the Rocks
- Souvenir Potpourri
- Sponsor Post
- Tales from the Interview
- The Daily WTF: Live
- Virtudyne
Admin
<FONT style="BACKGROUND-COLOR: #efefef">Is it really a wtf? To me it just shows the reason we now have asp.net.</FONT>
<FONT style="BACKGROUND-COLOR: #efefef">Legacy asp is fine, but if you use it, then stop talking about pure object-orientation. It isn't gonna happen.</FONT>
Admin
???? It doesn't matter what platform this is done on or what language is used -- this would still be an abuse of OOP. Sometimes abstraction can be taken too far (Jackson Pollack), and there's been a well-supported rumour that a single class can support several methods.
Admin
Do the database access class names really end in "CRUD"? That should tell you something right there.
Admin
[quote user="Stan Rogers]there's been a well-supported rumour that a single class can support several methods.
[/quote]
You lie! [;)]
Admin
What I meant to says was:
You Lie! [;)]
Admin
I have to admit that, although the code could use a rewrite it doesn't look like a major WTF in itself to me.
The comments below, though, just blow me away. It uses a seperate class for every method? And all those classes need to be initialized? Sjeez... That's quite some overhead :). I guess it'd be quite more 'elegant' if you just put them all in one 'User' or whatever class and promote some of them to 'Shared' or static methods (shared bool AccountExists(string name), for example). Yes, at this, I say: WTF!
Admin
Whoever wrote this was surely hardcore.
You know they put in some serious hours at the job for this one...jeez-louise!
WTF
Admin
The only thing this guy got right is dividing up the If statements like that. It doesn't look at all pretty, but if you were to put all of them on the same line, VB will perform them ALL even if it encounters one that fails. The programmer still sucks because of the instantiating of a COM object with every call. Ugh.
Admin
<font size="4">"Do the database access class names really end in "CRUD"? That should tell you something right there."
That's a DB Component development in-joke. I've worked on plenty of CRUD systems, and they are often called CRUD, even when they aren't crud.
(For those who were genuinely wondering)
</font> <font size="4">CRUD = Create, Read, Update, Delete.</font>
Admin
Are you sure this isn't part of your forum software? [:P]
Admin
Good old Structured Programming collides with newfangled Object Oriented.
Admin
Something tells me a few different teams did different pieces of this in wildly different ways, and then found out they had to integrate them parts. :p
(That style is a pet peeve of mine. I prefer a clear, concise list of failure situations, followed by unindented code, rather than a mountain of indents whose side effects you can only find by searching for the same indented one and praying the indentation is correct. Obviously it doesn't matter for branches that are equally complex or where each side has to pass through for cleanup... but WHY make it so much more difficult to read here? Ingrained habit?)
Admin
<font face="Times New Roman">I too prefer the unindented style that returning from the middle of a function gives you:</font>
<font face="Courier New"> If</font><font face="Courier New"> sUserName == "" Then
Response.Redirect("login.asp?Err=1")
Return
End If
If Not CheckLicences(sUserName) Then
Response.Redirect("login.asp?Err=6")
Return
End If</font>
<font face="Times New Roman"> However, the real problem here is that he broke the cardnal rule of if/else statements: put the short case first:</font>
<font face="Courier New"> If sUserName == "" Then
Response.Redirect("login.asp?Err=1")
Else
If Not CheckLicences(sUserName) Then
Response.Redirect("login.asp?Err=6")
Else
...
End If
End If
<font face="Times New Roman">If you do that, you do get a bit of nesting, but it's still quite readable.</font>
</font>
Admin
Don't you just love the totally arb mix of negated and non-negated conditions as well?
Admin
Anybody notice that it checks the password if the CheckDisabled returns true? Then it only allowed disabled user to login?
Admin
If Not(CheckPasswordExpDate(sUserName, sPassword)) Then
<FONT color=#000000>This strikes me as a function having the wrong name...</FONT>
<FONT color=#000000>A function called 'CheckPasswordExpDate' makes me think it returns something other than a boolean. Maybe a Date?</FONT>
<FONT color=#000000>They should have called it 'CheckPasswordExpired' IMHO.</FONT>
<FONT color=#000000></FONT>
<FONT color=#000000>Drak</FONT>
Admin
Classic!
Admin
Classic.
That's what I meant to say, *mutters something about the board*
Admin
Is that like programming by evolution or the Evolution Pattern?
Are we talking mutation here?
Admin
I always thought a fun (albeit perfectly pointless) way to do a state machine would be to write a set of functions which return pointers to each other (or references, if that's what the language supports (but not closures with their own state -- don't make me come over there!)).
In C/C++, of course, you can't define a function which returns a pointer to itself (this is a logical impossibility, not a language feature; think about it). So you'd have to resort to goofy typecasts, which would spoil the fun. You could, however, define a base class with a single pure virtual which returns a pointer to the base class. For each state function, you would then derive a class from the base. None of the classes would have any data members, nor any member functions other than the one virtual. Define one instance of each (the state functions can't be static, for obvious reasons), and you're in business.
Now that would be a "curious perversion", but not a WTF. But contemplate this: If your base class were a COM interface, your state machine could be arbitrarily extensible. And that might actually be worth doing.
Admin
Really ? Never heard of function pointers ? If you can design a function that call itself, why this same function would not be able to return a pointer to itself ?
I'm sure its possible... probably that this code would make a good entry here, but still ;-)
Admin
No, they should have called it
<FONT face="Courier New">HasPasswordExpired()</FONT>
or
<FONT face="Courier New">PasswordHasExpired()
</FONT>(as in "<FONT face="Courier New">If User.PasswordHasExpried then</FONT>" --- see? it's like English!)
We want names which not only indicate what is the type of the return value, but also make it clear what that value means.
Admin
Yes, we have, and no it's not.
Consider the general form :
<FONT face="Courier New">T func(void);</FONT>
A pointer to such a function would be
<FONT face="Courier New">T (*pfunc)(void);</FONT>
Now, it declare a function returning a pointer to itself, you'd have to substitute the second code snippet in for T in the first. But, you'll still have a T in there, so you'll have to substitute again, and again, and so on. You're stuck with a recursive declaration with no end it sight.
Admin
hmmm, looks like you are right ;-)
Good discussion here
Admin
Yes! You finally fixed the horizontal scrolling - that was bugging me for so long.
Keep up the good word - I'll read the post in a few mins.
- Reagan Williams
Admin
bah, trivial:
typedef void * (*returns_self) (void);
void* IReturnMyself(void);
main()
{
returns_self recurseforever = IReturnMyself;
while (1)
{
recurseforever = ((returns_self)recurseforever());
}
}
Admin
The original statement was
Your example doesn't do that. It defines a function which returns a void* and then uses a sledge hammer to pound it into the right type. (Note that a void* is required to be able to hold a pointer to any data type, but is NOT required to be able to hold a pointer to a function)
Admin
Here's to hoping a quote of a quote works :P
There's no way to do this by declaring the function without any content beforehand is there (God, what's that called again? Pre-declaration?)? I'm not sure, that's why I'm asking [:S]
Admin
For what it's worth dept:
The following compiles in Component Pascal:
MODULE Test;
TYPE
StateFunc = POINTER TO EXTENSIBLE RECORD END;
PROCEDURE(x:StateFunc) Do():StateFunc, NEW, EXTENSIBLE;
BEGIN
RETURN x;
END Do;
END Test.
Maysonl at gmail
Admin
wtf: Here it is in Component Pascal(see www.oberon.ch/blackbox/)
MODULE StateFuncs;
TYPE
State* = POINTER TO EXTENSIBLE RECORD
func*: StateFunc;
END;
StateFunc* = PROCEDURE (x: State) : StateFunc;
END StateFuncs.
Admin
A fine example of why "a code block should only have one exit point!" is a bad idea.
Mind you - soneone ought to explain elseif (or elif) to this person.
Admin
A very old joke, you whippersnapper. Create/Review/Update/Delete. Used for any formm whose basic role in life is to allow a user to edit a row or rows in a database.
Admin
Object Oriented builds on structured. Each generation of computing languages has done the same job: to encapsulate complexity into managable chunks.
Admin
And it would return type "pointer to a function returning a pointer to a function returning a po ...". Hmm. I guess you'll just have to make it a void* and cast it.
Or,
which is how you do polymorphism in OO languages.
Admin
That's functional programming!
Admin
"But if your object-oriented solution is a class for each function you need, I'm not sure any enterprise architecture pattern will help."
This is crafted to imply that "a class for each function you need" is inherently bad, which is a very naive position to take. The real problems, here, are duplication and coupling.
This duplication and coupling problem appears to extend down into the two COM layers mentioned in that every UI method corresponds to one business rule object and every business rule object corresponds to one data access object. It seems unlikely for this to be a natural design.
The number of functions per class have nothing to do with it.