> 
> What is your evaluation of the proposal?
-1.  I have been a vocal proponent of scoped access all along.  Despite that I 
really tried to keep an open mind about this proposal.  In the end, I just 
don’t think it is the right decision.

I can see why some people would like to consider a main type declaration and 
extensions to be considered the same scope when they are in the same file.  
Extensions of a type within a file are usually used primarily for 
organizational purposes.  The intent often isn’t really to create a scope 
boundary.  Needing to use the slightly verbose `fileprivate` is unfortunate.  
But the keyword isn’t a scoping problem, it is a naming problem.

I think the most compelling argument in the proposal is the one that says it is 
important to highlight same-file, cross-type communication using the 
`fileprivate` keyword.  The argument is that by making this the only case where 
`fileprivate` is used will make these special cross-type members stand out 
more.  I considered this carefully and ultimately concluded that I just don’t 
think it’s that important.  

The reason I put scopes for more than one type in the same file to begin with 
is that privileged access of one kind or another is necessary.  For this 
reason, I think if we’re going to have a “soft default” that works in the vast 
majority of cases it should be file scope.  It would be nice if file scope 
could regain the name `private` without losing the scoped access feature but if 
we just can’t make that happen maybe we’ll just have to live without the “soft 
default”.

It isn’t cross-type members that I want to stand out.  It is same-scope-only 
members that need to stand out.  These members are scoped for important reasons 
and it is valuable to tightly bound code that can access them and avoid needing 
to look elsewhere in the same file for accesses.  Brent made an eloquent case 
for this despite having supported the rollback to Swift 2 access levels.

In the end, I still think the name `fileprivate` was a mistake and that the 
best design is Swift 2 `private` with `scoped` as the name for the Swift 3 
`private`.  If we’re not going to fix that we should just leave access control 
alone in Swift 4.  

When we’re ready to discuss submodules as part of a release theme I hope we 
will also be willing to revise access control as a part of that them if that 
makes sense in the context of whatever submodules end up looking like.  At this 
time we would not only have more context regarding submodules, we would also 
have the benefit of more time and experience with the current access levels 
which may be helpful in informing our decision.

In recent threads on this topic there has been some discussion of introducing 
some kind of organizational mechanism that can be used within the scope of a 
type declaration.  I think this is an interesting approach and is the right 
approach to explore if we want to have a way to organize a type’s declaration 
without creating scope boundaries.  It would allow people to organize their 
members while still using `private` more often and better highlighting members 
that are visible file-wide.  

In Objective-C MARK comments were very commonly used for this purpose.  In 
Swift this is still possible but has been mostly replaced with extensions.  
People want to use an organizational mechanism that is supported by the 
language.  Maybe we need some kind of organizational mechanism that does not 
create a scope boundary.  This is a topic for another discussion, but is worth 
keeping in mind while considering the merit of the current proposal.

> Is the problem being addressed significant enough to warrant a change to 
> Swift?
No.  I believe it makes the language worse, not better.  It doesn’t address the 
real problems with access control.  The largest problem is the inability to 
form scopes between files and the entire module.  The problem with 
`fileprivate` and `private` is a naming problem, not a semantics problem.

I also believe the proposal does not adequately acknowledge the impact on 
existing code.  While most code will still compile the semantics will be 
significantly different for people who are using scoped access as it was 
intended - to closely bound access to members when there are good reasons for 
doing that.  In order to maintain semantic compatibility this code will need to 
be re-written to introduce a new type if there remains a desire to highlight 
access to these members.  Even then, it will be possible to extend that type 
elsewhere in the file to open a new scope which can access the members.  

We no longer have a tight bound, only a way to make it more verbose and obvious 
when the scope is opened elsewhere in the file.  This is a significant, not a 
small impact on this code.  The core team rejected SE-0159 because it 
determined people are using scoped access control for good reasons.  I don’t 
understand how we could go from that decision to making a change that 
effictively removes the primary benefit derived from using scoped access.

> Does this proposal fit well with the feel and direction of Swift?
No.  It violates the principle of nested scopes that has always been the 
foundation of Swift’s access control.  This principle is a very good one.  Any 
devastation from it should be extremely strongly motivated.  This proposal is 
not.  I believe it makes access control more complex, not simpler. 

 I am sympathetic to those who want to say `private` instead of `fileprivate` 
to share members between type declarations and same-type extensions in the same 
file but violating the principle that underlies Swift’s access control is not 
the right way to solve that problem.

> If you have used other languages or libraries with a similar feature, how do 
> you feel that this proposal compares to those?
No.

> How much effort did you put into your review? A glance, a quick reading, or 
> an in-depth study?
In-depth study.
_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to