Nice!
And I was determined not to post again, but at a certain stage my mental
block irresistibly kicked in again:
why ingeniously bit-wise encode the combinations just to later decode them
for better readabilty?

Why not drop this altogether as we won't do any encoding:
        static var STATE_A:Number = 1; //  1 << 0

Define the handlers like
        handlers = {};// or type it/ make it a class
        handlers["STATE_A"] = Delegate.create(this,handleAOnly);
        // etc.

And finally:

     public function handleUpdate(a:Object,b:Object,c:Object,d:Object)
     {
        state = 'STATE_';
        if(a.selected){ state += 'A'};
        if(b.selected){ state += 'B'};
        // etc.

        handlers[state]();
     }

What's the benefit of encoding/decoding numbers? Please enlighten me!

Cheers!
--------------
Andreas Weber
motiondraw.com



-----Original Message-----
From: [EMAIL PROTECTED]
[mailto:[EMAIL PROTECTED] Behalf Of Martin
Wood
Sent: Thursday, January 26, 2006 11:21 AM
To: Flashcoders mailing list
Subject: Re: [Flashcoders] checking combinations


to be more complete how i would actually program it is like this :

import mx.utils.Delegate;

class CombinationHandler
{
     // Declare the values used for each state
     static var STATE_A:Number = 1; //  1 << 0
     static var STATE_B:Number = 2; //  1 << 1
     static var STATE_C:Number = 4; //  1 << 2
     static var STATE_D:Number = 8; //  1 << 3

     // Either declare the combinations here, or just use
     // the STATE_A | STATE_B form in the declare handlers function
     static var COMBINATION_AB:Number = STATE_A | STATE_B;
     static var COMBINATION_BC:Number = STATE_B | STATE_C;

     // array of functions to handle particular states
     // and state combinations
     private var handlers:Array;

     public function CombinationHandler()
     {
         handlers = new Array();
         createHandlers();
     }

     private function createHandlers()
     {
        // single case handlers
        handlers[STATE_A] = Delegate.create(this,handleAOnly);
        handlers[STATE_B] = Delegate.create(this,handleBOnly);
        handlers[STATE_C] = Delegate.create(this,handleCOnly);
        handlers[STATE_D] = Delegate.create(this,handleDOnly);

        // combination handlers
        handlers[COMBINATION_AB] = Delegate.create(this,ABhandler);
        // OR
        // handlers[STATE_A | STATE_B] = ...

     }

     public function handleUpdate(a:Object,b:Object,c:Object,d:Object)
     {
        // 'Digitise' the state from the selected flag in a,b,c,d.
        var state:Number = (a.selected) | (b.selected << 1) |
                           (c.selected << 2) | (d.selected << 3);

        // call the function
        handlers[state]();
     }
}

I think this way adding and modifying handlers is easy and safe, youre
not editing code thats surrounded by support code (like case:, else if
etc) so its clear where each response to a particular state is configured.
You can leave the declaration of the combinations out of the static
declarations at the top of the class like i said and just create the
combinations when defining the handler. That way when you add a
combination its just one place to edit, not two, but you may have a case
for using that information again so the static var could be useful. I
dont know :)

btw, in all the places you see | (bitwise OR) you can use + because it
works out the same, im just used to using the bitwise operators for
dealing with bit-based states and state masks. Similary for the shifts
(<<) you can change them for their equivalent multiplication.

thanks,

Martin

_______________________________________________
Flashcoders mailing list
Flashcoders@chattyfig.figleaf.com
http://chattyfig.figleaf.com/mailman/listinfo/flashcoders


_______________________________________________
Flashcoders mailing list
Flashcoders@chattyfig.figleaf.com
http://chattyfig.figleaf.com/mailman/listinfo/flashcoders

Reply via email to