Cache design

[email protected] (Ulf Wendel) Thu, 01 Mar 2001 19:04:07 +0100
Newsgroups php.pear
Message-ID <[email protected]>
Hi,

Christian Stocker wrote:
> i made yesterday and today a proposal to ulf and vinai, how the whole
> thing could be done a little bit different (i'm not very happy with the
> fact that the class Cache calls another class. i think, it should go the
> other way round, so that the container classes extend the base class and
> one calls the container class directly).  now, i know why there was no
> answer from ulf... if i feel to, i maybe post it here, too. or go to
> http://cvs.nomad.ch/index.cgi/pear/Cache/ and look at base.php and
> Container/db2.php, they do that already (with some flaws naturally). and
> feel free to do with it whatever you want :)

I read that posting, did not 100% get what you mean but I guess I had a
similar feeling about the design, but it's ok. We now have this
structure:

 Function Cache
 Output Cache 
 Graphics Cache
     ^
     |
  extends 
     |
   
   Cache 

This is absolutely perfect. The're a generic base class Cache that
caches data. Now we wanted an abstraction for the storage container. So
we all looked at PHPLib session implementation where we find a
controller/supplier structure for the storage container. 

  Cache --- uses --> Cache_Container

  Container_File
  Container_XY
      ^
      | 
   extends 
      |
 Cache_Container

Cache_Container implements the interface we need, Container_XY overrides
the abstract methods. Cache acts as a wrapper for it's supplier
Cache_Container and offers some methods itself. This is a perfect OO
design.

Now, when we start to implement it, well see that Cache does not offer
that many methods that can't be placed into Cache_Container and we might
get worried about the "overhead". Ok, lets change the structure and
throw Cache away to see what happens.

  Output_Cache
      ^
      |
   extends 
      |
 Container_XY 

Now I'd like to combine a certain Cache type (Output, Function,
Graphics, ...) and with a certain storage type (File). What do I have to
do? Change my code so that type x extends storage y. This is not very
flexible as I can't do this as runtime. So I'd put x multiply y
combination on my hard disk... :/. It's a bad idea to kick the Cache
class. 

Ulf