Let’s start off similar to Finishing BattleTop, with the elevator pitch that I would have created for DotaGrid at the start:
I’m hacking a web app together to quickly create a well-aligned grid of heroes for the picking-stage at the start of a Dota 2 match, so I have something to use while dota2layout.com is down.
There’s a few important things to note here:
- “hacking”: Yes, this is throwaway code, even though it’s open source. Heck, the main code files are called
myMonolithicApp.js
andtempHeroesJson.js
. - “well-aligned”: I prefer my hero layout to be aligned to a grid with some very minor spacing between items. I.e. there’s no option to turn off “snap to grid”.
- “Dota 2“: Yes, this entire pitch and the tool itself assume you know and play Dota 2. Or that you know me personally and are willing to struggle through the Dota 2 specifics of this post.
- “so I have something“: The key word being “I”. Even though I’ve shared the app and its source, it was mainly something I created to satisfy my own need.
That last point is really rather important here, and it greatly affects the way I want to “wrap up” this project. But before I talk about that, let’s first look at something that seems to be in big contrast with this point.
Even though my first ever Reddit post was well-received, Reddit has always felt as a moderately hostile environment. Depending on the particular subreddit, folks can be rather harsh and direct, not always in a well-founded fashion. But there was only one way to test that assumption and face my public-reddit-humiliation-fear: by posting something. I felt my DotaGrid tool was decent enough to be of some use to others as well, so I decided to post it on Reddit. Here’s a screenshot of my post:
This got me some decent votes and upvote percentage…
…some friendly remarks…
…some suggestions…
…and some low-on-details bug reports…
…but in any case, overall comments felt friendly. So even though I wrote the tool for my personal use, deciding to share it seems like a good idea in hindsight.
The Code
Looking at the code now, a few months after I wrote the tool, I must say I’m not too disappointed. Sure, it’s “hacked together”, and according to Feather’s definition it’s legacy code, as it doesn’t contain unit tests. However, the code’s structured well enough to add those after all and work from there. For example, have a look at this typical view model property:
1 2 3 4 5 6 7 8 9 10 11 |
self.isDimmed = function(cell) { if (!self.freeTextFilter()) { return false; } if (!cell.hero()) { return false; } return cell.hero().name.toLowerCase().indexOf(self.freeTextFilter().toLowerCase()) === -1; }; |
Not quite great code, especially that final (rather frail) line of code, but at least it’s concise, clear, and potentially unit testable.
If I were to rewrite the tool I do think I’d need to separate things a bit more. Especially the fact that the internal grid model (which hero sits where) and the rendering bit should be decoupled. This would also be necessary if I were to create a more responsive version that possibly doesn’t use a table for layouting the grid (but either a canvas
or a div
instead).
Then again, I’m not rewriting the tool. Instead, I think I’m going to wrap it up by:
- Putting a disclaimer on the Google Code project, the app itself, and the Reddit post;
- Annotating a few bits of the code, should I or anyone else care to continue the thing;
- Keeping it up to date with new heroes as they come out, but only for as long as I feel like it (which highly depends on the amount of Dota I’ll play).
That last point does remind me to make one confession: I did not anticipate too well what would be needed to add heroes to the app. I feel rather dumb about that, since my tool is a direct response to the fact that dota2layout.com broke precisely for that reason. But oh well, you can’t win ’em all.
In conclusion
So in any case, that’s how I’m going to wrap it up, effectively “closing down” this project. Which clears the way for me to reboot and start finishing my final “open” project…