Or use the match/case statements ... On Fri, May 25, 2012 at 5:29 PM, Prashanth Menon <prashanth.men...@gmail.com > wrote:
> Yup, option 4 is much nicer and very much idiomatic Scala, aside from > allowing mutation. > > We should also reconsider how we're using Option's through our code as I'm > seeing things like "if(option.isDefined)" which should be avoided. > Checking for the condition of the option defeats the purpose of having > one. Instead, we should leverage the map and getOrElse funcitonality > that's awesome to work with :) > > - Prashanth > > > On Fri, May 25, 2012 at 5:29 PM, Jay Kreps <jay.kr...@gmail.com> wrote: > >> Yes, that's my understanding. This blog gives a reasonable overview: >> http://www.dustinmartin.net/2009/10/getters-and-setters-in-scala/ >> >> Kind of sad that a year or so in we are just figuring this out, but I >> guess >> better late then never. :-) >> >> -Jay >> >> On Fri, May 25, 2012 at 2:13 PM, Joel Koshy <jjkosh...@gmail.com> wrote: >> >> > Personally, I like options 3 and 4. (Option 4 more than 3, but I'm not >> sure >> > I follow it correctly - and I did not know that shorthand for >> overloading! >> > So is this right:) >> > >> > class GetSetXYZ { >> > private var underlying = 10 >> > def xyz = underlying >> > def xyz_=(x: Int) {underlying = x} >> > } >> > >> > val o = new GetSetXYZ >> > println(o.xyz) // 10 >> > o.xyz=5 >> > println(o.xyz) // 5 >> > >> > On Fri, May 25, 2012 at 10:17 AM, Jay Kreps <jay.kr...@gmail.com> >> wrote: >> > >> > > Oh no, you are no using xyz_() you are overriding =. So you define >> > > xyz_=(x:Int) >> > > but to call it you do >> > > o.xyz = 5 >> > > The reason this is nice is because you can start with a simple >> > > var xyz >> > > and not need any getter/setter. Then later when you need to change the >> > > behavior of the get you make >> > > def xyz = ... >> > > and none of the calling code changes. Later still you decide you need >> to >> > > override the setter you do >> > > def xyz_=(x: Int)... >> > > and that overrides o.xyz=5, again without changing the calling code. >> > > >> > > Basically the point is that scala generates these getters and setters >> no >> > > matter what so you might as well use the official scala mechanism. >> > > >> > > Since I am only semi-scala literate any of the above may be wrong. >> > > >> > > -Jay >> > > >> > > On Fri, May 25, 2012 at 9:42 AM, Jun Rao <jun...@gmail.com> wrote: >> > > >> > > > I think separating out the getter and setter makes the >> implementation >> > > > cleaner. I am not sure how intuitive it is to use xyz_() as the >> setter, >> > > > although it is concise. >> > > > >> > > > Thanks, >> > > > >> > > > Jun >> > > > >> > > > On Tue, May 22, 2012 at 9:13 PM, Jay Kreps <jay.kr...@gmail.com> >> > wrote: >> > > > >> > > > > We are a little inconsistent in our use of setters and getters. I >> > think >> > > > for >> > > > > the most part well-written code shouldn't have too many setters >> and >> > > > getters >> > > > > (especially setters) since they expose internal details of the >> > object. >> > > > But >> > > > > sometimes you need them. I see three common conventions: >> > > > > >> > > > > 1. Java-style getXyz() and/or setXyz() method >> > > > > 2. xyz() plus semantically named setter that describes what it >> > does. >> > > > > 3. In some newer code I see xyz(x: Option[Int]) >> > > > > >> > > > > There is also a forth option. My understanding of the proper scala >> > > idiom >> > > > > was actually that scala automatically created get and set methods >> for >> > > > you, >> > > > > and the appropriate thing to do is to override these. This is >> > described >> > > > > here: >> > > > http://www.codecommit.com/blog/scala/scala-for-java-refugees-part-2 >> > > > > >> > > > > Essentially you can start with just >> > > > > >> > > > > val xyz = ... >> > > > > >> > > > > Then later if you want to override the getter you would do >> > > > > >> > > > > private val x = ... >> > > > > >> > > > > // getter >> > > > > >> > > > > def xyz = if(check_something) x else throw new >> IllegalStateException >> > > > > >> > > > > Then if you also want to add a setter you do >> > > > > >> > > > > private val x = ... >> > > > > >> > > > > def xyz = if(check_something) x else throw new >> IllegalStateException >> > > > > def xyz_=(x: Int) {xyz = x} >> > > > > >> > > > > Let's pick one of these and refactor towards it as we see code >> that >> > > > doesn't >> > > > > match. My vote would be for option 4. >> > > > > >> > > > > -Jay >> > > > > >> > > > >> > > >> > >> > >