I know that private was scoped to files before Swift 3. Fileprivate should obviously be removed because it is, like I said previously, just a poor man’s package access level. Yes, private was scoped to a file before Swift 3, but at least there wasn’t two kinds of private for a single file. Also scoping private to a file makes sense in Swift because it plays well with the ability to organize the implementation of a type inside of a file into the base type and a number of extensions. I now have to use fileprivate in Swift 3 to pull this off while there isn’t a requirement for a separate private access level. The fileprivate / private distinction also needlessly gets in the way when you want to refactor an existing type implementation into base type + extensions, all living in the same file.
Anyway, I don’t see a good reason why we should end up with this, once sub-modules exist: open, public, module, fileprivate, private when we can live with this: open, public, module, private and we’re not losing anything that would be significant compared to the alternative scenario. Regards, Dietmar Planitzer > On Feb 12, 2017, at 18:16, Xiaodi Wu <xiaodi...@gmail.com> wrote: > > What was added in Swift 3 was `private`; the old `private` was renamed > `fileprivate` with no change in behavior. Certainly, submodules are a big > topic that deserves careful consideration. But the question being discussed > here is about rolling back the change that was implemented in Swift 3 by > removing `private` and restoring `fileprivate` to its old name. > > > On Sun, Feb 12, 2017 at 8:08 PM, Dietmar Planitzer via swift-evolution > <swift-evolution@swift.org> wrote: > Fileprivate is a feature that should not have been added to Swift 3 because > it is in the end just a needlessly limited version of the Java package access > level. Fileprivate forces me to put all types which are related on an > implementation level into the same file while Java packages allow me to put > each type implementation into a separate file. The only thing that Java > requires is that all files which are part of the same package are tagged with > the same package id. Java’s package access level is more powerful than > fileprivate because it gives me more freedom in how I want to organize my > code while still making sure that code in sibling and parent packages can not > access symbols inside my package which form part of the implementation > details of my package. > > The first thing that needs to happen before any more access levels are added > is that a concept of sub-modules is added to Swift along the lines of: > > 1) modules can be organized into a tree with one module as the root. > > 2) all modules which are nodes in the same module tree form a single > resilience domain. > > IMO, the sub-module stuff should be designed similar if not the same way as > Java packages because there are already lots and lots of SDEs who know how > Java packages work, and Java packages are well understood, simple and > straight-forward in their mechanics. > > Once sub-modules are in place, it makes sense to revisit the access level > topic. Eg in order to add a “module” access level that represents the scope > of a module. So “module” could then do what file private can do today plus > more. But we should stop trying to add more access level to the language > until then. We also need to look much more at the bigger picture of things > instead of getting too much hung up on a single component of a larger > mechanism, when it is that larger mechanism that is primarily interesting and > relevant. > > > > Regards, > > Dietmar Planitzer > > > On Feb 12, 2017, at 16:16, Zach Waldowski via swift-evolution > > <swift-evolution@swift.org> wrote: > > > > I vehemently agree on these points. New-private and fileprivate "[add] more > > information" to a file the same way requiring `self.` and other sorts of > > visual noise that Swift normally eschews. > > > > I wish for the Swift community to be introspective enough to count both its > > successes and failures. SE-0025 was a botched addition to the language. > > That the migrator did such a bad job is evidence of its poor overall > > consideration. Adding a fix-it strikes me as the compiler waggling its > > finger at me for code that would've been perfectly fine in the past, > > something that it is not at all true with the "let" fix it; accidental > > mutation has been discussed a ton by the larger programming community, > > not-so-much for obscure access control mechanics. > > > > It's perplexing that fileprivate advocates continue to stand on mostly > > theoretical benefits about new-private. I feel nothing for the mathematical > > purity about the types in a file. In practice, I can with much experience > > now how awful it is. There has been no end to the confusion its > > introduction has inflicted upon my team(s), people new to the language, and > > people revisiting the language: > > > > - My teams and coworkers are less effective at code review from constant > > litigation about access control. "'Did this need to change?' / 'No, it was > > just the migrator.'" has become a disturbingly common refrain. > > > > - New users are just struggling to figure out where to put the curly braces > > in the first place. Having to make them check and re-check where things go > > in a file, or just tell them to use this clunky get-out-of-jail-free > > keyword, feels like visiting a special kind of Pythonic hell on a language > > I otherwise love and love to teach. > > > > - People returning to the language feel (and often say - just look at > > Twitter) Swift has a lot of syntax, and are frustrated that the addition of > > a new keyword was burned on adding something that amounts to mostly a > > stylistic opinion. > > > > All the best, > > Zachary Waldowski > > z...@waldowski.me > > > > On Sun, Feb 12, 2017, at 04:45 PM, Xiaodi Wu via swift-evolution wrote: > >> On Sun, Feb 12, 2017 at 3:24 PM, Matthew Johnson <matt...@anandabits.com> > >> wrote: > >> > >> > >>> On Feb 12, 2017, at 2:35 PM, Xiaodi Wu via swift-evolution > >>> <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. > >> > >>> On Sun, Feb 12, 2017 at 2:14 PM, Chris Lattner <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> 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> wrote: > >>>>> Le 12 févr. 2017 à 18:24, Chris Lattner via swift-evolution > >>>>> <swift-evolution@swift.org> a écrit : > >>>>> > >>>>> On Feb 12, 2017, at 8:19 AM, David Hart via swift-evolution > >>>>> <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) > >>>>> 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 > >>>>> https://lists.swift.org/mailman/listinfo/swift-evolution > >>>> _______________________________________________ > >>>> swift-evolution mailing list > >>>> 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 > >> _______________________________________________ > >> swift-evolution mailing list > >> 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 > > _______________________________________________ > swift-evolution mailing list > 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