[python-uk] hexagonal Django

James Broadhead jamesbroadhead at gmail.com
Wed Aug 13 12:32:15 CEST 2014


On 13 August 2014 08:17, Peter Inglesby <peter.inglesby at gmail.com> wrote:

> > I'm starting my week-long exercise on trying it out on a slice of our
> existing Django monster. I'll report back.
>
> Echoes of Captain Oates here?
>
> Anyway, reviving an old thread: Brandon Rhodes talks provides a
> straightforward and accessible summary of "The Clean Architecture" in a
> recent talk[0] and it's the least wanky discussion of this kind that I've
> come across.  His main point is that things with side effects (particularly
> calling external services) should be isolated in "procedural glue" code,
> while the processing of data -- the business logic -- should happen in pure
> functional code.  This leads to a better focus on the structure of the data
> you're dealing with, which in turn leads to more comprehensible and
> maintainable code.
>
> Thoughts?
>
> [0] http://www.pyvideo.org/video/2840/the-clean-architecture-in-python
>

I'm always reminded of that Rimmer quote about Oates...

I've been doing this recently with Twisted -- separating out async code
that deals with deferred chains from synchronous logic handling the results
of the deferreds.
I'm finding that it's leading to clear, easily tested code -- simple
synchronous tests on real data for the business logic, and stubbed
success/failures to test the various code-paths in the deferred logic.
I came to this variously by tangling too much with mixes of deferred-flows
and business logic while trying to write simple tests and seeing this DAS
talk on Boundaries [1]

d = defer.succeed(foo)
d.addCallback(handle_foo)
d.addCallback(make_request)
d.addErrback(retry, make_request, foo)
d.addCallback(parse_body)
return d
^ code like this is easily tested by stubbing all the callbacks, with the
stubs either succeeding or raising synchronous exceptions.

def parse_body(body):
  content = json.parse(body.read())
  if not 'username' in content:
    raise HttpError(401)
  return Response(content)
^ again, really easy to test. No deep nested logic, no need to mock or
stub.

[1] https://www.destroyallsoftware.com/talks/boundaries
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-uk/attachments/20140813/cab2c4df/attachment.html>


More information about the python-uk mailing list