> On Feb 18, 2017, at 12:40 AM, Xiaodi Wu <[email protected]> wrote:
> 
> On Sat, Feb 18, 2017 at 1:07 AM, David Waite <[email protected] 
> <mailto:[email protected]>> wrote:
> 
> I believe this proposal is different in that it only requires specification 
> for clarity not for behavioral changes, and only requires the keyword to be 
> specified for protocols known at the site of method/property declaration.
> 
> If indeed you frame your proposal in this way, a best effort to add clarity 
> of intention, my feedback is that there are ways to gain the same (or at 
> least, very similar) benefits without being source-breaking, and indeed 
> without introducing new keywords at all.
> 
> For example:
> - Doc comments are parsed. We already have `- Parameter` in doc comments, 
> which improved tooling could double-check to ensure that the stuff we put 
> there matches the stuff in the function signature (hmm, that'd be a nice 
> additive proposal, right?).
> - The same tool could be augmented to recognize a spelling such as `- 
> RequiredBy:`, and you could list the specific protocols that require the 
> method. Then, you would be warned at compiled time if your method is in fact 
> not required by a protocol. This design has the side benefit of telling the 
> reader of your code exactly what protocols require that method, not just that 
> it's required by some protocol.

IMHO doc comment is no different than a keyword or attribute flagging the 
capability other than the color paint used on the bike shed. I’d disagree with 
an attribute or doc comment unless ‘override’ was also moved to be similar.

Documentation styles differ greatly between developers and projects, but I 
personally subscribe to the idea of self-documenting internal code, resorting 
to documentation when that is not possible. Published documentation (doc 
comments) are reserved for when code is meant to be accessed externally.

Even then, I wouldn’t document an *implementation* of a protocol unless the 
protocol was being implemented by a public type *and* left flexibility in the 
behavior of the implementation, Otherwise, I would rely on the documentation of 
the protocol.

For the vast majority of code, I simply don’t see people using doc comments by 
default. So this feature would have them creating doc comments for the purpose 
of indicating "RequiredBy"

Second, most of the reasons for marking a method or property as being required 
by a protocol go away if such a feature is optional per-method. Developers 
scanning code looking for the cause of odd behavior aren’t going to notice that 
there is a typo in the method signature, still, nor are they going to see a 
missing “RequiredBy” doc comment as a clue unless their coding style requires 
such (most likely enforced by a third party linter)

All that said, I’ve seen plenty of code attempt to indicate such a “RequiredBy” 
feature via extensions, e.g.

        extension ClassName : ProtocolName { … }

I could see a compromise of an opt-in feature where such an extension is 
expected to contain the body of the protocol implementation (or of multiple 
protocols, e.g. Equatable and Hashable), and that any non-private method in the 
extension would result in a warning if it was not applied toward implementing 
the specified protocols.

Is that something people would be interested in? I don’t know if it is just the 
weekend, but this thread has been very quiet.

> 
> The purpose isn’t to map methods to protocols, but to clarify that a method 
> exists to meet the requirements of a protocol. Without this, a simple typo 
> (or redefinition of methods such as with the changes in Swift 3’s importer) 
> causes what you thought was conforming to a protocol to either fail, or worse 
> silently change behavior.
> 
> As I demonstrate above, there are other designs possible that do not require 
> source breakage, or even any new keywords, which recover essentially all of 
> the benefits you list here. Such alternative designs would be opt-in, so 
> those who care about this additional compiler help can use it, and those who 
> do not won't need to, consistent with Swift's new emphasis on compatibility 
> and its established emphasis on progressive disclosure.

The design I specified does not result in source breakage. There would be 
warnings for Swift 3 code compiled under Swift 4 saying that the keywords were 
missing, and that the behavior as if the keywords were specified is assumed.

Swift 4 code using the keywords would not be backward compatible with Swift 3, 
but I know of no similar backward compatibility requirements that Swift 4 code 
compile on Swift 3.

-DW


_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to