[swift-evolution] named parameters - why hidden first?/proposal interest

plx plxswift at icloud.com
Sun Jan 24 07:25:51 CST 2016


As another member of the “anti-fan-club” for the unnamed first parameter, I have to ask: what would be wrong with:

- single-argument functions: default to unnamed “first” (really: only) parameter
- multi-argument functions: default to all-named parameters

…(other than the obvious inconsistencies/special-casing so introduced)?

I mean more in terms of design goals/readability concerns.

The API guidelines seem to address two scenarios for multi-argument functions:

- functions in which one argument is the "semantic focus” (and thus deserves to be the first argument, with its description folded-into the method name)
- functions in which all arguments are “co-equal participants” and have *identical* semantic roles, in which case all parameters should go un-named (e.g. ==, zip, etc.)

…but don’t address a third scenario, wherein:

- there are multiple arguments
- no one argument is the obvious, natural “semantic focus” of the method (thus there’s no natural candidate for which argument’s label ought to get folded-into the method name)
- the arguments all have distinct logical-roles within the method (thus the all-unnamed approach is not great)

…which scenario I think is not all that uncommon in application code (anecdotally 15-30%, depending on problem domain)?

As an example, consider something like this:

protocol PresentationController {
  typealias Content
  typealias PresentationUpdate

  // one of these feels right:
  func inferPresentationUpdate(fromPrevious previous: Content, toCurrent current: Content) -> PresentationUpdate
  func inferPresentationUpdate(from previous: Content, to current: Content) -> PresentationUpdate

  // none of these feels right:
  func inferPresentationUpdateFrom(content: Content, toCurrent current: Content) -> PresentationUpdate
  func inferPresentationUpdateFrom(content: Content, to current: Content) -> PresentationUpdate
  func inferPresentationUpdateFromPrevious(content: Content, toCurrent current: Content) -> PresentationUpdate
  func inferPresentationUpdateFromPrevious(content: Content, toCurrent current: Content) -> PresentationUpdate

  // nor do any of these:
  func inferPresentationUpdateTo(content: Content, fromPrevious previous: Content) -> PresentationUpdate
  func inferPresentationUpdateTo(content: Content, from previous: Content) -> PresentationUpdate
  func inferPresentationUpdateToCurrent(content: Content, fromPrevious previous: Content) -> PresentationUpdate
  func inferPresentationUpdateToCurrent(content: Content, from previous: Content) -> PresentationUpdate

}

…which is as always a bit contrived, but illustrates a scenario wherein neither parameter is arguably the natural "semantic focus” of the method.

(If you need to be convinced this shouldn’t be a method on `Content`, consider that `Content` may be a simple model entity, and that different types of “presentations” may differ in how they want to present model *updates* to the user).

But that’s my 2c; I don’t like the inconsistency, I understand the stated reasons for it, but I think multi-argument methods w/out an obvious “semantic focus” are common enough to deserve consideration.

> On Jan 24, 2016, at 6:32 AM, Charles Constant via swift-evolution <swift-evolution at swift.org> wrote:
> 
> > With our current Objective-C style, we need to repeat at least one word and often need to include "with", "by", "using", etc. to make it read nicely
> 
> When it comes to my own code, I agree with you 100%. However, if I understand the Swift team's rationale, using a label for the first argument is more often than not, bad form. 
> 
> The point I was trying to make with the pros/cons bullet points is that, even being charitable with the cons and understated about the pros, the change still makes more sense.
> 
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160124/08dc82a6/attachment.html>


More information about the swift-evolution mailing list