Is defining get/set methods for every field overkill?

Ali Çehreli acehreli at yahoo.com
Sat Nov 19 19:40:43 UTC 2022


On 11/18/22 19:35, [] () {} () wrote:

 > I like to see an example, of a 'class type' with 'public' member
 > variables, somehow magically converted into both getter and setter using
 > UFCS, without breaking client code.

UFCS was mentioned before in the same context but I think what is meant 
was the D feature where functions can be called without parenthesis.

Let's say, we have a pure data type:

struct Point {
     int x;
     int y;
}

void clientCode() {
     auto p = Point();
     p.y = p.x + 42;
}

void main() {
     clientCode();
}

<aside>It took me 20 years to first think that public access to members 
was extremely wrong to then realize that there may not be any problem 
with it at all. As you said, "business logic" (I prefer "invariants") 
warrants limiting access to members. Without anything to protect, it is 
just extra work for no reason at all. (I fully agree with the posted video.)
</aside>

Ok, let's say that the business requirements changed and we wanted to 
perform some business logic. Thanks to D's pragmatism, clientCode() does 
not change at all:

struct Point {
     int x_;    // Rename
     int y_;    // Rename

     auto x() {    // Getter
         return x_ + y_;
     }

     auto y(int value) {  // Setter
         x_ = value * 2;
         y_ = value / 2;
     }
}

void clientCode() {
     auto p = Point();
     p.y = p.x + 42;
}

void main() {
     clientCode();
}

There: clientCode() is not broken.

Ali



More information about the Digitalmars-d-learn mailing list