Another advantage of 4 over 3 is that we don't need the case match to deal
with the Option.

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