> On Feb 12, 2017, at 3:45 PM, Xiaodi Wu <xiaodi...@gmail.com> wrote:
> 
> On Sun, Feb 12, 2017 at 3:24 PM, Matthew Johnson <matt...@anandabits.com 
> <mailto:matt...@anandabits.com>> wrote:
> 
>> On Feb 12, 2017, at 2:35 PM, Xiaodi Wu via swift-evolution 
>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>> 
>> _Potentially_ meaningful, certainly. But what I'm hearing is that it isn't 
>> actually meaningful. Here's why:
>> 
>> If I see `fileprivate` and can understand that to mean "gee, the author 
>> _designed_ this member to be visible elsewhere inside the file," then it's 
>> actually meaningful. OTOH, if I see `fileprivate` and can only deduce "gee, 
>> the author mashed some button in his or her IDE," then it's not really 
>> telling me anything.
> 
> You’re looking at it backward.  It’s when you see `private` and can deduce 
> “this member is only visible inside it’s declaring scope” that can be really 
> helpful.  *This* is what matters.
> 
> In what ways can that information help you?
> 
>> What you've said above, as I understand it, is that it's not currently 
>> meaningful to see `fileprivate` because the migrator is writing it and not 
>> the author. The improved approach you proposed is the additional warning. In 
>> that case, the compiler will help to ensure that when I see `fileprivate`, 
>> at least I know it's necessary. But that's only telling me a fact (this 
>> member is accessed at least once outside the private scope), but it's still 
>> machine-based bookkeeping, not authorial intent.
> 
> The important thing is that this machine-based bookkeeping results in a proof 
> about the code.  This facilitates reasoning about the code.  You can make an 
> argument that this proof is not important enough to matter, but you must 
> admit that this is a real concrete gain in information that is immediately 
> available to a reader of the code (after they know that it compiles).  
> Personally, I find this proof to be valuable.
> 
> Comparison has been made to `let` and `var`. In that case, whether a variable 
> is mutated can be non-trivial to deduce (as Swift has no uniform scheme for 
> distinguishing mutating from non-mutating functions; the ed/ing rule has many 
> exceptions). By contrast, here, I don't see any gain in information. You can 
> literally *see* where the (file)private member is accessed, and when a file 
> gets too long, even a simple text editor can do a decent enough find.
> 
> If you're right that the real value is that seeing `private` helps you reason 
> about the code, then that value must be commensurate to how often we see 
> Swift users amending the migrator to take advantage of it. For me, the 
> compelling evidence that Swift users don't find this proof to be valuable is 
> that, by examination of Swift 3 code, Swift users haven't bothered. If we add 
> a new fix-it to force them to, then of course they'll mash the buttons, but 
> it's pretty much declaring that they are wrong not to care about what it 
> seems they do not care at present.

This is really subjective and it’s not clear to me that there is substantial 
evidence one way or another.  I know that `private` is valued and used heavily 
by the teams I have worked with.  Maybe that’s an exception, but maybe not.  I 
don’t think we know yet and I think this is what Chris is hoping to learn.

> 
>> On Sun, Feb 12, 2017 at 2:14 PM, Chris Lattner <sa...@nondot.org 
>> <mailto:sa...@nondot.org>> wrote:
>> I don't fully agree: you are right that that is the case when writing code.  
>> However, when reading/maintaining code, the distinction is meaningful and 
>> potentially important.
>> 
>> -Chris
>> 
>> On Feb 12, 2017, at 12:02 PM, Xiaodi Wu <xiaodi...@gmail.com 
>> <mailto:xiaodi...@gmail.com>> wrote:
>> 
>>> If the overwhelming use case is that developers should pick one over the 
>>> other primarily because it looks nicer, then blindly click the fix-it when 
>>> things stop working, then the distinction between private and fileprivate 
>>> is pretty clearly a mere nuisance that doesn't carry its own weight.
>>> On Sun, Feb 12, 2017 at 13:33 Jean-Daniel via swift-evolution 
>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>>>> Le 12 févr. 2017 à 18:24, Chris Lattner via swift-evolution 
>>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> a écrit :
>>>> 
>>>> On Feb 12, 2017, at 8:19 AM, David Hart via swift-evolution 
>>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>>>>> Final
>>>>> Can someone tell me what is the use of 'final' now that we have 'public' 
>>>>> default to disallowing subclassing in importing modules? I know that 
>>>>> 'final' has the added constraint of disallowing subclassing in the same 
>>>>> module, but how useful is that? Does it hold its weight? Would we add it 
>>>>> now if it did not exist?
>>>> 
>>>> As Matthew says, this is still important.
>>>> 
>>>>> Lazy
>>>>> This one is clearer: if Joe Groff's property behaviors proposal from last 
>>>>> year is brought forward again, lazy can be demoted from a language 
>>>>> keyword to a Standard Library property behavior. If Joe or anybody from 
>>>>> the core team sees this: do we have any luck of having this awesome 
>>>>> feature we discussed/designed/implemented in the Swift 4 timeframe?
>>>> 
>>>> Sadly, there is no chance to get property behaviors into Swift 4.  
>>>> Hopefully Swift 5, but it’s impossible to say right now.
>>>> 
>>>>> Fileprivate 
>>>>> 
>>>>> I started the discussion early during the Swift 4 timeframe that I regret 
>>>>> the change in Swift 3 which introduced a scoped private keyword. For me, 
>>>>> it's not worth the increase in complexity in access modifiers. I was very 
>>>>> happy with the file-scope of Swift pre-3. When discussing that, Chris 
>>>>> Latner mentioned we'd have to wait for Phase 2 to re-discuss it and also 
>>>>> show proof that people mostly used 'fileprivate' and not the new 
>>>>> 'private' modifier as proof if we want the proposal to have any weight. 
>>>>> Does anybody have a good idea for compiling stats from GitHub on this 
>>>>> subject? First of all, I've always found the GitHub Search quite bad and 
>>>>> don't know how much it can be trusted. Secondly, because 'private' in 
>>>>> Swift 2 and 3 have different meanings, a simple textual search might get 
>>>>> us wrong results if we don't find a way to filter on Swift 3 code.
>>>> 
>>>> I would still like to re-evaluate fileprivate based on information in the 
>>>> field.  The theory of the SE-0025 
>>>> (https://github.com/apple/swift-evolution/blob/master/proposals/0025-scoped-access-level.md
>>>>  
>>>> <https://github.com/apple/swift-evolution/blob/master/proposals/0025-scoped-access-level.md>)
>>>>  was that the fileprivate keyword would be used infrequently: this means 
>>>> that it would uglify very little code and when it occurred, it would carry 
>>>> meaning and significance.
>>> 
>>> Infrequent use and significance are orthogonal.
>>> I still think developers would declare all ivars private (this is less ugly 
>>> and shorter), and then will happily convert them to fileprivate each time 
>>> the compiler will tell them they are not accessible somewhere else in the 
>>> file.
>>> As the code that try to access that ivar is in the same file anyway, it has 
>>> full knowledge of the implementation details and there is no good reason it 
>>> shouldn’t be able to access the ivar when needed.
>>> 
>>>> We have a problem with evaluating that theory though: the Swift 2->3 
>>>> migrator mechanically changed all instances of private into fileprivate.  
>>>> This uglified a ton of code unnecessarily and (even worse) lead 
>>>> programmers to think they should use fileprivate everywhere.  Because of 
>>>> this, it is hard to look at a random Swift 3 codebase and determine 
>>>> whether SE-0025 is working out as intended.
>>>> 
>>>> The best way out of this that I can think of is to add a *warning* to the 
>>>> Swift 3.1 or 4 compiler which detects uses of fileprivate that can be 
>>>> tightened to “private” and provide a fixit to do the change.  This would 
>>>> be similar to how we suggest changing ‘var’ into ‘let’ where possible.  
>>>> Over time, this would have the effect of getting us back to the world we 
>>>> intended in SE-0025.
>>>> 
>>>> -Chris
>>>> 
>>>> _______________________________________________
>>>> 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 <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