bug-gnubg
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Bug-gnubg] The match and game data structure


From: Jonathan Kinsey
Subject: Re: [Bug-gnubg] The match and game data structure
Date: Fri, 30 Jun 2006 11:00:30 +0100
User-agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.8.0.4) Gecko/20060516 Thunderbird/1.5.0.4 Mnenhy/0.7.4.0

Øystein Johansen wrote:
> Hi,
> 
> I have a bad feeling that our data structure for storing matches, games and 
> moverecords are not the best. I'm sometimes affraid it really sucks. I also 
> believe there is a releation between the end product quality and the internal 
> code quality, and I believe these data strutures, might be the Achilles heel 
> in our project.
> 
> Of course I would love to improve this, however I do not want to code 
> anything before I'm sure it's an improvement. I therefore hope that a small 
> discussion about this issue can help us design a better data structure for 
> holding the match data.
> 
> Todays system is simple. (I don't mind things beeing simple, I believe simple 
> is yet beautiful and functional. I'm an advocate of KISS principles). The 
> match is a global linked list of all games. It uses the linked list 
> implementation in the lib directory, which is actually a circular linked 
> list. Each game is a new linked list of moverecords.
> 
> The good thing about this circular list is that appending new elements 
> (moverecords) is a O(1) operation. However, the good things stop there. 
> Looping through a list is a bit cumbersome. It's hard to keep track of a 
> current move and a current game. (We actually have global pointers for this.) 
> This data structure has shown to be bad for working with positions, since it 
> depends on a global list (lMatch).
> 
> Short: I believe it's time for a redesign of the match holding data structure.
> 
> Any suggestions? What's the best redesign. Simply a double linked list (not 
> circular). Do we need match head and game head, to keep track of the size, 
> current move and state etc.? I'm willing to start implementing a better 
> structure if we agree on what we need.

Perhaps I've coded too much C++...  I think a better exercise is to
separate the logic from the data and think more in terms of
modules/interfaces and let this drive the data structures.

In practice this would mean calling functions to work with matches and
games rather than using globals/structs throughout the code.

As an example look at this code from show.c:

for( pl = lMatch.plNext; pl != &lMatch; pl = pl->plNext, ++n )
{
      pmr = (moverecord *) ( (list *) pl->p )->plNext->p;
      pmgi = &pmr->g;
      assert( pmr->mt == MOVE_GAMEINFO );
        ...

It's pretty hard to work out what the code in this example does, which
kind of says something...
Anyway it could look something like:

for (i = 1; i < getNumGames(); i++)
{
      game *g = getGame(i);
      pmgi = getGameInfo(g);
        ...

Jon

Attachment: signature.asc
Description: OpenPGP digital signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]