Hi Gor,

[I'll continue to answer below, but that wont help you with your proposal…]

The question is wether this
protocol Equatable {

        static func == (_ some: Self, _ other: Self) -> Bool

        default static func != (_ some: Self, _ other: Self) -> Bool
}

extension Equatable {

        static func != (_ some: Self, _ other: Self) -> Bool {
                [Your Code Here]
        }

}

is better than

protocol Equatable {

        static func == (_ some: Self, _ other: Self) -> Bool

        static func != (_ some: Self, _ other: Self) -> Bool {
                [Your Code Here]
        }

}

I don't think so, and therefore, I don't want to add a new keyword (or, more 
precise, a new meaning for an existing keyword).
Both solutions could coexist, but I doubt that implementation inside protocol 
body leaves enough room for "default func".

- Tino

>> Fileprivate has been there for years, it just was called private — and 
>> because the "church of extensions" ;-) has been so powerful, we finally 
>> ended up with what we have now.
> 
> Yes, I was here. The fact that we started off with private behaving the way 
> it does now is history now. The point stands: extensions in the same file as 
> the type definition have an extra guarantee that enable the compiler to 
> provide extra features based on that: the guarantee that the extension and 
> the type definition will always be visible simultaneously, thus, implicitly 
> merging the extension into the type definition is possible. It's not possible 
> to do in any other way, because a file is the only unit of compilation that's 
> more-or-less guaranteed to be atomically parsed. A module is separated into 
> files, which can be compiled into objects separately, making it impossible 
> for the compiler to know if any extension in any of the other files will 
> change the layout of the type.
The compiler won't care where if a method is defined in the type declaration, 
or in an extension in the same file.
What extra guarantee could those extensions offer?

>>>> They are recommended in style guides, influencers blog about them, and 
>>>> they motivated a ridiculous complex change in the access rights system. 
>>>> Yet I haven't seen any evidence that they offer real benefit.
>>> 
>>> Extensions are a tool for decentralizing code. There are some critical 
>>> limits on extensions that make main type definition subject to unavoidable 
>>> bloating (required and designated initializers, stored properties, the 
>>> deinitializer, and open methods), but everything else is a prime candidate 
>>> for decentralizing. Putting as little code as possible into the type 
>>> definition and semantically grouping the implementation into extensions 
>>> improves readability and maintainability dramatically.
>> The thing is: This is just a claim that gets repeated over and over. There 
>> is no proof, and I even don't know a single study on that topic.
> 
> Take a look at this article: 
> https://en.wikipedia.org/wiki/Separation_of_concerns 
> <https://en.wikipedia.org/wiki/Separation_of_concerns>There's nothing about 
> Swift, neither about extensions, in this article.
I don't want to start throwing around buzzwords, but there's also 
https://en.wikipedia.org/wiki/Don%27t_repeat_yourself

> 
>>>> Extensions are great for adding useful helpers to existing types, and 
>>>> still allow you to selectively expose details of your own classes — but 
>>>> most people seem to ignore those options and focus on something can be 
>>>> done better with plain old comments.
>>> 
>>> Relying on comments for invariants and preconditions is a poor design 
>>> decision, because there's no way of enforcing them and the whole integrity 
>>> of the code is thrown at the mercy of a human's carefulness (which is a 
>>> horrible fate to befall upon any code). By writing the code in such a way 
>>> that makes it impossible to be misused (by way of compiler enforcement), 
>>> the code becomes resilient and no amount of clumsy usage can lead to 
>>> incredibly obscure bugs that would take a week of debugging to catch.
>> But extensions are no tool to do so: They have no features that offer any 
>> protection, exactly like comments — they are just more typing and don't show 
>> up properly in Xcode.
>> 
>> import UIKit
>> 
>> class MyViewController: UIViewController {
>> }
>> 
>> extension MyViewController: UITableViewDataSource {
>> 
>>     func tableView(_ tableView: UITableView, numberOfRowslnSection: Int) -> 
>> Int {
>>         return 1
>>     }
>> 
>>     func tableView(_ tableView: UITableView, didSelectRowAt: IndexPath) {
>>         print("Hu, isn't this a delegate method?")
>>     }
>> }
>> 
>> extension MyViewController: UITableViewDelegate {
>>     func tableView(_ tableView: UITableView, numberOfRowsInSection: Int) -> 
>> Int {
>>         return 99
>>     }
>> 
>>     func tableView(_ tableView: UITableView, cellForRowAt indexPath: 
>> IndexPath) -> UITableViewCell {
>>         let cell = UITableViewCell(style: .default, reuseIdentifier: "")
>>         cell.textLabel?.text = "I should get my data from a datasource"
>>         return cell
>>     }
>> }
>> 
>> This is perfectly valid Swift, and it is build on extensions — but does it 
>> increase the quality of the code?
>> Same file extensions are nothing but a different pair of parenthesis to 
>> surround your code, and since Swift 4, you can shuffle around those 
>> delimiters however you like, and it has still the same meaning for the 
>> compiler.
>> They enforce nothing, and so far, I haven't seen any ideas to increase their 
>> power.
> 
> The compiler also doesn't stop you from making a wide variety of design 
> choices, a comprehensive list of which can be found here: 
> https://en.wikipedia.org/wiki/Anti-pattern#Programming 
> <https://en.wikipedia.org/wiki/Anti-pattern#Programming>
> For instance, have you tried reading the implementation of sin function in 
> glibc? It's a very thick spaghetti code, sprinkled with a bucketful of magic 
> numbers. It's absolutely impossible to comprehend.
> 
> Any language limitation should only be implemented if it passes the threshold 
> where the gain of safety and convenience outweighs the loss of flexibility 
> and the cost of implementing the limitation.
> In your example, the gain of convenience is much lower than the cost of 
> implementing it and loss of flexibility.
What?
I didn't talk about adding limitations, and my example just shows that that 
"extension-oriented programming" doesn't add safety, just like comments — 
simply because the compiler strips both kinds of decoration.

>>>> [sorry for the rant — but I think a critical look at extensions is long 
>>>> overdue: I rarely see someone questioning their role, so basically, we are 
>>>> making important decisions based on pure superstition]
>>>> 
>>>> A protocol itself is already a vehicle to group related methods,
>>> 
>>> A protocol is a vehicle for generic programming and separation of 
>>> abstractions.
>> True — but does that stop a protocol from being a way to group related 
>> methods?
> 
> Protocols are not free. They come at a cost of wrapping the object in an 
> existential container and make indirect calls via the witness table. 
> Extensions on value types are free.
All true — but not an answer to the question ;-)

_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution
  • [swift-evolution] [Proposa... Gor Gyolchanyan via swift-evolution
    • Re: [swift-evolution]... Tino Heth via swift-evolution
      • Re: [swift-evolut... Gor Gyolchanyan via swift-evolution
        • Re: [swift-ev... Tino Heth via swift-evolution
          • Re: [swif... Gor Gyolchanyan via swift-evolution
            • Re: ... Víctor Pimentel Rodríguez via swift-evolution
              • ... Gor Gyolchanyan via swift-evolution
            • Re: ... Tino Heth via swift-evolution
              • ... Gor Gyolchanyan via swift-evolution
                • ... Tino Heth via swift-evolution
                • ... Gor Gyolchanyan via swift-evolution
                • ... Mike Sanderson via swift-evolution
                • ... Gor Gyolchanyan via swift-evolution
          • Re: [swif... Víctor Pimentel Rodríguez via swift-evolution
            • Re: ... Vladimir.S via swift-evolution
          • Re: [swif... Taylor Swift via swift-evolution
            • Re: ... Gor Gyolchanyan via swift-evolution
              • ... Taylor Swift via swift-evolution
                • ... Gor Gyolchanyan via swift-evolution
                • ... Tino Heth via swift-evolution

Reply via email to