> On 22 Feb 2017, at 16:33, Matthew Johnson <matt...@anandabits.com> wrote:
> 
> 
>> On Feb 22, 2017, at 12:32 AM, David Hart <da...@hartbit.com 
>> <mailto: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).

Ok, lets give it a little while.

>> 
>>> 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