4 ms·
One inability I am thinking about lately is disallowing primitive types on public members. Take C#, but properties and methods would only allow returning and ta
by sharpercoder 10y ago
One inability I am thinking about lately is disallowing primitive types on public members. Take C#, but properties and methods would only allow returning and taking class/struct types.
This way you enforce strict use of objects, enforcing expressivity. No more `double meters` but `Meter meters`.
- 14113 10y agoHow you you encode "dimensionless" quantities within such a system?
- tomsmeding 10y agoYou have stuff like Integer right? Which doesn't really bring you anything...
- scotty79 10y agoEvery value has some identity in domain space. Even if it doesn't have a unit.
- hartez 10y agoThat actually sounds like a fun Roslyn analyzer project.
- catnaroek 10y agoA separate class for each unit of measurement isn't the right way to perform compile-time dimensional analysis. It doesn't easily support forming compound units from more basic ones.
- scotty79 10y agoI don't think this is the main point of this limitation. Main point is to prevent "primitive obsession" anti pattern.
- catnaroek 10y agoWhat you call “obsession”, I call “preventing preventable mistakes”, and it's actually a good thing. There are perfectly viable ways to perform compile-time dimensional analysis, for example, parameterizing scalar types by the exponents of “primitive” dimensions.
- scotty79 10y agohttp://c2.com/cgi/wiki?PrimitiveObsession http://c2.com/cgi/wiki?PrimitiveObsession It's completely orthogonal to you argument.
- catnaroek 10y agoThat sounds even worse. Why should primitive types be treated as second-class entities that can only arise as private implementation details of a class? In any case, my original point still stands: (0) Dimension errors are really what one seeks to prevent by discouraging things like `double meters;`. (1) Making a separate class for each unit of measurement doesn't compose or scale well. Dimensional analysis is a fundamentally structural business, and this really calls for compile-time arithmetic with the exponents of primitive dimensions. But, of course, if your hammer is Java-shaped...
- scotty79 10y ago> Why should primitive types be treated as second-class entities that can only arise as private implementation details of a class? Because primitives are meaningless. String has no meaning. "Message" does. "Contact person" does and has conceptually nothing in common with a "Message". Why should they be both of type String? The real problem with primitive obsession is that it stifles software evolution. Suddenly Message needs to keep other data or have some methods associated with it. Every place where it was used is suddenly invalid because you need to go from String to class and inheriting from primitive is just silly if at all possible. That's what you want to prevent. It has almost nothing to do with units or dimensional analysis.