Wednesday, June 12, 2013

Create unified interfaces across dart:io and dart:html

Dart runs on the client, thanks to dart:html, and on the command line, thanks to dart:io. However, like oil and water, those two libraries just don't mix. Your web apps can't use dart:io, and your server apps can't use dart:html. Normally, this isn't a problem, because the two different targets are oh so very different. However, some concepts are common, such as Web sockets or HTTP requests. Wouldn't it be nice to have a unified interface to Web sockets that works with either dart:io or dart:html? I'll spare you the suspense: Yes!

This post shows you one strategy to design a high-level interface for functionality that exists in both dart:io and dart:html. While the Dart team has the concept of configurability on their radar, not much concrete action has happened. In the meantime, try this strategy and you too can experiment with unifying interfaces and APIs. Code reuse FTW!

(This post was inspired by Mark Bennett's original question who is trying to build a more unified Web Socket interface.)

Step 1: Create a library and an interface

Design the interface that unifies something from dart:html and dart:io.

library shared; abstract class BaseFoo { common(); }

Step 2: Implement the interface for dart:html

In another library, implement the interface with dart:html:

library html_thing; import 'dart:html'; import 'shared_interface.dart'; class Foo extends BaseFoo { common() { print('from html'); } }

Step 3: Implement the interface for dart:io

In another library, implement the interface with dart:io.

library io_thing; import 'dart:io'; import 'shared_interface.dart'; class Foo extends BaseFoo { common() { print('from io'); } }

Step 4: Package it up

All of the previous code can go into the same pub package.

Pick a library to use

The consumer of your pub package must decide which library to import. For example, a dart:io app might look like this:

import 'dart:io'; import 'package:sharedinterfacetest/io_version.dart'; main() { var foo = new Foo(); foo.common(); }

Hope that helps! All the code for this example is found at Github.
Post a Comment

Disclaimer

I'm probably required to say that the views expressed in this blog are my own, and do not necessarily reflect those of my employer. Also, except as otherwise noted, the content of this page is licensed under the Creative Commons Attribution 3.0 License, and code samples are licensed under the BSD License.