Interesting Research Paper on Constructors in OO Languages
Regan Heath
regan at netmail.co.nz
Tue Jul 16 02:47:35 PDT 2013
On Mon, 15 Jul 2013 20:06:38 +0100, Meta <jared771 at gmail.com> wrote:
> I saw an interesting post on Hacker News about constructors in OO
> languages. Apparently they are a real stumbling block for some
> programmers, which was quite a surprise to me. I think this might be
> relevant to a discussion about named parameters and whether we should
> ditch constructors for another kind of construct.
>
> Link to the newsgroup post, the link to the paper is near the top:
> http://erlang.org/pipermail/erlang-questions/2012-March/065519.html
First thought; constructors with positional arguments aren't any
different to methods or functions with positional arguments WRT
remembering the arguments. The difficulties with one are the same as with
another - you need to remember them, or look them up, or get help from
intellisense.
I think the point about constructed objects being in valid states is the
important one. If the object requires N arguments which cannot be
sensibly defaulted, then IMO they /have/ to be specified at construction,
and should not be delayed as in the create-set-call style mentioned.
Granted, A create-set-call style object could throw detailed/useful
messages when used before initialisation, but that's a runtime check so
IMO not a great solution to the issue.
Also, I find compelling the issue that a create-set-call style object with
N required set calls could be initialised N! ways, and that each of these
different orderings have effectively the same semantic meaning.. so it
becomes a lot harder to see what is really happening. Add to that, that
someone could interleave the initialisation of another object into the
first and .. well .. shudder.
So, given the desire to have objects constructed in a valid state, and
given the restriction that this may require N arguments which cannot be
defaulted how do you alleviate the problem of having to remember the
parameters required and the ordering of those parameters?
Named parameters only help up to a point. Like ordered parameters you
need to remember which parameters are required, all that has changed is
that instead of remembering their order you have to remember their names.
So, IMO this doesn't really solve the problem at all.
A lot can be done with sufficiently clever intellisense in either case
(ordered/named parameters), but is there anything which can be done
without it using just a text editor and compiler?
Or, perhaps another way to ask a similar W is.. can the compiler
statically verify that a create-set-call style object has been
initialised, or rather that an attempt has at least been made to
initialise all the required parts.
We have class invariants.. these define the things which must be
initialised to reach a valid state. If we had compiler recognisable
properties as well, then we could have an initialise construct like..
class Foo
{
string name;
int age;
invariant
{
assert(name != null);
assert(age > 0);
}
property string Name...
property int Age...
}
void main()
{
Foo f = new Foo() {
Name = "test", // calls property Name setter
Age = 12 // calls property Age setter
};
}
The compiler could statically verify that the variables tested in the
invariant (name, age) were set (by setter properies) inside the initialise
construct {} following the new Foo().
R
--
Using Opera's revolutionary email client: http://www.opera.com/mail/
More information about the Digitalmars-d
mailing list