Also, even if the sample code with the 3 extensions might looks ok, think that 
if you’re working on a 300 classes project, declaring 900 extensions seems a 
crazy thing to do. I would not have to do this on a big project.

@Charlie: Agree with you, on second thought, the implication of extending the 
use of access modifier blocks to functions and protocols seems a bit tricky and 
could increase the indentation level of the code in an annoying way. So, I 
would go with a proposal limited to vars/constants/properties items.




> Le 14 juin 2016 à 23:46, Charlie Monroe <char...@charliemonroe.net> a écrit :
> 
> Your approach has a major flaw: methods from extensions can't be overridden 
> (at least for now). As long as you want to your controller to be subclassed 
> and allow overriding your public/internal methods, you need to move them from 
> extensions to the main class scope. Which simply sucks and may be fine for 
> final classes (or classes that you don't plan on subclassing), but is in no 
> way a good way to design a root class which is meant to be subclassed.
> 
> I am kind of on and off on this proposal - I like the way you can group vars 
> together based on access control, but I'd leave it at that, not extending it 
> to methodsm since it would introduce horizontal space issues (code starting 
> at indentation level 4).
> 
>> On Jun 14, 2016, at 10:18 PM, David Hart <da...@hartbit.com> wrote:
>> 
>> I dont agree. I think extensions serve this purpose very well. Here is what 
>> I do:
>> 
>> I start with the type declaration only containing properties (public or 
>> private). I then create one extension per access level required and one per 
>> protocol conformance and per superclass overrides. We get:
>> 
>> class MyViewController: UIViewController {
>>   public let publicProp: Int = 0
>>   @IBOutlet private var tableView: UITableView!
>> }
>> 
>> //MARK: - Public
>> public extension MyViewController {
>>   // Public functions
>> }
>> 
>> //MARK: - UIViewController
>> public extension MyViewController {
>>   override func viewDidLoad() {
>>   }
>> }
>> 
>> //MARK: UITableViewDataSource
>> extension MyViewController: UITableViewDataSource {
>>   override func numberOfSectionsInTableView(tableView: UITableView) {
>>       return 1
>>   }
>> }
>> 
>> //MARK: Private
>> private extension MyViewController {
>>   // Private functions
>> }
>> 
>>> On 13 Jun 2016, at 01:14, Raphaël Wach via swift-evolution 
>>> <swift-evolution@swift.org> wrote:
>>> 
>>> Yes, extensions serve a different purposes. It doesn’t seem right for me to 
>>> just split every class content into 3 different extensions only to group 
>>> together items with a similar access level.
>>> It would just make the codebase of a framework more messy. Access modifier 
>>> block allows to not break the structure of a class but make it more easy to 
>>> organize, to write and to read which seems nice for our « write less, 
>>> achieve more » new favorite language, Swift. :)
>>> 
>>> Raph
>>> 
>>> 
>>> 
>>>> Le 13 juin 2016 à 10:04, Charlie Monroe <char...@charliemonroe.net> a 
>>>> écrit :
>>>> 
>>>> Extensions can't have stored properties.
>>>> 
>>>>> On Jun 13, 2016, at 9:59 AM, Robert Widmann via swift-evolution 
>>>>> <swift-evolution@swift.org> wrote:
>>>>> 
>>>>> What does this do that breaking a structure down into local extensions 
>>>>> with the appropriate level of access control doesn't?
>>>>> 
>>>>> ~Robert Widmann
>>>>> 
>>>>> 2016/06/13 0:55、Raphaël Wach via swift-evolution 
>>>>> <swift-evolution@swift.org> のメッセージ:
>>>>> 
>>>>>> Hello Swifters,
>>>>>> 
>>>>>> While working on some framework programming, I had this idea that I 
>>>>>> would like to share with you.
>>>>>> If some other people like it, I would be more than happy to write a 
>>>>>> proposal.
>>>>>> 
>>>>>> Here is a little draft I wrote as a starting point to discuss.
>>>>>> Sorry if there is mistakes, I am not an english native speaker.
>>>>>> Thank you for your feedback.
>>>>>> 
>>>>>> ————————————————————————————————————
>>>>>> 
>>>>>> Swift proposal: Access modifier blocks
>>>>>> 
>>>>>> This proposal introduces a refinement of the way to define access 
>>>>>> modifier and visibility scope.
>>>>>> 
>>>>>> The current keywords private, internal and public are nice, simple to 
>>>>>> use and makes sense. But, especially in the context of framework 
>>>>>> development, it can quickly becomes messy and confusing to define the 
>>>>>> visibility for each member variable, function or enum. Also it takes 
>>>>>> more time to write and is not ideal to visualize the public interface of 
>>>>>> a class.
>>>>>> 
>>>>>> If a class A has only a few members, that’s ok to write 
>>>>>> 
>>>>>> class A {
>>>>>> public var member1: Int
>>>>>> var member2: Int
>>>>>> private var member3: Int
>>>>>> }
>>>>>> 
>>>>>> With a bigger class B, it will looks far less nice
>>>>>> 
>>>>>> class B {
>>>>>> public var member1: Int
>>>>>> var member2: Int
>>>>>> private var member3: Int
>>>>>> public var member4: Int
>>>>>> var member5: Int
>>>>>> private var member6: Int
>>>>>> public var member7: Int
>>>>>> var member8: Int
>>>>>> private var member9: Int
>>>>>> public var member10: Int
>>>>>> private var member11: Int
>>>>>> var member12: Int
>>>>>> public var member13: Int
>>>>>> var member14: Int
>>>>>> private var member15: Int
>>>>>> }
>>>>>> 
>>>>>> And now, it’s really messy, takes more time to write and we need to 
>>>>>> think twice to visualize what could be the public interface of our 
>>>>>> framework.
>>>>>> 
>>>>>> The purpose of this proposal is to allow the definition of the access 
>>>>>> modifiers for a block of declarations.
>>>>>> Then our class B could be:
>>>>>> 
>>>>>> class B {
>>>>>> // Ok then this is part of the public interface of my framework
>>>>>> public { 
>>>>>>   var member1: Int
>>>>>>   var member4: Int
>>>>>>   var member7: Int
>>>>>>   var member10: Int
>>>>>>   var member13: Int
>>>>>> }
>>>>>> // This can be used anywhere in my framework
>>>>>> internal {
>>>>>>   var member2: Int
>>>>>>   var member5: Int
>>>>>>   var member8: Int
>>>>>>   var member12: Int
>>>>>>   var member14: Int
>>>>>> }
>>>>>> // Here remains my private stuff. Don’t touch it ! Leave me alone ! My 
>>>>>> preciouuusss
>>>>>> private {
>>>>>>   var member3: Int
>>>>>>   var member6: Int
>>>>>>   var member9: Int
>>>>>>   var member11: Int
>>>>>>   var member15: Int
>>>>>> }
>>>>>> }
>>>>>> 
>>>>>> It increases readability, avoid to write many times the same keywords, 
>>>>>> which is quiet boring, and helps visualizing the architecture of the 
>>>>>> framework by highlighting what can create a dependency with other 
>>>>>> classes inside the framework and with code outside of the framework.
>>>>>> 
>>>>>> It might also be useful in protocols. For exemple, a protocol could 
>>>>>> define a set of methods that can be called only inside the framework and 
>>>>>> another public one that can be called from outside of the framework.
>>>>>> Classes defined outside of the framework could only implement the public 
>>>>>> stuff in the protocol.
>>>>>> 
>>>>>> It would have no impact on the existing code as the existing 
>>>>>> private/internal/public on every single line would still work outside of 
>>>>>> an access modifier block so developers could move to use this smoothly.
>>>>>> 
>>>>>> ————————————————————————————————————
>>>>>> 
>>>>>> Please, let me know if you like the idea.
>>>>>> 
>>>>>> Cheers,
>>>>>> 
>>>>>> Raph
>>>>>> _______________________________________________
>>>>>> 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

Reply via email to