foobar wrote:
FiL's scheme looks backwards to me. One of the main drawbacks of factories is the fact that they have non-standard names.
Given a class Foo, How would I know to call a factory newFoo?

Well you'd know to call constructor functions because their name implies they construct an object: new(), load(), from(T), etc.. I _hate_ global functions like in my newFoo() example. I was simply using it as an example of where factories hide information about what's being returned in today's code. Constructor functions in my proposal must always be attached to a type, and can't be global, but their names are arbitrary (which is good for overload distinction, like I've explained before).


class LimitedAccount : Account {
// "regular allocation" - on GC heap
private Account new(Person p) {
  return GC.allocate!LimitedAccount(P);
}
// init
this(Person p) {...}
...more code...
}

class Bank {
Account new(Person p, AccountType t) {
  switch(t) {
  case AccountType.LIMITED: return LimitedAccount.new(p);
  ... more cases...
  }
}
}

// usage:
Account acc = Bank.new(PoorShmoe, AccountType.LIMITED);

This is pretty much exactly what I am advocating except I think the allocator and c-tor can be combined (with a attribute override), since the allocator is implicit half the time. I gave an example in my original post:

    class Foo {
        this new() {
            // Implicitly allocates Foo.
        }

        this new() @noalloc {
            // Allocation must be explicit
            // but must return type Foo.
        }

        static auto new() {
            // Regular factory function.
            // Allocate and return at will.
        }
    }

Reply via email to