how to make private class member private
aliak
something at something.com
Tue Mar 13 08:18:12 UTC 2018
On Tuesday, 13 March 2018 at 06:58:08 UTC, psychoticRabbit wrote:
> On Tuesday, 13 March 2018 at 06:03:11 UTC, Mike Parker wrote:
>>
>> The same applies here. Encapsulation simply isn't broken by
>> this feature.
>
> What you're saying, is in D, class encapsulation is really
> 'module' encapsulation.
>
> I get it. Fine. It's an intersting design decision.
>
> But, in doing that, D has shifted the boundary of class
> encapsulation, to a boundary that is outside the class.
>
> To me, that sounds like D has broken class encapsulation. I
> don't know how else one could describe it.
>
> I continue to think, that class encapsulation is sacred, a well
> defined, well understood, concept that has been around for a
> very long time.
>
> private could have still meant private, and surely someone
> could have come up with a different access modifier to mean
> 'private at module level'.
>
> Was that too hard the language designers?
>
> Was it not hard, but just to complex to implement?
>
> I don't get it.
I agree that class encapsulation is broken, well, not broken but
just not a thing really. Don't think it's a bad thing though.
Case in point, swift had private as file level access, swift 3
they introduced fileprivate [0] to do that instead and had
private be scope level (which includes class level and is what
you're referring to private being).
Swift 4 they reverted it .... kinda [1]
It was too inconvenient to not allow access to private members
within a file in a language that allows extensions (think ufcs).
So they compromised a bit here and went for decleration level
which makes sense within their extension semantics. This would
not work for D thought because ufcs is not really a type
extension (i.e. not part of a type's typeinfo)
So now the difference is that private can be used in a file but
only in a declaration and fileprivate can be used anywhere in a
file. So they allow class encapsulation but at a file level. It's
an interesting approach and quite neat.
Rust is also the same as D I believe. Module is the unit of
encapsulation.
I wouldn't want private to change it's meaning quite frankly in
the module system. I would not mind more control within a module
though because, well, encapsulation. A Rust-ish approach were you
can define a path [2] might allow for a lot more freedom but I'm
not sure how well that would work with D.
Cheers
[0]
https://github.com/apple/swift-evolution/blob/master/proposals/0025-scoped-access-level.md
[1]
https://github.com/apple/swift-evolution/blob/master/proposals/0169-improve-interaction-between-private-declarations-and-extensions.md
[2]
https://doc.rust-lang.org/beta/reference/visibility-and-privacy.html
More information about the Digitalmars-d-learn
mailing list