Exercises in Programming Style–Hollywood

NOTE : read the rest of the series, or check out the source code.

If you enjoy read­ing these exer­cises then please buy Crista’s book to sup­port her work.

exercises-prog-styles-cover

Fol­low­ing on from the last post, we will look at the Hollywood style today.

 

Style 14 – Hollywood

Constraints

  • Larger problem is decomposed into entities using some form of abstraction
  • The entities are never called on directly for actions
  • The entities provide interfaces for other entities to be able to register callbacks
  • At certain points of the computation, the entities call on the other entities that have registered for callbacks

 

I’m not overly fond of Crista’s Python interpretation of this style, so I decided to do something slightly different using F#’s built-in support for Observables. You could also use Rx via FSharp.Control.Reactive, though it seemed to be overkill for this particular problem.

Sticking with the same entities Crista defined in her example:

  • DataStorage
  • StopWordsFilter
  • WordFrequencyCounter

in our F# version, each will subscribe to an upstream IObservable, does whatever it needs to do and provide the output also as an IObservable for downstream entities.

Style14_designv2

And upstream of all the entities is an attempt to run a term frequency analysis against a data file and a corresponding stop words file:

Style14_01

Our version of DataStorage would depend on an IObservable<RunArgs>. It’ll in turn expose an IObservable<RunArgs * string[]> as member so downstream entities can subscribe to and be notified when DataStorage is able to load the words from the specified data file.

Style14_02

Next, we’ll implement a StopWordsFilter type that will:

  1. subscribe to an IObservable<RunArgs * string[]>;
  2. on a new value, load the stop words and use them to filter the words from the data file;
  3. make the filtered words available to downstream entities via an IObservable<string[]>

Style14_03

Finally we have the WordFrequencyCounter, which takes an IObservable<string[]> and print the top 25 most frequent words:

Style14_04

To string everything together, we’ll create an instance of IObservable<RunArgs> via an F# Event (Event.Publish gives us an instance of IEvent<‘T> which inherits from IObservable<T>).

This IOservable will act as the upstream to DataStorage and to kick things off we just have to trigger a new event with an instance of RunArgs:

Style14_05

 

You can find the source code for this exer­cise here.

1 Comment

  1. Pingback: F# Weekly #4, 2016 | Sergey Tihon's Blog

Leave a Reply

Your email address will not be published.