Skip to content
Permalink
main
Switch branches/tags
Go to file
 
 
Cannot retrieve contributors at this time

The Uniform Access Principle

2020-11-15

In languages that support them, properties typically have a lot of syntax support for their declaration and definition.

One way to avoid this is the "Uniform Access Principle": Just make field read access and no-argument function calls indistinguishable.

So foo.bar could mean access to the field bar or an invocation of the no-argument bar function, depending on what's declared on foo.

This has one obvious downside: If bar is a function, it's no longer possible to distinguish the invocation foo() from the function reference foo. However, this can be fixed by adding specific syntax for this (less common) case. This might be better for readability in any case.

Similarly, foo.bar = x write access could be equivalent to foo.set_bar(x).

## Advantages of this approach seem to be:

  • Whether something is a field or a no-arg function becomes an implementation detail hidden from the exposed API. This means that simple properties can later be changed without client changes.
  • No extra syntax is needed for declaring properties. Just by convention, no-arg functions can be accessed like properties and set_ functions implicitly can be called via the assignment operator. If there is a setter and a field of the same name, the setter can take precedence (except inside the setter declaration).

The Uniform Access Principle was initially proposed by Bertrand Meyer and implemented in Eiffel and I am supporting a similar design in tantilla.org.