Thursday, June 5, 2008

Design Pattern in PHP: Factory pattern

The factory pattern is most interesting when Testing and Refactoring because one can substitute a class implementation for another without changing the core code.

In the example below, I have demonstrated a versatile factory method which sports object instance creation with a variable parameter list.

  • Base::factory( $className /*optional parameters*/ ) creates an object of class $className with, optionally, a list of parameters passed to the constructor
    • E.g. $object = Base::factory( 'TestClass', 'param1', 'param2' );
  • Base::mapClass( $sourceClassName, $targetClassName ) adds a mapping entry so that the factory builds an object instance of $targetClassName instead of $sourceClassName when asked to build for $sourceClassName
    • E.g. Base::mapClass( 'TestClass', 'TestDebugClass' );




Project
The project is located at GoogleCode.

Tuesday, June 3, 2008

Design Pattern in PHP: Template Method

This next design pattern should not be mistaken with the common template conception (see Web template) more commonly found in web-technologies.

The template method pattern is designed with a base class which contains an high-level recipe and relies on sub-classes to specify the ingredients. An example would be a template for publishing a table of objects: the template method base class would implement the publishing logic whilst the sub-class would extract the relevant data pieces to expose in the table.




Project
The project is located at GoogleCode.

Friday, May 30, 2008

Using Yahoo! Pipes with WEB-Services

I recently struggled a bit with Yahoo! Pipes when playing with this great tool trying to form a properly updating RSS feed from a WEB-Service source. The WEB-Service in question is available through one of Ohloh's API : Project.

The issue was related to the <guid> field required by (most?) RSS Aggregators (I use the excellent GoogleReader): fetching a data feed from a WEB-Service API usually means that no "proper" feed is in place and an RSS item must be created on-the-fly. This is no problem as such but when the RSS aggregator comes fetching updates, the <guid> field isn't updated dynamically by Yahoo! Pipes.

Part of the solution comes from using a mostly undocumented feature of Pipes: the y:id.value item tag.

After fetching the data from the data source, copy a field that can serve as good <guid> into the y:id.value field. In the example above, I used the updated_at field which, of course, isn't a <guid> per-se by not being global ; I'll find a better way next time around.


Finally, before connecting the "pipe output", insert the y:id.value in the pipes results as shown above.

For the interested, here is the pipe's address: Ohloh Project Summary as well as a link to all my pipes.

Have fun with Pipes... I know I do!

Thursday, May 29, 2008

Design Pattern in PHP: Borg pattern

I thought about sharing some design patterns (expressed in PHP) I have documented. The first one is the borg. This design pattern serves as a good alternative option to the well-known singleton pattern.

The advantages of the borg are:

  1. no need in client classes for special creation / access methods
  2. easily sub-classed
  3. more easily testable




Project
The project is located at GoogleCode.

Friday, May 9, 2008

Communication Types

There are 3 basic type of communication as illustrated in the following diagram:



Message
A message consists in a sequence of symbols, purposely chosen, from a lexicon. Note that the time-domain is not part of the information conveyed.

Open Sequence
An open sequence of messages carries information through the messages themselves but also through the order of the sequence i.e. the order in which the messages must be interpretated matters.

Timed Sequence
In a timed sequence, the time-domain adds information to the communication. Each symbol occupies, purposely, a temporal position in the ordered sequence. The receiving-end of the communication expects this timing to be respected in order to interpret the communication.