* What is your evaluation of the proposal?

+1. I support this proposal, although I would be in favor of making it optional 
via a command-line switch on the compiler, as a courtesy to those who don’t 
agree.

* Is the problem being addressed significant enough to warrant a change to 
Swift?

Yes. Implicit self has been, in my experience, an effective cloaking device for 
bugs, from accidental property accesses after a shadowing variable has been 
deleted to just plain weird things like the infamous NSView print bug, in which 
calling print() to log something to the console ended up actually printing the 
contents of the view onto paper and ink. It also makes code less readable, as 
it is not immediately obvious whether the entity being referenced is a 
property, a global, or a local variable.

One can, of course, enforce self. through a style guide, however, as others 
have noted, coders are human. I myself have caught several accidental usages of 
implicit self in my own code, and I imagine others have as well.

Reading some of the “nay” votes on this list, I started realizing that there is 
a performance issue here, as well. Several people have commented on the 
following pattern, inherited from Objective-C:

func doSomething() {
        let foo = self.foo
        
        self.barWithFoo(foo)
        self.bazWithFoo(foo)
        self.quxWithFoo(foo)
}

deriding the above pattern as being a “poor practice” which is only done to get 
around the self requirement. My contention is that this is far from the case, 
and that there are good reasons for the above pattern:

1) Accessing a property, in a class, is more expensive than accessing a local 
variable. The above code would require three message sends and/or vtable 
accesses instead of one, if it were not assigning the property to a local 
variable. These unnecessary property accesses needlessly reduce the efficiency 
of the program.

2) In a multi-threaded program, it is conceivable that the value of self.foo 
could change in between accesses to it. If the logic of doSomething() does not 
take this possibility into account (or protect itself with a locking mechanism 
or some such), this could lead to all sorts of odd behavior.

The upshot is that treating property accesses as if they were local variables 
can encourage developers not to keep in mind the costs and dangers of property 
accesses.

* Does this proposal fit well with the feel and direction of Swift?

Yes. Despite what others have written, self.foo does not come across to me as 
particularly verbose. Objective-C was a verbose language, but it was not 
because of self. It was because 
-methodNamesTendedToBeWrittenToLookALotLikeThisWithLotsAndLotsOfCamelCaseWords:thatWentOn:andOn:andOn:andOn:.

* If you have you used other languages or libraries with a similar feature, how 
do you feel that this proposal compares to those?

I’ve done Objective-C coding for quite a long time, and was never bothered by 
the need to use self to access properties. I *was* bothered by the fact that 
instance variables were implicitly referenced without self->, making them far 
too easy to accidentally reference. I find it telling that almost everyone 
eventually ended up standardizing on the underscore prefixes for ivar names, 
just to avoid this issue.

Charles

> On Dec 16, 2015, at 12:55 PM, Douglas Gregor via swift-evolution 
> <[email protected]> wrote:
> 
> Hello Swift community,
> 
> The review of “Require self for accessing instance members” begins now and 
> runs through Sunday, December 20th. The proposal is available here:
> 
>       
> https://github.com/apple/swift-evolution/blob/master/proposals/0009-require-self-for-accessing-instance-members.md
>  
> <https://github.com/apple/swift-evolution/blob/master/proposals/0009-require-self-for-accessing-instance-members.md>
> 
> Reviews are an important part of the Swift evolution process. All reviews 
> should be sent to the swift-evolution mailing list at
> 
>       https://lists.swift.org/mailman/listinfo/swift-evolution 
> <https://lists.swift.org/mailman/listinfo/swift-evolution>
> 
> or, if you would like to keep your feedback private, directly to the review 
> manager.
> 
> What goes into a review?
> 
> The goal of the review process is to improve the proposal under review 
> through constructive criticism and, eventually, determine the direction of 
> Swift. When writing your review, here are some questions you might want to 
> answer in your review:
> 
>       * What is your evaluation of the proposal?
>       * Is the problem being addressed significant enough to warrant a change 
> to Swift?
>       * Does this proposal fit well with the feel and direction of Swift?
>       * If you have you used other languages or libraries with a similar 
> feature, how do you feel that this proposal compares to those?
>       * How much effort did you put into your review? A glance, a quick 
> reading, or an in-depth study?
> 
> More information about the Swift evolution process is available at
> 
>       https://github.com/apple/swift-evolution/blob/master/process.md 
> <https://github.com/apple/swift-evolution/blob/master/process.md>
> 
>       Cheers,
>       Doug Gregor
>       Review Manager
> 
> _______________________________________________
> swift-evolution mailing list
> [email protected]
> https://lists.swift.org/mailman/listinfo/swift-evolution

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

Reply via email to