It should be noted that I am an avid speed cuber, but I have never tried to programatically represent a rubiksRubik's cube in an algorithm or data structure.
I would probably create seperateseparate data structures to capture the unique aspects of each block in a cube.
There are 3 distinct types of blocks on a cube:
Corner Block - It has three color faces and three adjacent pieces that it will share a side with at any time.
Edge Block - It has two color faces and has 4 adjacent pieces that it will share a side with at any time. In 3x3 blocks it always has 2 center pieces and 2 corner pieces.
Center block - In a 3x3 cube this piece is not movable, however it can be rotated. It will always have 4 adjacent edge blocks. In larger cubes there are multiple center blocks that could share with another center block or an edge piece. Center blocks never are adjacent to a corner block.
Knowing this, a Block can have a list of references to other blocks that it touches. I would keep another list of lists, which would be a list of blocks that represent a single cube face and a list that keeps references to every cube face.
Every cube face would be represented as a unique face.
With these data structures it would be pretty easy to write an algorithm that performs a rotation transformation on each face, moving the appropriate blocks into and out of the appropriate lists.
EDIT: Important note, these lists must be ordered of course but I forgot to mention that. For example, if I flip the right side, then the left corner right side block moves to the right corner of the right side and is rotated clockwise.