Yeah of course the preference is not to have setters...

-Jay

On Fri, May 25, 2012 at 2: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
> > > > > >
> > > > >
> > > >
> > >
> >
>

Reply via email to