On Saturday, 19 November 2022 at 04:13:33 UTC, []() {}() wrote:
oh. so i get it now. you have to refactor your class (change member variable names and also do it in all places where they are used througout the class. then add new methods, overloading them in this way and that way, all because you're initial design never factored in the possibility of change (or even some validation of the vale being returned to the client, or validation of value coming from the client).

You are not required to rename everything, just actual members.

D has nice feature to convert `foo.bar` to `foo.bar()` and `foo.bar = value` to `foo.bar(value)` that doesn't exist in C/C++ for example. This reduces some headache in planning the API ahead.

Let's we have this class and its usage:
```d
class Rect2D {
    int width;
    int height;

    auto area() const { return width * height; }
}

Rect2D rect = new Rect2D();
rect.width = 5;
rect.height = 5;

writeln(rect.area); // note that this is seamlessly translated to rect.area()
```

Then you decided that you want getters/setters so you add them without changing anything:
```d
class Rect2D {
    int width_;
    int height_;

    auto width() const { return width_; }
    void width(int w) { width_ = w; }

    auto height() const { return height_; }
    void height(int h) { height_ = h; }

auto area() const { return width * height; } // no changes here - using getters
}

Rect2D rect = new Rect2D();
rect.width = 5;   // no changes here - using setter
rect.height = 5;  // no changes here - using setter

writeln(rect.area);
```

You can also use UFCS instead of class members but it has a caveat: plain `width`/`height` won't work within class so you have to either use `width_`/`height_` directly or `this.width`/`this.height`:
```d
class Rect2D {
    int width_;
    int height_;

auto area() const { return this.width * this.height; } // UFCS calls to global width() and height() functions
}

// These functions have to be in global scope for UFCS to work
auto width(const Rect2D rect) { return rect.width_; }
void width(ref Rect2D rect, int w) { rect.width_ = w; }

auto height(const Rect2D rect) { return rect.height_; }
void height(ref Rect2D rect, int h) { rect.height_ = h; }

void main()
{
    // Still no changes in user code
    Rect2D rect = new Rect2D();
    rect.width = 5;
    rect.height = 5;

    writeln(rect.area);
}
```

Reply via email to