> On 21 Feb 2017, at 12:44, Andrey Fidrya <a...@zabiyaka.com> wrote:
> 
> >Alternatives Considered:
> >2. Deprecate fileprivate and modify the semantics of private to include 
> >same-type extension scopes in the same module.
> 
> Imho, this is a better alternative.
> 
> I rarely implement class extensions in the same file. Most often they have 
> their own files, like
> MyClass+Search.swift
> MyClass+SomethingElse.swift
> 
> Even in cases where implementing them in the same file makes sense, I'm not 
> using current fileprivate modifier on variables because if I later have to 
> implement an extension in a different file, I'll have to remove all these 
> modifiers.
> 
> 
> Also, I don't think internal is a good default choice... Even if private is 
> changed back to mean "file private" or "class private", it will add a lot of 
> visual noise... For proper access limitation, basically everything has to be 
> marked "private". Compare:
> 
> class C {
>   var a = 1
>   var b = 2
>   func f() { } 
> }
> 
> to:
> 
> class C {
>   private var a = 1
>   private var b = 2
>   private func f() { etc }
> }
> 
> 
> Also, in classes inheritance is denied by default, but variables have more 
> open 'internal' access level by default.
> It looks like an inconcistency to me. Users have to explicitly allow 
> inheritance, but disallow access to variables.
> 
> 
> +1 to the arguments about not mixing concepts (file or scope/type based). 
> Personally I'd prefer scope/type only.
> Also, fileprivate access doesn't play well with playgrounds and makes 
> rearranging code harder.
> 
> 
> If redesigning this from scratch, I'm thinking of this design:
> 1. scoped (works like the current private)
> 2. private (to the class + it's extensions inside the module) - and making it 
> the default
> 3. internal (to the module). Should be set only on variables where it's 
> really needed (will be rarely used).

In the previous very long thread, many people acknowledged that type + its 
extensions private was too complex for its own good. Do you have arguments 
against that? And even if it was proposed, I think many people would be very 
opposed to keeping scoped in that case. There would be too little difference 
between the two to be worth it.

> One more argument for adding "scoped" access level:
> if it will be allowed to declare variables in extensions of the same module 
> in the future, having "scoped" would be very convenient as there can be 
> multiple extensions in the same file.
> 
> 
> Regards,
> Andrey
> 
> 
> 
>> On 21 Feb 2017, at 09:58, David Hart via swift-evolution 
>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> 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 <mailto:swift-evolution@swift.org>
>> 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