> On Mar 20, 2017, at 8:26 PM, Charles Srstka via swift-evolution 
> <swift-evolution@swift.org> wrote:
> 
> the concern with extensions could be easily solved simply by giving 
> extensions access to private members of the extended type as long as those 
> extensions are in the same module/submodule (or file, if you prefer, but I 
> don’t). This would probably eliminate almost all of the use cases for 
> fileprivate, as well as freeing us from the sometimes clumsy situation where 
> we’re rather artificially forced to use files as a scope, instead enabling us 
> to organize code into files as is appropriate for the project.


I think that many advocates of scoped private misunderstand critics' concerns 
about extensions.

One of the nice things about file-based `private` is that it allows access from 
extensions not only on the same type, but also on *other* types. For example, 
suppose I have a Book type and I want to allow them to be added to bookshelves:

        class Bookshelf {
                // I'm using file-based private here
                private(set) var books: [Book]
                
                func addBook(_ book: Book) {
                        book.bookshelf = self
                        books.append(book)
                }
        }

I also want to have a removal method, but—much like `UIView` and `NSView`'s 
`removeFromSuperivew`—I want that method to be on `Book`, not `Bookshelf`. With 
file-based private, that's no problem—just drop the code in an extension in the 
same file:

        extension Book {
                func removeFromBookshelf() {
                        guard let shelf = bookshelf else { return }
                        shelf.remove(at: shelf.books.index(of: self)!)
                        bookshelf = nil
                }
        }

When we talk about file-based private being "better for extensions", we're 
*not*—or at least not necessarily—talking about it being better for the pattern 
of splitting a type into several different extensions to group related code 
together. We're talking about the pattern of splitting a *concern* across 
several different *types* by extending all of them, taking advantage of Swift's 
flexible scoping to encapsulate details even when the type hierarchy doesn't 
match the encapsulation boundaries you want.

So allowing `private` members to be seen by extensions anywhere in a project 
doesn't address this issue; in fact, it actively and aggressively undermines 
it, making it impossible to encapsulate any implementation details at a scope 
smaller than a single type. For myself and others like me, it is the exact 
opposite of what we want.

-- 
Brent Royal-Gordon
Architechies

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

Reply via email to