On Sunday, 12 April 2015 at 18:42:01 UTC, Andrei Alexandrescu wrote:
On 4/12/15 10:43 AM, Dicebot wrote:
It is much better in languages that do support dedicated properties because language rules can be used to express the same notion without
resorting to any conventions.

Wouldn't e.g. C# allow arbitrary code in getters and setters? And if so, wouldn't C# code need to resort to conventions to avoid surprising behavior? -- Andrei

I'd be surprised if there is any language that prevents you from causing side-effects in getters(beside functional languages that prevent you from causing side-effects anywhere) or non-setting-related side-effects in setters. These kind of limitations prevent many useful patterns, like calculating-and-caching a value the first time a getter is called, or updating a visual component on the screen when it's setters are called.

I don't think relying-purely-on-conventions-with-no-language-support and the-language-strictly-forbids-stuff are the only choices. With a grain (syntactic) salt a language can promote the right way by turning the wrong way into code smell.

If you see a getter function declared as getter(be it with C#'s getter declaration syntax or with D's doesn't-actually-do-anything @property attribute or whatever used in that language) that causes side-effects other than the ones pragmatically needed for getting the value, you can immediately see that something is wrong. But if you look at such a function at the call site you can't guess that it's doing that stuff.

In C#, if you can't rely on other developers to only use the getter-setter syntax for actual getters and setters, then that is probably the least of your worries...

In D, you don't need to not rely on other developers to do that, because EVERY method without arguments and EVERY function with a single argument are getters, and there is nothing you can do about it(unless you use the seems-to-be-abandoned -property flag).


BTW - the exact definition of getters and setters may vary(can querying a webservice be considered a getter?), but under no sane definition is writeln a getter!

Reply via email to