One pattern that lightweight module enables is a lot more free functions in 
place of methods. Because the functions would be encapsulated by a module and 
lose the polluting effect.


On Feb 21, 2017, at 4:46 AM, Brent Royal-Gordon via swift-evolution 
<swift-evolution@swift.org> wrote:

>> On Feb 21, 2017, at 1:28 AM, Daniel Duan via swift-evolution 
>> <swift-evolution@swift.org> wrote:
>> 
>> It has been my hope that a lightweight module system will remove the need 
>> for `private` *and* `fileprivate`.
> 
> I really doubt it will. `private`/`fileprivate` works because you can also 
> access `internal` at the same time.
> 
> What I mean by that is, think about code like this:
> 
>    // Foo.swift
>    public class Foo {
>        public init() { … }
> 
>        func doBar() -> Quux {
>            return helper(in: randomRange())
>        }
> 
>        private func helper(in range: Range<Int>) -> Quux {
>            …
>        }
>    }
> 
>    // Bar.swift
>    public class Bar {
>        public static let shared = Bar()
> 
>        func baz(with foo: Foo) {
>            let quux = foo.doBar()
>            process(quux)
>        }
>        
>        private func process(_ quux: Quux) {
>            …
>        }
>    }
> 
> These classes have `public` APIs that are externally visible, `internal` APIs 
> for communicating with each other, and `private` APIs for implementation 
> details. Now try to reproduce the same design with submodules and 
> `public`/`internal` only:
> 
>    public import MyMod.Foo
>    public import MyMod.Bar
> 
>    module Foo {
>        public class Foo {
>            public init() { … }
> 
> 
>            ??? func doBar() -> Quux {
>                return helper(in: randomRange())
>            }
> 
>            func helper(in range: Range<Int>) -> Quux {
>                …
>            }
>        }
>    }
> 
>    // Bar.swift
>    module Bar {
>        public class Bar {
>            public static let shared = Bar()
>            
>            ??? func baz(with foo: Foo) {
>                let quux = foo.doBar()
>                process(quux)
>            }
>        
>            func process(_ quux: Quux) {
>                …
>            }
>        }
>    }
> 
> The `doBar()` and `baz()` methods have to be either exposed to third parties 
> or kept away from yourself. That's just not viable.
> 
> -- 
> Brent Royal-Gordon
> Architechies
> 
> _______________________________________________
> 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

Reply via email to