Say you have the following class which represents a dog 🐶:

```D
class Dog {
    @property {
        string name();

        void name(string name) {
            _name = name;
        }
    }

    private {
        string _name;
    }
}
```

And you have the following code with constructs a `Dog` object:

```D
void main() {
    Dog d = new Dog();

    d.name = "Poodle";
    writeln(d.name);
}
```

In the code we can see that we have utilized UFCS (universal function call syntax) to set the properties for the object. This feature is great. We have also used D's `@property` annotation which gives us some other advantages that you can see in the documentation.

The issue I have is that UFCS is not enforced, which I thought would be a rather good use for the `@property` annotation. This means that we can do the following in our code:

```D
void main() {
    Dog d = new Dog();

    d.name("poodle");
    writeln(d.name());
}
```

I prefer the UFCS version over the non-UFCS version since it is more clear that it is a property and it matches closely with the official D style guide.

I am disappointed that `@property` does not enforce UFCS, as I believe that it would add to its usefulness. Sometimes throughout my codebase I get confused and write properties in non-UFCS syntax, which bugs me a bit.

My question is: is there a way to enforce UFCS-syntax?

Reply via email to