<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">n Jul 7, 2016, at 9:39 AM, Goffredo Marocchi via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:<br class=""><div><blockquote type="cite" class="">I disagree that a stable for over 30 years of every OOP language that I know is equivalent to lack of care for good library design, but if we want to push value types by making working with classes harder so be it :P.&nbsp;<br class=""></blockquote><div><br class=""></div>Making classes harder to work with is not a specific goal, no. :)</div><div><br class=""></div><div>I don't expect that this will be a significant burden for most Swift programmers. &nbsp;Mainly, that's because this only affects classes that are exposed outside of a module, and the great majority of non-system classes in a typical Cocoa program are single-purpose leaf classes that — at most — expose a few methods to other subsystems. &nbsp;Swift doesn't really encourage you write complex classes that are primarily customized with subclassing; it encourages the heavy use of value types, and it encourages customization through protocols and functions. &nbsp;In fact, that's not really new to Swift, it's a general lesson from the last few decades of software development: composing smaller, independent systems through well-defined interfaces leads to better software than building monolithic systems whose behavior can only be defined in reference to the whole.</div><div><br class=""></div><div>I sympathize with the argument about wanting to fix bugs and add features via override, but that's never been maintainable in the long term; you always just end up with superclasses that everyone is terrified to touch because every subclass has its own invasive "fixes", and that's even when working within a single codebase. &nbsp;With libraries, you can pretty quickly get locked in to a specific version because your customizations don't work with new releases; either that, or the maintainer just decides that they can't fix of their mistakes and so goes off to rewrite it from scratch. &nbsp;Either way, it's not good for the ecosystem.</div><div><br class=""></div><div>Plus, as others have mentioned, Swift already provides a lot of features that don't allow overriding: structs, final, etc. &nbsp;You simply cannot rely on overriding to fix upstream bugs the way that you can in most traditional OO languages because not enough code flows through calls to overridable methods. &nbsp;We should not compromise the goal of promoting stronger and more maintainable library designs just to maintain this illusion.</div><div><br class=""></div><div>John.</div><div><br class=""></div><div><blockquote type="cite" class=""><div class=""><div dir="auto" class=""><div class=""><br class=""></div><div class="">Seriously though</div><div class=""><br class=""></div><div class=""><blockquote type="cite" class=""><font class=""><span style="background-color: rgba(255, 255, 255, 0);" class="">Mine is the opinion of a library-maker,<br class="">yours of the user of poorly designed/developed libraries.</span></font></blockquote><div class=""><br class=""></div>this kind of attitude on this list got to stop.<br class=""><br class="">Sent from my iPhone</div><div class=""><br class="">On 7 Jul 2016, at 17:23, Leonardo Pessoa via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:<br class=""><br class=""></div><blockquote type="cite" class=""><div class=""><span class="">Jean, IMO marking every class as subclassable means the creator does</span><br class=""><span class="">not care for you to design and develop a great library because s/he is</span><br class=""><span class="">not caring for the library at all. I right now have to go through the</span><br class=""><span class="">burdensome activity of marking too many classes/methods as final to</span><br class=""><span class="">prevent misuse of my libraries and find good design workarounds when I</span><br class=""><span class="">need to subclass internally what I don't want you to subclass.</span><br class=""><span class=""></span><br class=""><span class="">IMO the usage of a library is to be crafted/planned/designed by their</span><br class=""><span class="">developers not their users. Mine is the opinion of a library-maker,</span><br class=""><span class="">yours of the user of poorly designed/developed libraries. By pushing</span><br class=""><span class="">this proposal, developer of such libraries will have much burden to</span><br class=""><span class="">make/keep a poor library or will have to work on better</span><br class=""><span class="">design/implementation for it to suit its purpose.</span><br class=""><span class=""></span><br class=""><span class="">L</span><br class=""><span class=""></span><br class=""><span class="">On 7 July 2016 at 13:08, Jean-Daniel Dupas via swift-evolution</span><br class=""><span class="">&lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:</span><br class=""><blockquote type="cite" class=""><span class=""> * What is your evaluation of the proposal?</span><br class=""></blockquote><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote><blockquote type="cite" class=""><span class="">Strong -1 too.</span><br class=""></blockquote><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote><blockquote type="cite" class=""><span class="">I can’t count the number of times it save my hours tone able to override</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">arbitrary classes and methods.</span><br class=""></blockquote><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote><blockquote type="cite" class=""><span class="">Sometimes to simply add log point to understand how the API work. Other</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">times to workaround bugs in the library. Or even to extends the library in a</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">way that the author did not intent in the first place, but that was</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">perfectly supported anyway.</span><br class=""></blockquote><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote><blockquote type="cite" class=""><span class="">I already see how libraries author will react to that new default. They will</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">either don’t care and mark all classes as subclassable, or find to</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">burdensome to get subclassability right and prohibit subclassing all</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">classes.</span><br class=""></blockquote><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote><blockquote type="cite" class=""><span class="">Le 7 juil. 2016 à 02:27, Jonathan Hull via swift-evolution</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">&lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; a écrit :</span><br class=""></blockquote><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote><blockquote type="cite" class=""><span class="">* What is your evaluation of the proposal?</span><br class=""></blockquote><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote><blockquote type="cite" class=""><span class="">A **strong** -1</span><br class=""></blockquote><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote><blockquote type="cite" class=""><span class="">First, I have often found that you can’t always predict the way which</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">something will need to be extended. &nbsp;You think you know, but are then</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">surprised by creative uses. &nbsp;My favorite features of Swift/Cocoa involve</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">retroactive modeling.</span><br class=""></blockquote><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote><blockquote type="cite" class=""><span class="">Second, I don’t think this proposal will achieve its stated objective of</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">forcing people to think about subclassing more. &nbsp;It will just add confusing</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">boilerplate.</span><br class=""></blockquote><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote><blockquote type="cite" class=""><span class="">Things like Swift optionals work well because they make the (often</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">forgotten) choices explicit in the context that they are used. &nbsp;In the world</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">of Human Factors, we call it a forcing function. &nbsp;This proposal has the</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">inverse structure, and will be ineffective, because the “forcing” part of it</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">shows up in a different context (i.e. trying to use a framework) than the</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">decision is being made in (writing the framework). &nbsp;This type of thinking</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">leads to things like Java and the DMV.</span><br class=""></blockquote><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote><blockquote type="cite" class=""><span class="">As Tino said:</span><br class=""></blockquote><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote><blockquote type="cite" class=""><span class="">No matter what the defaults are, good libraries are hard to build, so I</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">predict this proposal would not only fail in increasing framework quality,</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">but also will make it much harder for users of those frameworks to work</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">around their flaws, which are just a natural part of every software.</span><br class=""></blockquote><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote><blockquote type="cite" class=""><span class="">I think he is right on here. &nbsp;Those who were prone to be thoughtful about</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">their design would have been anyway. &nbsp;Those who are not thoughtful about</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">their design will just leave these annotations off… leaving us with no</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">recourse to extend/modify classes. &nbsp;When people complain, they will add the</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">annotations without actually thinking about the meaning (i.e. stack overflow</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">/ the fixit tells me I need to add this word to make the compiler happy).</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">All this does is put framework users at the mercy of the framework writers.</span><br class=""></blockquote><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote><blockquote type="cite" class=""><span class="">Finally, this proposal is missing important aspects of the problem space.</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">If we truly want to solve the issue of subclassing, we need to consider all</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">of the common issues which arise. &nbsp;Looking at the cocoa documentation you</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">will see several types of annotations:</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">1) This method MUST be overridden</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">2) This method should NOT be overridden</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">3) This method MUST be called</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">3) This method should NOT be called except by subclasses</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">4) This method should NOT be called except by a method override calling</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">super</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">5) This method MUST call super</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">6) Overrides of this method should NOT call super</span><br class=""></blockquote><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote><blockquote type="cite" class=""><span class="">If we are attempting to bring thoughtfulness to the design of classes, I</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">would like to see things be extendable by default, but with annotations that</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">thoughtful framework designers can use to designate how a particular method</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">should be used. &nbsp;In most cases, it should not explicitly forbid the end user</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">from subclassing, but require them to acknowledge that what they are doing</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">is not intended by the framework. (e.g. "unsafe override func"…). &nbsp;That</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">would feel 1000x more swifty to me. &nbsp;Opt-out safety.</span><br class=""></blockquote><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote><blockquote type="cite" class=""><span class="">* Is the problem being addressed significant enough to warrant a change to</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">Swift?</span><br class=""></blockquote><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote><blockquote type="cite" class=""><span class="">No. It doesn’t actually solve the problem... and I haven’t actually run into</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">this problem in the real world.</span><br class=""></blockquote><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote><blockquote type="cite" class=""><span class="">* Does this proposal fit well with the feel and direction of Swift?</span><br class=""></blockquote><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote><blockquote type="cite" class=""><span class="">No, it gives Swift more of a feeling of busywork and unnecessary boilerplate</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">while failing to achieve its objective. &nbsp;It goes against the retroactive</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">modeling allowed by other areas of Swift.</span><br class=""></blockquote><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote><blockquote type="cite" class=""><span class="">* If you have used other languages or libraries with a similar feature, how</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">do you feel that this proposal compares to those?</span><br class=""></blockquote><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote><blockquote type="cite" class=""><span class="">I tend to avoid languages which require this sort of thing. &nbsp;In other</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">languages that lock things down, there is a need to unlock things soon after</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">(e.g. friend classes).</span><br class=""></blockquote><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote><blockquote type="cite" class=""><span class="">I predict the same thing will happen here. &nbsp;People will quickly be asking</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">for the ability to patch/override in cases where the framework designer was</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">wrong. &nbsp;That shows a problem inherent with the design...</span><br class=""></blockquote><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote><blockquote type="cite" class=""><span class="">* How much effort did you put into your review? A glance, a quick reading,</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">or an in-depth study?</span><br class=""></blockquote><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote><blockquote type="cite" class=""><span class="">Read the proposal &amp; discussion. &nbsp;Read earlier discussions around access</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">control that touched on this subject as well. &nbsp;I have been designing</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">frameworks for years.</span><br class=""></blockquote><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote><blockquote type="cite" class=""><span class="">Thanks,</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">Jon</span><br class=""></blockquote><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote><blockquote type="cite" class=""><span class="">Hello Swift community,</span><br class=""></blockquote><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote><blockquote type="cite" class=""><span class="">The review of "SE-0117: Default classes to be non-subclassable publicly"</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">begins now and runs through July 11. The proposal is available here:</span><br class=""></blockquote><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote><blockquote type="cite" class=""><span class=""> &nbsp; &nbsp;<a href="https://github.com/apple/swift-evolution/blob/master/proposals/0117-non-public-subclassable-by-default.md" class="">https://github.com/apple/swift-evolution/blob/master/proposals/0117-non-public-subclassable-by-default.md</a></span><br class=""></blockquote><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote><blockquote type="cite" class=""><span class="">Reviews are an important part of the Swift evolution process. All reviews</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">should be sent to the swift-evolution mailing list at</span><br class=""></blockquote><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote><blockquote type="cite" class=""><span class=""> &nbsp; &nbsp;<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" class="">https://lists.swift.org/mailman/listinfo/swift-evolution</a></span><br class=""></blockquote><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote><blockquote type="cite" class=""><span class="">or, if you would like to keep your feedback private, directly to the review</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">manager.</span><br class=""></blockquote><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote><blockquote type="cite" class=""><span class="">What goes into a review?</span><br class=""></blockquote><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote><blockquote type="cite" class=""><span class="">The goal of the review process is to improve the proposal under review</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">through constructive criticism and contribute to the direction of Swift.</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">When writing your review, here are some questions you might want to answer</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">in your review:</span><br class=""></blockquote><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote><blockquote type="cite" class=""><span class=""> &nbsp; &nbsp;* What is your evaluation of the proposal?</span><br class=""></blockquote><blockquote type="cite" class=""><span class=""> &nbsp; &nbsp;* Is the problem being addressed significant enough to warrant a change to</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">Swift?</span><br class=""></blockquote><blockquote type="cite" class=""><span class=""> &nbsp; &nbsp;* Does this proposal fit well with the feel and direction of Swift?</span><br class=""></blockquote><blockquote type="cite" class=""><span class=""> &nbsp; &nbsp;* If you have used other languages or libraries with a similar feature, how</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">do you feel that this proposal compares to those?</span><br class=""></blockquote><blockquote type="cite" class=""><span class=""> &nbsp; &nbsp;* How much effort did you put into your review? A glance, a quick reading,</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">or an in-depth study?</span><br class=""></blockquote><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote><blockquote type="cite" class=""><span class="">More information about the Swift evolution process is available at</span><br class=""></blockquote><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote><blockquote type="cite" class=""><span class=""> &nbsp; &nbsp;<a href="https://github.com/apple/swift-evolution/blob/master/process.md" class="">https://github.com/apple/swift-evolution/blob/master/process.md</a></span><br class=""></blockquote><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote><blockquote type="cite" class=""><span class="">Thank you,</span><br class=""></blockquote><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote><blockquote type="cite" class=""><span class="">-Chris Lattner</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">Review Manager</span><br class=""></blockquote><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote><blockquote type="cite" class=""><span class="">_______________________________________________</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">swift-evolution mailing list</span><br class=""></blockquote><blockquote type="cite" class=""><span class=""><a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a></span><br class=""></blockquote><blockquote type="cite" class=""><span class=""><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" class="">https://lists.swift.org/mailman/listinfo/swift-evolution</a></span><br class=""></blockquote><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote><blockquote type="cite" class=""><span class="">_______________________________________________</span><br class=""></blockquote><blockquote type="cite" class=""><span class="">swift-evolution mailing list</span><br class=""></blockquote><blockquote type="cite" class=""><span class=""><a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a></span><br class=""></blockquote><blockquote type="cite" class=""><span class=""><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" class="">https://lists.swift.org/mailman/listinfo/swift-evolution</a></span><br class=""></blockquote><blockquote type="cite" class=""><span class=""></span><br class=""></blockquote><span class="">_______________________________________________</span><br class=""><span class="">swift-evolution mailing list</span><br class=""><span class=""><a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a></span><br class=""><span class=""><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" class="">https://lists.swift.org/mailman/listinfo/swift-evolution</a></span><br class=""></div></blockquote></div>_______________________________________________<br class="">swift-evolution mailing list<br class=""><a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a><br class="">https://lists.swift.org/mailman/listinfo/swift-evolution<br class=""></div></blockquote></div><br class=""></body></html>