Hey guys,

Simone asked me to write my 2 cents for it. ;)

Due to the fact, I had a lot to do with Simone and Guice, I just can say
that I also really like fluent apis. But reading this apis feels like
trying to use fluent, where it doesn't fit.

I often have problems with fluent apis, which have really long names for
the method, because without them, it is not clear what they are doing.
(because to complex?!)

{code}
       /* Basic configuration APIs */
       Cache cache = DirectMemory.createNewInstance( new
CacheConfiguration()
       {

           @Override
           public void configure( CacheConfigurator cacheConfigurator )
           {
               cacheConfigurator.buffers().count( 1 );
               cacheConfigurator.allocate(MemoryUnit); //(or what was your
class? ram?)
               cacheConfigurator.dispose().every(TimeUnit);

               cacheConfigurator.bind(Map.class).to(..); //use guice ESDL -
Default Implementations should

    //never
have to be bound manually ;)
               cacheConfigurator.bind(MemoryManager.class).to(..);
               cacheConfigurator.bind(Serializer.class).to(..);
           }

       } );
{code}

{code}
       Pointer a = cache.allocatePointer( 1 ).Gb().identifiedBy( "Simo" );
       Pointer b = cache.put( "Strored!" ).identifiedBy( "Raf" ); //expiring
depends on the default of the cacheConfiguration
       Pointer b2 = cache.put( "Strored!" ).identifiedBy( "Raf"
).expires().in(TimeUnit);

       Pointer d = cache.update( new Object() ).identifiedBy( "Olivier" );
       Pointer e = cache.updateByteArray( new byte[0] ).identifiedBy(
"TomNaso" )
{code}


Do you really have a put and putByteArray? That's hard. ;) And for my
cases, I would add a putStream(..)?   :)

(we have created a cache implementation with focus on files/document cache
(onheap, offheap, ...))

2012/2/19 Simone Tripodi (Created) (JIRA) <[email protected]>

> Adopt fluent APIs for bootstrapping the Cache and manage stored objects
> -----------------------------------------------------------------------
>
>                 Key: DIRECTMEMORY-62
>                 URL: https://issues.apache.org/jira/browse/DIRECTMEMORY-62
>             Project: Apache DirectMemory
>          Issue Type: New Feature
>            Reporter: Simone Tripodi
>            Assignee: Simone Tripodi
>
>
> Hi all guys,
>
> as discussed some days ago, I started prototyping an EDSL embedded in DM
> to make Cache APIs more "sexy" :)
>
> So, influenced by the past experience with Commons Digester - influenced
> by Google Guice - I tried to identify the 2 phases in the Cache lifecycle
>
>  * the "bootstrap" phase - where settings are used to instantiate the
> Cache;
>
>  * the object store management.
>
> Current codebase has a mix of both and users have to be aware of correct
> sequence of operations call, I mean, calling {{Cache.retrieve( "aaa" )}}
> without having previously called {{Cache.init( 1, Ram.Mb( 100 ) )}} at the
> beginning of the program, would cause an error. That is why I recurred to a
> kind of "configuration" pattern to make sure Cache instance have to be
> configured first and then can be used:
>
> {code}
>        /* Basic configuration APIs */
>        Cache cache = DirectMemory.createNewInstance( new
> CacheConfiguration()
>        {
>
>            @Override
>            public void configure( CacheConfigurator cacheConfigurator )
>            {
>                cacheConfigurator.numberOfBuffers().ofSize( 1 );
>                cacheConfigurator.allocateMemoryOfSize( 128 ).Mb();
>                cacheConfigurator.scheduleDisposalEvery( 10 ).hours();
>
>
>  cacheConfigurator.bindConcurrentMap().withJVMConcurrentMap();
>
>  cacheConfigurator.bindMemoryManagerService().withDefaultImplamentation();
>
>  cacheConfigurator.bindSerializer().fromServiceProviderInterface();
>            }
>
>        } );
> {code}
>
> Hoping that the code itself is clear enough, the {{DirectMemory}} class
> accepts a {{CacheConfiguration}}, users have to override the {{ configure(
> CacheConfigurator )}} method, where describing the basic Cache behavior,
> and will return a Cache instance.
>
> According to the DRY (Don't Repeat Yourself) principle, repeating
> "cacheConfigurator" over and over for each binding can get a little
> tedious, so there is an abstract support class:
>
> {code}
>        cache = DirectMemory.createNewInstance( new
> AbstractCacheConfiguration()
>        {
>
>            @Override
>            protected void configure()
>            {
>                numberOfBuffers().ofSize( 1 );
>                allocateMemoryOfSize( 128 ).Mb();
>                scheduleDisposalEvery( 10 ).hours();
>
>                bindConcurrentMap().withJVMConcurrentMap();
>                bindMemoryManagerService().withDefaultImplamentation();
>                bindSerializer().fromServiceProviderInterface();
>            }
>
>        } );
> {code}
>
> Once obtained the Cache instance, users can now start storing objects:
>
> {code}
>        Pointer a = cache.allocatePointer( 1 ).Gb().identifiedBy( "Simo" );
>        Pointer b = cache.put( "Strored!" ).identifiedBy( "Raf"
> ).thatNeverExpires();
>        Pointer c = cache.putByteArray( new byte[0] ).identifiedBy( "Izio"
> ).thatExpiresIn( 1 ).days();
>
>        Pointer d = cache.update( new Object() ).identifiedBy( "Olivier" );
>        Pointer e = cache.updateByteArray( new byte[0] ).identifiedBy(
> "TomNaso" );
> {code}
>
> WDYT?
>
> --
> This message is automatically generated by JIRA.
> If you think it was sent incorrectly, please contact your JIRA
> administrators:
> https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
> For more information on JIRA, see: http://www.atlassian.com/software/jira
>
>
>


-- 
Viele Grüße/Best Regards

Daniel Manzke

Reply via email to