Side effects are bad: a personal illustration
One of the things they tell you in programming school is 'side effects are bad; you should avoid them if possible'. Apparently every now and then I need a reminder of this, because side effects were at the bottom of my feed whoops from last night.
One of the most expensive bits of DWiki is converting pages from DWikiText into HTML. Originally the conversion was simple and straightforward; stick wikitext in, get HTML out. But as DWiki grew more features, the wikitext started having additional information: whether people could see it, whether people could comment on the page, and so on. These days converting a page to HTML generates all of:
- the HTML
- whether the page restricts access and/or allows comments
- various fuzzily defined features of the page
- the title of the page, if any
The conversion routine returned the HTML and recorded everything else by
manipulating a per-request context
structure; in other words, through
side effects.
One of the problems with side effects is that you forget them, which is just what I did when I added caching of the conversion process. I remembered the other two side effects and cached them (partly because I'd been working in the area recently), but forgot about page titles. When the cached data was restored, page titles weren't set and things reverted to default titles in feed entries.
(One of the reasons I forgot about the page titles is the other problem with side effects, namely that they're usually scattered over the code instead of centralized in one spot. If the renderer had returned all of the results in one structure and broken them up later, I might not have wound up in the pickle I did.)
Update, April 1st: I just discovered another side effect I had
forgotten; updating the timestamp for the request's Last-Modified:
header. Oh the irony; apparently I like playing April Fools' jokes
on myself.
|
|