On Monday, 23 January 2023 at 01:28:30 UTC, Ali Çehreli wrote:
I agree with Adam here. The language should provide solutions
and the programmer should pick appropriate ones.
Then just add `static class`, as it will provide a solution
without robbing you of another solution. You still can put
symbols in a module even if `static class` is a thing. `static
class` doesn't break existing solutions, it just adds things on
top.
OOP is always a solution where it makes sense. I've been very
happy with writing free-standing functions and dumb data types
that the functions operate on... until... some invariant
matters. Then I make the function a member, etc.
Perhaps because I don't buy into the "everything is a class"
anymore, I am very happy with D's approach. Mostly structs and
functions for me. But I use classes as well when they make
sense.
Good. Now, let people have OOP and "everything is a class" if
they want to.
Having said all that, I realize that your asking specifically
for static classes made me think of a solution around classes.
However, doesn't D has the equivalent in structs? Isn't the
following what you are looking for?
struct Algo {
static void drawLine(Canvas c, Pos from, Pos to) { ...... };
}
Now the user is forced to use it like this:
Algo.drawLine(new Canvas(), new Pos(5, 3), new Pos(7, 9));
or this:
Algo().drawLine(/* ... */);
but that can be @disabled.
I think it's better to have a widespread commonly known solution
than hacks that you have to specifically look for. D is guilty
with having too many hacks that you have to specifically learn
about.