inessential by Brent Simmons

Subclassing Follow-up: the Solution

In a previous post I outlined some options I had for a timeline view controller that has three different configurations.

In the end I settled not on subclassing but on using a delegate. It still felt weird, though, as if this couldn’t possibly be the best solution.

That weird feeling was the right feeling.

Qnoid

Markos Charatzas, with the delightfully odd @qnoid handle on Twitter (which makes me think of pizza), diagnosed the problem correctly:

the problem is a creational one i.e. https://gist.github.com/​qnoid/​57c50a629a984209c6b5 … if you are comfortable with Java, related: http://qnoid.com/​2010/10/11/Don%27t​-underestimate-the-factories​—Don…

He’s right — the problem is a creational one.

But factories?

We Cocoa developers are a pastoral lot — Shire-dwellers — and factories are part of the hellscape of modern industrial languages. Not Cocoa, not Objective-C.

Except that that’s not entirely true. See the docs on Class Factory Methods.

While we’d never create a factory object, we’d add factory methods to a class. Do it all the time.

Here’s what I’d forgotten: class factory methods can be more than a single convenience wrapper for init. Which means I can do this:

+ (VSListViewController \*)listViewController​ForAllNotes;
+ (VSListViewController \*)listViewController​ForTag:(VSTag \*)tag;
+ (VSListViewController \*)listViewController​ForArchivedNotes;

This has nice advantages:

  • Simple API.
  • No need to create another object as delegate or configuration object.
  • Self-contained — I need only look in VSListViewController.m to find relevant code.

So that’s what I’m going to do.

Now I just wish I knew why I didn’t think of this right at first. Well, next time I’ll remember it.