> On Apr 3, 2017, at 3:54 PM, Douglas Gregor <dgre...@apple.com> wrote:
> 
> 
>> On Apr 3, 2017, at 1:13 PM, Matthew Johnson <matt...@anandabits.com 
>> <mailto:matt...@anandabits.com>> wrote:
>> 
>>> 
>>> On Apr 3, 2017, at 2:55 PM, Daniel Duan via swift-evolution 
>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>>> 
>>> I’m concerned that we will have access control changes in a future version 
>>> yet again, when light-weight modules, or other type of enforced namespace 
>>> is introduced. Does the core team have any foresight on how this change 
>>> would interact with such things? I had the same concern for SE-0159 as 
>>> well. 
>>> 
>>> There’s a implicit drawback to all access control changes that 
>>> migrator/fix-its cannot fix: we organize our code with tools in the 
>>> language. Some colleague of mine had came up with schemes that combines 
>>> file scope and Swift 3 `private` to hide details among separate protocol 
>>> extensions, for example. Code ends up in certain places for a reason and 
>>> updating access control invalidate those reasons.
>>> 
>>> I hesitate to support any changes until we have some ideas for what 
>>> “ultimate glory” looks like.
>> 
>> +1.  
>> 
>> If we must make a change in Swift 4, the only change I can support for Swift 
>> 4 is renaming the existing access levels.  
> 
> We don’t have to make a change in Swift 4. If there’s a change that can 
> resolve this issue, great…
> 
>> That would cause some churn but can be automated and has no semantic impact. 
>>  I feel strongly that the semantics of access control should remain the same 
>> until submodules and access control can be considered together as part of 
>> the theme of a larger Swift release.  I believe the churn caused by 
>> continuing to poke at the semantics of access control without addressing the 
>> broader issues would be a mistake that would cause further frustration in 
>> the community.  
> 
> … but if not, then let’s shelve access control changes until some time when 
> we can considered it holistically with something like submodules, as you note 
> above.

This is certainly what I would prefer.  I only mention renaming because there 
is such strong interest in changing something.  I would be happy to defer this 
topic and have been arguing for that approach ever since your note that only 
SE-0159 would be considered in scope for Swift 4.

> 
>> As others have already pointed out, code has been developed and organized 
>> with the new scoped access model in mind.  I think the frustration over a 
>> semantically neutral, fully automated migration to new names would be pretty 
>> minimal 
> 
> The core team felt strongly that we couldn’t change these keywords. Source 
> stability is important to Swift 4, and “don’t break source compatibility so 
> much” is one of the top requests we hear from Swift developers, much more so 
> than requests for specific new language features.

That’s fair.

> 
>> and certainly much less than the frustration over the suggested semantic 
>> change.  
> 
> This isn’t clear to me. There could certainly be frustration over the 
> suggested semantic change, for a number of reasons:
> 
> * It’s not as “tight” a meaning of private as the current scope-based private.
> * It means we have a hybrid type-based/scope-based model.
> * It’s the third meaning of ‘private’ in three years.
> 
> However, it is unlikely to break code (one would need to construct an 
> ambiguity between two private declarations in different extensions of the 
> same type in the same file), and causes zero code churn, because it’s 
> widening the meaning of “private”, not changing it.

I’m speculating based on my read of the community here as well as other Swift 
developers I know.  I could be wrong, but my sense is that the items you list 
would cause more frustration than renaming, especially if the name change 
purged `fileprivate`.  I don’t know anyone outside the evolution community who 
I think would complain if access control was left alone for a while.  Some were 
not happy with the changes in Swift 3 but I don’t hear too much about it off 
the list anymore now that the migration is over and people have adapted.

> 
>       - Doug
> 
>> 
>>> 
>>>> On Apr 3, 2017, at 11:34 AM, Douglas Gregor via swift-evolution 
>>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>>>> 
>>>> Hello Swift Community,
>>>> 
>>>> In rejecting SE-0159 
>>>> <https://github.com/apple/swift-evolution/blob/master/proposals/0159-fix-private-access-levels.md>,
>>>>  the core team described a potential direction we would like to 
>>>> investigate for “private” access control that admits a limited form of 
>>>> type-based access control within files. The core team is seeking some 
>>>> discussion here and a motivated volunteer to put together a proposal along 
>>>> these lines for review in the Swift 4 time-frame (i.e., very soon). To be 
>>>> clear, the core team it’s sure this is the right direction to go… but it 
>>>> appears promising and we would *love* to be able to settle the 
>>>> access-control issue.
>>>> 
>>>> The design, specifically, is that a “private” member declared within a 
>>>> type “X” or an extension thereof would be accessible from:
>>>> 
>>>>    * An extension of “X” in the same file
>>>>    * The definition of “X”, if it occurs in the same file
>>>>    * A nested type (or extension thereof) of one of the above that occurs 
>>>> in the same file
>>>> 
>>>> This design has a number of apparent benefits:
>>>>    + “private” becomes the right default for “less than whole module” 
>>>> visibility, and aligns well with Swift coding style that divides a type’s 
>>>> definition into a number of extensions.
>>>>    + “fileprivate” remains for existing use cases, but now it’s use it 
>>>> more rare, which has several advantages:
>>>>            + It fits well with the "progressive disclosure” philosophy 
>>>> behind Swift: you can use public/internal/private for a while before 
>>>> encountering and having to learn about “fileprivate”   (note: we thought 
>>>> this was going to be true of SE-0025 
>>>> <https://github.com/apple/swift-evolution/blob/master/proposals/0025-scoped-access-level.md>,
>>>>  but we were clearly wrong)
>>>>            + When “fileprivate” occurs, it means there’s some interesting 
>>>> coupling between different types in the same file. That makes fileprivate 
>>>> a useful alert to the reader rather than, potentially, something that we 
>>>> routinely use and overlook so that we can separate implementations into 
>>>> extensions.
>>>>    + “private” is more closely aligned with other programming languages 
>>>> that use type-based access control, which can help programmers just coming 
>>>> to Swift. When they reach for “private”, they’re likely to get something 
>>>> similar to what they expect—with a little Swift twist due to Swift’s heavy 
>>>> use of extensions.
>>>>    + Loosening the access restrictions on “private” is unlikely to break 
>>>> existing code.
>>>> 
>>>> There are likely some drawbacks:
>>>>    - Developers using patterns that depend on the existing 
>>>> lexically-scoped access control of “private” may find this new 
>>>> interpretation of “private” to be insufficiently strict
>>>>    - Swift’s access control would go from “entirely lexical” to “partly 
>>>> lexical and partly type-based”, which can be viewed as being more 
>>>> complicated
>>>> 
>>>> Thoughts? Volunteer?
>>>> 
>>>>    - Doug
>>>> _______________________________________________
>>>> swift-evolution mailing list
>>>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>>>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>> 
>>> _______________________________________________
>>> swift-evolution mailing list
>>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>

_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to