Hi Goran,

Mmmm, I feel I must ask the "why?" question here. :) What are you actually trying to implement? The reason I ask is because it looks like you may be falling into the trap of "data objects" (creating structures of data with
no real behaviors).

Yes, that's an accurate description of what I'm trying to model: the Movement Table from a very complicated, 'age of sail' board game. The table models the speed of 9 classes of sailing ships at various wind speeds, sail settings, damage, and points of sail.

Thus it describes or summarizes some of the sailing attributes of these 9 classes of ships. I've studied the table to see if it could be computed, rather than simply stored, but I think the table summarizes empirical data gleaned from historical records, rather than a mathematical function, so not easy to model without a table.

I have use polymorphism to break the one massive table into 9 smaller tables, one in each of the 9 classes of ships (children of class Ship).

I'm storing them in a class variable and using it, more or less, as a constant lookup table. There isn't much behavior in the table itself, but it models behavior, if you see what I mean.

And there is plenty of other behavior in the ship classes, as you can imagine.

The real 'why' is fun. I've been wanting to learn Smalltalk and to program a game like this for about 25 years. With Squeak on a Mac, and a pile of Smalltalk books bought second-hand from Amazon, I'm making some progress. With the side benefit of learning some new tricks that help my Ruby programming (my day job).


Or, I'm thinking it might be simpler to leave the literal as an
array, and do the castings as necessary during access, like this:

The word "casting" is not generally used in the Smalltalk context given
that Smalltalk is not statically typed. #as: is a message send and it
creates a new object of the given class. You can see what it does by
looking at Object>>as:.

Sorry... still learning the Smalltalk jargon.

You can do it in several ways - it's just "code". If you only need Symbols
and literals as above you could use regular Array syntax (it only
evaluates literals - not expressions - and it is constructed at compile
time):

| result dict |
result := Dictionary new.
#(
        (fs (C 0  B 1  R 0))
        (gs (C 7  B 5  R 4))
        (gs (C 7  B 5  R 4))
) do: [:arr |
        dict := Dictionary new.
        arr second pairsDo: [:a :b | dict at: a put: b].
        result at: arr first put: dict].
result

This is an interesting approach, too. I'm currently thinking that I don't really need to store the data as a dictionary... my main concern is to format the table(s) in a way that is easy for *me* to read (so I can find and fix the inevitable typos.)

I don't really care if the computer has to do some heavy lifting to *access* the data. It's not something that has to be fast. So I'm going to go for an approach that maximizes the human readability of the data, and pushes the complicated bits into the accessors.

Thanks!

-- John

_______________________________________________
Beginners mailing list
Beginners@lists.squeakfoundation.org
http://lists.squeakfoundation.org/mailman/listinfo/beginners

Reply via email to