> On Feb 22, 2017, at 12:32 AM, David Hart <da...@hartbit.com> wrote:
> 
> 
>> On 21 Feb 2017, at 23:41, Xiaodi Wu <xiaodi...@gmail.com 
>> <mailto:xiaodi...@gmail.com>> wrote:
>> 
>> Well-written as-is.
>> 
>> Overall, my feedback is that solution 2 should not be on the table (though 
>> there are people who clamor for it), and not because I don't agree with it. 
>> However, simply as a matter of following an appropriate process, solution 2 
>> was originally proposed in SE-0025, fully considered, and modified by the 
>> core team to the current design. One can disagree whether `scoped` is more 
>> appropriate than `private` as a name for that access modifier, and one is 
>> likely to say that `private` looks nicer than `fileprivate`, but that's 
>> neither here nor there. The appropriateness or niceness of these terms is 
>> unchanged from last year. Re-submitting SE-0025 cannot be the solution for 
>> fixing SE-0025.
> 
> I agree with you, as you know that I support Solution 1. But I was hoping to 
> reduce the amount of community flamewar by giving each alternative a level 
> chance and letting the core team decide. But you make a good point about the 
> fact that it was the state SE-0025 was it before it was modified by the core 
> team. And I’m starting to have doubts. What do you think Matthew?

I’d like to let the submodule discussion simmer a little bit more before 
commenting on this question.  The outcome of that could have a significant 
impact on what I think we should do about SE-0025.  When we put this proposal 
together I was assuming submodules were going to be out of scope for Swift 4, 
but it looks like at least the discussion is not.  Even if we don’t end up with 
a formal review of a submodule proposal the discussion might lead to a better 
idea of what kind of proposal might have a chance to be accepted in the future 
(by gauging community sentiment in the discussions, etc).

> 
>> On Tue, Feb 21, 2017 at 12:58 AM, David Hart <da...@hartbit.com 
>> <mailto:da...@hartbit.com>> wrote:
>> Hello list,
>> 
>> Matthew Johnson and I have been putting our proposals together towards a 
>> joint “let’s fix private access levels” proposal. As the community seems 
>> quite divided on the issue, we offer two solutions in our proposal to let 
>> the community debate and to let the core team make the final decision.
>> 
>> I’d like to concentrate this round of feedback on the quality of the 
>> proposal, and not on the merits of Solution 1 or 2. thoughts?
>> 
>> https://github.com/hartbit/swift-evolution/blob/fix-private-access-levels/proposals/XXXX-fix-private-access-levels.md
>>  
>> <https://github.com/hartbit/swift-evolution/blob/fix-private-access-levels/proposals/XXXX-fix-private-access-levels.md>
>> 
>> David.
>> 
>> Fix Private Access Levels
>> 
>> Proposal: SE-XXXX 
>> <https://github.com/hartbit/swift-evolution/blob/fix-private-access-levels/proposals>
>> Authors: David Hart <http://github.com/hartbit>, Matthew Johnson 
>> <https://github.com/anandabits>
>> Review Manager: TBD
>> Status: TBD
>>  
>> <https://github.com/hartbit/swift-evolution/tree/fix-private-access-levels#introduction>Introduction
>> 
>> This proposal presents the problems the came with the the access level 
>> modifications in SE-0025 
>> <https://github.com/apple/swift-evolution/blob/master/proposals/0025-scoped-access-level.md>
>>  and presents two community driven solutions to fix them. As a consensus 
>> will not easily emerge, this proposal will allow a last round of voting and 
>> let the core team decide. Once that is done, this proposal will be ammended 
>> to describe the chosen solution.
>> 
>>  
>> <https://github.com/hartbit/swift-evolution/tree/fix-private-access-levels#motivation>Motivation
>> 
>> Since the release of Swift 3, the access level change of SE-0025 was met 
>> with dissatisfaction by a substantial proportion of the general Swift 
>> community. Before offering solutions, lets discuss how and why it can be 
>> viewed as actiely harmful, the new requirement for syntax/API changes.
>> 
>>  
>> <https://github.com/hartbit/swift-evolution/tree/fix-private-access-levels#criticisms-of-se-0025>Criticisms
>>  of SE-0025
>> 
>> There are two primary criticism that have been offered.
>> 
>> The first is that private is a "soft default" access modifier for 
>> restricting access within a file. Scoped access is not a good behavior for a 
>> "soft default" because it is extremely common to use several extensions 
>> within a file. A "soft default" (and therefore private) should work well 
>> with this idiom. It is fair to say that changing the behavior of private 
>> such that it does not work well with extensions meets the criteria of 
>> actively harmful in the sense that it subtly encourages overuse of scoped 
>> access control and discourages the more reasonable default by giving it the 
>> awkward name fileprivate.
>> 
>> The second is that Swift's system of access control is too complex. Many 
>> people feel like restricting access control to scopes less than a file is of 
>> dubious value and therefore wish to simplify Swift's access control story by 
>> removing scoped access. However, there are many others who like the ability 
>> to have the compiler verify tighter access levels and believe it helps make 
>> it easier to reason about code which is protecting invariants.
>> 
>>  
>> <https://github.com/hartbit/swift-evolution/tree/fix-private-access-levels#detailed-design>Detailed
>>  design
>> 
>> Both authors agree that the private keyword should be reverted back to its 
>> Swift 2 file-based meaning, resolving the first criticism. But the authors 
>> disagree on what should be done about the scoped access level and the 
>> following solutions represent the two main opinions in the community:
>> 
>>  
>> <https://github.com/hartbit/swift-evolution/tree/fix-private-access-levels#solution-1-remove-the-scoped-access-level>Solution
>>  1: Remove the scoped access level
>> 
>> Compared to a file-based access level, the scoped-based access level adds 
>> meaningful information by hiding implementation details which do not concern 
>> other types or extensions in the same file. But is that distinction between 
>> private and fileprivate actively used by the larger community of Swift 
>> developers? And if it were used pervasively, would it be worth the cognitive 
>> load and complexity of keeping two very similar access levels in the 
>> language? This solution argues that answer to both questions is no and that 
>> the scoped access level should be removed to resolve the complexity 
>> criticism.
>> 
>> This solution has the added advantage of leaving the most design 
>> breathing-room for future discussions about access levels in regards to 
>> submodules.
>> 
>>  
>> <https://github.com/hartbit/swift-evolution/tree/fix-private-access-levels#solution-2-rename-the-scoped-access-level-to-scoped>Solution
>>  2: Rename the scoped access level to scoped
>> 
>> It is difficult to make the case that a feature which a nontrivial number of 
>> Swift users find valuable and which is easy for teams to avoid is actively 
>> harmful. It seems like something that falls more into the category of a 
>> debate over style (which could be addressed by a linter). Should we remove a 
>> feature whose utility is a question of style, but is not actively harmful in 
>> the sense of causing programmer error? The second solution argues against it 
>> and proposes renaming it to scoped.
>> 
>> The scoped keyword is a good choice not only because the community has been 
>> calling this feature “scoped access control” all along, but also because the 
>> principle underlying all of Swift’s access levels is the idea of a scope.
>> 
>>  
>> <https://github.com/hartbit/swift-evolution/tree/fix-private-access-levels#source-compatibility>Source
>>  compatibility
>> 
>> In Swift 3 compatibility mode, the compiler will continue to treat private 
>> and fileprivate as was previously the case.
>> 
>> In Swift 4 mode, the compiler will deprecate the fileprivate keyword and 
>> revert the semantics of the private access level to be file based. The 
>> migrator will rename all uses of fileprivate to private. In solution 2, the 
>> migrator will also rename all uses of private to scoped.
>> 
>> With solution 1 (and with solution 2 if the migrator is not run), cases 
>> where a type had private declarations with the same signature in different 
>> scopes will produce a compiler error. For example, the following piece of 
>> code compiles in Swift 3 compatibilty mode but generates a Invalid 
>> redeclaration of 'foo()' error in Swift 4 mode.
>> 
>> struct Foo {
>>     private func bar() {}
>> }
>> 
>> extension Foo {
>>     private func bar() {}
>> }
>>  
>> <https://github.com/hartbit/swift-evolution/tree/fix-private-access-levels#alternatives-considered>Alternatives
>>  Considered
>> 
>> Deprecate fileprivate and modify the semantics of private to include 
>> same-type extension scopes in the same file.
>> Deprecate fileprivate and modify the semantics of private to include 
>> same-type extension scopes in the same module.
>> The alternatives are potentially interesting but completely remove the file 
>> access level while making the new privateaccess level more complicated to 
>> explain and understand.
>> 
> 

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

Reply via email to