Up to Main Index Up to Journal for May, 2012
JOURNAL FOR FRIDAY 11TH MAY, 2012
______________________________________________________________________________
SUBJECT: If an apple is of type food is it also edible?
DATE: Fri May 11 20:06:05 BST 2012
At the moment I'm having a right pickle of a time trying to sort the basic
structure of WolfMUD. Currently for the prototype everything is in one
package. Not a good idea for the long term.
For my first attempt I tried creating separate packages for types of things
but ended up with a complex circular import situation between packages :(
I think my main problem is that I'm not thinking Go-ish enough and thinking
more OOP instead.
So back to the Go reference materials for some reading. For interfaces it says
they 'specify the behaviour of an object'[1]. OK got that. The other piece of
the puzzle - I think - is embedding[2].
So if I define behaviours based on commands a thing can understand, violating
the 'er' for one method interface naming for now:
type Examinable interface { Examine() }
type Edible interface { Eat() }
type Gettable interface { Get() }
We could compose a food interface type by embedding the interfaces:
type Food interface {
Examinable
Edible
Gettable
}
Now if for each interface we have a struct with receiver methods we can
compose a default food type using:
type food struct {
examinable
edible
gettable
}
So food should be able to do everything examinable, edible and gettable can
do. Resulting in something like:
> get apple
You get the apple.
> examine apple
You examine an apple. It's a fine juicy apple and not a maggot in sight!
> eat apple
You eat the apple.
>
Using these basics creating poisoned food could be done using:
type poisonedFood struct {
examinable
gettable
}
func (pf *poisonedFood) Eat() {
poisonPlayer()
}
Just add our own implementation of eat() to handle the fact it's poisoned and
satisfy the Edible interface. VoilĂ ! We can now use poisonedFood anywhere we
can use food - well the Edible interface type really ... I think?
Well that's the theory anyway. As they say - The Devil is in the details >:)
For instance in this simple example how do we know who/what is eating? Who can
observe who/what that is doing the eating? How do we tell the edible we want
to eat it? Can who/what actually eat anything? That's where a beautifully
simple idea breaks down into chaotic complexity.
Now where did I put my drawing board? Ah there it is ...
Diddymus sighs.
You see Diddymus go back to his drawing board.
>
--
Diddymus
[1] https://golang.org/doc/effective_go.html#interfaces_and_types
[2] https://golang.org/doc/effective_go.html#embedding
Up to Main Index Up to Journal for May, 2012