why is asDictonary a class method

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
7 messages Options
Reply | Threaded
Open this post in threaded view
|

why is asDictonary a class method

Roelof
Hello,

Im busy with a new challenge from exercism.
Where I have to keep track of a robot , where it facing and on that
coordinate the robot is.

so I made this function what the test wanted

createDirection: aString position: aCollection
     self robot: (Robot directionLooking: aString) yourself.
     ^ self robot asDictonary

I can see that on the first part a new robot is made with the right data.
but the test wants the data back as a Dictonary
that is why I made the self robot asDictonary line

but to my suprise the compiler wants it be a class method where I expect
it to be a instance method.

Can someone explain to my why this is ?

Roelof


Reply | Threaded
Open this post in threaded view
|

Re: why is asDictonary a class method

Dennis Schetinin
Didn't you forget to return (^) an instance from #directionLooking:?

And why do you need to send #yourself?


сб, 30 марта 2019 г. в 21:19, Roelof Wobben <[hidden email]>:
Hello,

Im busy with a new challenge from exercism.
Where I have to keep track of a robot , where it facing and on that
coordinate the robot is.

so I made this function what the test wanted

createDirection: aString position: aCollection
     self robot: (Robot directionLooking: aString) yourself.
     ^ self robot asDictonary

I can see that on the first part a new robot is made with the right data.
but the test wants the data back as a Dictonary
that is why I made the self robot asDictonary line

but to my suprise the compiler wants it be a class method where I expect
it to be a instance method.

Can someone explain to my why this is ?

Roelof


--


--

Best regards,


Dennis Schetinin

Reply | Threaded
Open this post in threaded view
|

Re: why is asDictonary a class method

Richard O'Keefe
In reply to this post by Roelof
Question 1.  Should that be #asDictionary?
Question 2.  If not, what's a Dictonary?
Question 3.  I see you are using self-encapsulation,
             with a getter 'self robot'
             and a setter 'self robot: something'.
             Of course that means that outside code
             can freely smash your "robot" property,
             unless #robot: checks that its argument
             makes sense.  Does it?
Question 4.  What kind of thing *is* "robot".
             Have you checked that 'Robot directionLooking: ...'
             returns an instance of Robot?  If you accidentally
             omitted '^' it might return the Robot class itself.
Question 5.  Are you sure that 'self robot' returns
             what you think it does?  Have you checked?
Question 6.  Does Robot have an #asDictionary method?
             Does Robot have an #asDictonary method?
Question 7.  Why is "aCollection" not used in this method?
Question 8.  Why are you using 'yourself'?
Question 9.  Why does the caller want a dictionary instead of
             a Robot?  What should be in that dictionary?

There are more questions but those will do to be going on with.
If your #robot: method began like
    robot: aRobot
      (aRobot isKindOf: Robot)
        ifFalse: [aRobot error: 'not an instance of Robot'].
you would have caught what I suspect is your problem.
Check question 4.



On Sun, 31 Mar 2019 at 07:19, Roelof Wobben <[hidden email]> wrote:
Hello,

Im busy with a new challenge from exercism.
Where I have to keep track of a robot , where it facing and on that
coordinate the robot is.

so I made this function what the test wanted

createDirection: aString position: aCollection
     self robot: (Robot directionLooking: aString) yourself.
     ^ self robot asDictonary

I can see that on the first part a new robot is made with the right data.
but the test wants the data back as a Dictonary
that is why I made the self robot asDictonary line

but to my suprise the compiler wants it be a class method where I expect
it to be a instance method.

Can someone explain to my why this is ?

Roelof


Reply | Threaded
Open this post in threaded view
|

Re: why is asDictonary a class method

Roelof
Op 31-3-2019 om 03:47 schreef Richard O'Keefe:
Question 1.  Should that be #asDictionary?


yes, it does.

Question 2.  If not, what's a Dictonary?
Question 3.  I see you are using self-encapsulation,
             with a getter 'self robot'
             and a setter 'self robot: something'.
             Of course that means that outside code
             can freely smash your "robot" property,
             unless #robot: checks that its argument
             makes sense.  Does it?


no, it does not.


Question 4.  What kind of thing *is* "robot".
             Have you checked that 'Robot directionLooking: ...'
             returns an instance of Robot?  If you accidentally
             omitted '^' it might return the Robot class itself.


yes, I forget the ^ thing
see this code.

directionLooking: aString
    self new direction: aString


so I have to think well how to return a instance of a Robot here.

as far as I see  I do not have a robot yet.

createDirection: aString position: aCollection
    self robot: (Robot directionLooking: aString) yourself.
    ^ self robot asDictionary

or I overlook something.



Question 5.  Are you sure that 'self robot' returns
             what you think it does?  Have you checked?

yes, I checked. self Robot  give me a variable robot which is a Robot.

Question 6.  Does Robot have an #asDictionary method?
             Does Robot have an #asDictonary method?


Yes, it does
Question 7.  Why is "aCollection" not used in this method?

Because I  wanted to be  sure things are working before I added the position which is a difficult one.

Question 8.  Why are you using 'yourself'?

I thought I was needed so I get a instance of a Robot back.

Question 9.  Why does the caller want a dictionary instead of
             a Robot?  What should be in that dictionary?


The same data as the Robot has but then in a dictionary form.
That is what I try to achieve.

There are more questions but those will do to be going on with.
If your #robot: method began like
    robot: aRobot
      (aRobot isKindOf: Robot)
        ifFalse: [aRobot error: 'not an instance of Robot'].
you would have caught what I suspect is your problem.
Check question 4.



On Sun, 31 Mar 2019 at 07:19, Roelof Wobben <[hidden email]> wrote:
Hello,

Im busy with a new challenge from exercism.
Where I have to keep track of a robot , where it facing and on that
coordinate the robot is.

so I made this function what the test wanted

createDirection: aString position: aCollection
     self robot: (Robot directionLooking: aString) yourself.
     ^ self robot asDictonary

I can see that on the first part a new robot is made with the right data.
but the test wants the data back as a Dictonary
that is why I made the self robot asDictonary line

but to my suprise the compiler wants it be a class method where I expect
it to be a instance method.

Can someone explain to my why this is ?

Roelof



Reply | Threaded
Open this post in threaded view
|

Re: why is asDictonary a class method

Richard O'Keefe
I think you probably need to show us *all* the code.

directionLooking: aString
    self new direction: aString

Well, there is your problem.
There are two ways for a method to return a value.
One is to execute '^ e' for some expression e,
which is quite like a 'return e;' statement in C.
The other is to execute the whole body and come to
the end of the method, and in that case the result
is always 'self'.  This means that the method as you
wrote it
 - created an uninitialised or incompletely initialised
   instance of Robot (self new)
 - asked that instance to set its direction
 - discarded the result of that setting
 - forgot the new instance
 - returned the Robot class

What you probably meant was
directionLooking: aString
    ^(self new) direction: aString; yourself
where 'yourself' has nothing to do with a new
object being created but with the fact that
you want the new object as the result, not
whatever #direction: returns.
directionLooking: aString
  |newRobot|
  newRobot := self new.
  newRobot direction: aString.
  ^newRobot
may be clearer to you.

By the way, you didn't say WHY the caller wants a Dictionary
instead of a Robot.  I don't think I've ever written a program
where that was a good idea.




On Sun, 31 Mar 2019 at 19:55, Roelof Wobben <[hidden email]> wrote:
Op 31-3-2019 om 03:47 schreef Richard O'Keefe:
Question 1.  Should that be #asDictionary?


yes, it does.

Question 2.  If not, what's a Dictonary?
Question 3.  I see you are using self-encapsulation,
             with a getter 'self robot'
             and a setter 'self robot: something'.
             Of course that means that outside code
             can freely smash your "robot" property,
             unless #robot: checks that its argument
             makes sense.  Does it?


no, it does not.


Question 4.  What kind of thing *is* "robot".
             Have you checked that 'Robot directionLooking: ...'
             returns an instance of Robot?  If you accidentally
             omitted '^' it might return the Robot class itself.


yes, I forget the ^ thing
see this code.

directionLooking: aString
    self new direction: aString


so I have to think well how to return a instance of a Robot here.

as far as I see  I do not have a robot yet.

createDirection: aString position: aCollection
    self robot: (Robot directionLooking: aString) yourself.
    ^ self robot asDictionary

or I overlook something.



Question 5.  Are you sure that 'self robot' returns
             what you think it does?  Have you checked?

yes, I checked. self Robot  give me a variable robot which is a Robot.

Question 6.  Does Robot have an #asDictionary method?
             Does Robot have an #asDictonary method?


Yes, it does
Question 7.  Why is "aCollection" not used in this method?

Because I  wanted to be  sure things are working before I added the position which is a difficult one.

Question 8.  Why are you using 'yourself'?

I thought I was needed so I get a instance of a Robot back.

Question 9.  Why does the caller want a dictionary instead of
             a Robot?  What should be in that dictionary?


The same data as the Robot has but then in a dictionary form.
That is what I try to achieve.

There are more questions but those will do to be going on with.
If your #robot: method began like
    robot: aRobot
      (aRobot isKindOf: Robot)
        ifFalse: [aRobot error: 'not an instance of Robot'].
you would have caught what I suspect is your problem.
Check question 4.



On Sun, 31 Mar 2019 at 07:19, Roelof Wobben <[hidden email]> wrote:
Hello,

Im busy with a new challenge from exercism.
Where I have to keep track of a robot , where it facing and on that
coordinate the robot is.

so I made this function what the test wanted

createDirection: aString position: aCollection
     self robot: (Robot directionLooking: aString) yourself.
     ^ self robot asDictonary

I can see that on the first part a new robot is made with the right data.
but the test wants the data back as a Dictonary
that is why I made the self robot asDictonary line

but to my suprise the compiler wants it be a class method where I expect
it to be a instance method.

Can someone explain to my why this is ?

Roelof



Reply | Threaded
Open this post in threaded view
|

Re: why is asDictonary a class method

Tim Mackinnon
Hi Richard/all - thanks for helping Roelof out. He’s working through the exercism.io exercises that we’ve managed to convert so far. As they are based on more C like languages, they aren’t always as OO as we want (once we get a decent set converted, we’ll try and add some smallish examples - anyone’s favourites appreciated).

The dictionary reference is normally because the exercise tests like to assert on some description at the end (and dictionaries tend to exist universally in most languages). So view it more as a #printOn: like finalé (this said - Roelof might have this behaviour in the wrong place - but we will see).

The feedback so far, seems to have helpfully unblocked him so thanks all.

Tim

Sent from my iPhone

On 31 Mar 2019, at 12:02, Richard O'Keefe <[hidden email]> wrote:

I think you probably need to show us *all* the code.

directionLooking: aString
    self new direction: aString

Well, there is your problem.
There are two ways for a method to return a value.
One is to execute '^ e' for some expression e,
which is quite like a 'return e;' statement in C.
The other is to execute the whole body and come to
the end of the method, and in that case the result
is always 'self'.  This means that the method as you
wrote it
 - created an uninitialised or incompletely initialised
   instance of Robot (self new)
 - asked that instance to set its direction
 - discarded the result of that setting
 - forgot the new instance
 - returned the Robot class

What you probably meant was
directionLooking: aString
    ^(self new) direction: aString; yourself
where 'yourself' has nothing to do with a new
object being created but with the fact that
you want the new object as the result, not
whatever #direction: returns.
directionLooking: aString
  |newRobot|
  newRobot := self new.
  newRobot direction: aString.
  ^newRobot
may be clearer to you.

By the way, you didn't say WHY the caller wants a Dictionary
instead of a Robot.  I don't think I've ever written a program
where that was a good idea.




On Sun, 31 Mar 2019 at 19:55, Roelof Wobben <[hidden email]> wrote:
Op 31-3-2019 om 03:47 schreef Richard O'Keefe:
Question 1.  Should that be #asDictionary?


yes, it does.

Question 2.  If not, what's a Dictonary?
Question 3.  I see you are using self-encapsulation,
             with a getter 'self robot'
             and a setter 'self robot: something'.
             Of course that means that outside code
             can freely smash your "robot" property,
             unless #robot: checks that its argument
             makes sense.  Does it?


no, it does not.


Question 4.  What kind of thing *is* "robot".
             Have you checked that 'Robot directionLooking: ...'
             returns an instance of Robot?  If you accidentally
             omitted '^' it might return the Robot class itself.


yes, I forget the ^ thing
see this code.

directionLooking: aString
    self new direction: aString


so I have to think well how to return a instance of a Robot here.

as far as I see  I do not have a robot yet.

createDirection: aString position: aCollection
    self robot: (Robot directionLooking: aString) yourself.
    ^ self robot asDictionary

or I overlook something.



Question 5.  Are you sure that 'self robot' returns
             what you think it does?  Have you checked?

yes, I checked. self Robot  give me a variable robot which is a Robot.

Question 6.  Does Robot have an #asDictionary method?
             Does Robot have an #asDictonary method?


Yes, it does
Question 7.  Why is "aCollection" not used in this method?

Because I  wanted to be  sure things are working before I added the position which is a difficult one.

Question 8.  Why are you using 'yourself'?

I thought I was needed so I get a instance of a Robot back.

Question 9.  Why does the caller want a dictionary instead of
             a Robot?  What should be in that dictionary?


The same data as the Robot has but then in a dictionary form.
That is what I try to achieve.

There are more questions but those will do to be going on with.
If your #robot: method began like
    robot: aRobot
      (aRobot isKindOf: Robot)
        ifFalse: [aRobot error: 'not an instance of Robot'].
you would have caught what I suspect is your problem.
Check question 4.



On Sun, 31 Mar 2019 at 07:19, Roelof Wobben <[hidden email]> wrote:
Hello,

Im busy with a new challenge from exercism.
Where I have to keep track of a robot , where it facing and on that
coordinate the robot is.

so I made this function what the test wanted

createDirection: aString position: aCollection
     self robot: (Robot directionLooking: aString) yourself.
     ^ self robot asDictonary

I can see that on the first part a new robot is made with the right data.
but the test wants the data back as a Dictonary
that is why I made the self robot asDictonary line

but to my suprise the compiler wants it be a class method where I expect
it to be a instance method.

Can someone explain to my why this is ?

Roelof



Reply | Threaded
Open this post in threaded view
|

Re: why is asDictonary a class method

Roelof
Tim Thanks

I could not answer this because of the birtday of my wife today but you did a excellent job.

Roelof



Op 31-3-2019 om 17:29 schreef Tim Mackinnon:
Hi Richard/all - thanks for helping Roelof out. He’s working through the exercism.io exercises that we’ve managed to convert so far. As they are based on more C like languages, they aren’t always as OO as we want (once we get a decent set converted, we’ll try and add some smallish examples - anyone’s favourites appreciated).

The dictionary reference is normally because the exercise tests like to assert on some description at the end (and dictionaries tend to exist universally in most languages). So view it more as a #printOn: like finalé (this said - Roelof might have this behaviour in the wrong place - but we will see).

The feedback so far, seems to have helpfully unblocked him so thanks all.

Tim

Sent from my iPhone

On 31 Mar 2019, at 12:02, Richard O'Keefe <[hidden email]> wrote:

I think you probably need to show us *all* the code.

directionLooking: aString
    self new direction: aString

Well, there is your problem.
There are two ways for a method to return a value.
One is to execute '^ e' for some expression e,
which is quite like a 'return e;' statement in C.
The other is to execute the whole body and come to
the end of the method, and in that case the result
is always 'self'.  This means that the method as you
wrote it
 - created an uninitialised or incompletely initialised
   instance of Robot (self new)
 - asked that instance to set its direction
 - discarded the result of that setting
 - forgot the new instance
 - returned the Robot class

What you probably meant was
directionLooking: aString
    ^(self new) direction: aString; yourself
where 'yourself' has nothing to do with a new
object being created but with the fact that
you want the new object as the result, not
whatever #direction: returns.
directionLooking: aString
  |newRobot|
  newRobot := self new.
  newRobot direction: aString.
  ^newRobot
may be clearer to you.

By the way, you didn't say WHY the caller wants a Dictionary
instead of a Robot.  I don't think I've ever written a program
where that was a good idea.




On Sun, 31 Mar 2019 at 19:55, Roelof Wobben <[hidden email]> wrote:
Op 31-3-2019 om 03:47 schreef Richard O'Keefe:
Question 1.  Should that be #asDictionary?


yes, it does.

Question 2.  If not, what's a Dictonary?
Question 3.  I see you are using self-encapsulation,
             with a getter 'self robot'
             and a setter 'self robot: something'.
             Of course that means that outside code
             can freely smash your "robot" property,
             unless #robot: checks that its argument
             makes sense.  Does it?


no, it does not.


Question 4.  What kind of thing *is* "robot".
             Have you checked that 'Robot directionLooking: ...'
             returns an instance of Robot?  If you accidentally
             omitted '^' it might return the Robot class itself.


yes, I forget the ^ thing
see this code.

directionLooking: aString
    self new direction: aString


so I have to think well how to return a instance of a Robot here.

as far as I see  I do not have a robot yet.

createDirection: aString position: aCollection
    self robot: (Robot directionLooking: aString) yourself.
    ^ self robot asDictionary

or I overlook something.



Question 5.  Are you sure that 'self robot' returns
             what you think it does?  Have you checked?

yes, I checked. self Robot  give me a variable robot which is a Robot.

Question 6.  Does Robot have an #asDictionary method?
             Does Robot have an #asDictonary method?


Yes, it does
Question 7.  Why is "aCollection" not used in this method?

Because I  wanted to be  sure things are working before I added the position which is a difficult one.

Question 8.  Why are you using 'yourself'?

I thought I was needed so I get a instance of a Robot back.

Question 9.  Why does the caller want a dictionary instead of
             a Robot?  What should be in that dictionary?


The same data as the Robot has but then in a dictionary form.
That is what I try to achieve.

There are more questions but those will do to be going on with.
If your #robot: method began like
    robot: aRobot
      (aRobot isKindOf: Robot)
        ifFalse: [aRobot error: 'not an instance of Robot'].
you would have caught what I suspect is your problem.
Check question 4.



On Sun, 31 Mar 2019 at 07:19, Roelof Wobben <[hidden email]> wrote:
Hello,

Im busy with a new challenge from exercism.
Where I have to keep track of a robot , where it facing and on that
coordinate the robot is.

so I made this function what the test wanted

createDirection: aString position: aCollection
     self robot: (Robot directionLooking: aString) yourself.
     ^ self robot asDictonary

I can see that on the first part a new robot is made with the right data.
but the test wants the data back as a Dictonary
that is why I made the self robot asDictonary line

but to my suprise the compiler wants it be a class method where I expect
it to be a instance method.

Can someone explain to my why this is ?

Roelof