<div dir="ltr"><div>> <span style="color:rgb(0,0,0);font-family:arial,sans-serif;font-size:13px">I'm starting my week-long exercise on trying it out on a slice of our existing Django monster. I'll report back.</span></div>
<div><span style="color:rgb(0,0,0);font-family:arial,sans-serif;font-size:13px"><br></span></div><div><span style="color:rgb(0,0,0);font-family:arial,sans-serif;font-size:13px">Echoes of Captain Oates here?</span></div><div>
<br></div><div>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.</div>
<div><br></div><div>Thoughts?</div><div><br></div>[0] <a href="http://www.pyvideo.org/video/2840/the-clean-architecture-in-python" target="_blank">http://www.pyvideo.org/video/2840/the-clean-architecture-in-python</a><br>

<div class="gmail_extra"><br><br><div class="gmail_quote">On 13 December 2012 11:28, Jonathan Hartley <span dir="ltr"><<a href="mailto:tartley@tartley.com" target="_blank">tartley@tartley.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Thanks everyone. I've been enlightened, encouraged and forewarned by the responses to my initial question. (and thanks for the Rich Hickey talk, I hadn't seen that one)<br>

<br>
I absolutely empathise with the warnings to avoid needlessly creating extra layers or plumbing.<br>
<br>
I have a colleague who says many of the projects where he used to work at Microsoft Research used this pattern, and while he liked it overall, if he had to find fault, they found it to cause duplication of sorts, in things like the persistence component mapping fields of the business objects into database-compatible types. Hence adding a field meant both changing the core business object, and changing the persistence component to incorporate the extra field, and also the plumbing between the two.<br>

<br>
I also heed the advice to beware shoehorning problems into a single one-size-fits-all solution.<br>
<br>
I also liked people who brought up particular thorny areas with Django in particular, such as the admin views.<br>
<br>
However, I'm hopeful that, in my particular case at least, the interfaces and extra layers will be close to trivial, and any disadvantages may be outweighed by extracting my database/network code from my business logic.<br>

<br>
I'm starting my week-long exercise on trying it out on a slice of our existing Django monster. I'll report back.<span class=""><font color="#888888"><br>
<br>
    Jonathan</font></span><div class=""><div class="h5"><br>
<br>
<br>
<br>
On 10/12/2012 19:02, Chris Withers wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
Yeah, what he said :-)<br>
<br>
(joking aside, John has summed this all up very nicely...)<br>
<br>
Chris<br>
<br>
On 06/12/2012 00:57, John Lee wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
On Tue, 4 Dec 2012, Jonathan Hartley wrote:<br>
<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
The last few weeks I've been thinking about the architectural pattern<br>
known as Clean, Onion, Hexagonal, or Ports'n'Adaptors<br>
<<a href="http://blog.8thlight.com/uncle-bob/2012/08/13/the-clean-architecture.html" target="_blank">http://blog.8thlight.com/<u></u>uncle-bob/2012/08/13/the-<u></u>clean-architecture.html</a>> <br>
(<a href="http://blog.8thlight.com/uncle-bob/2012/08/13/the-clean-architecture.html" target="_blank">http://blog.8thlight.com/<u></u>uncle-bob/2012/08/13/the-<u></u>clean-architecture.html</a>). <br>
I'm curious if many people are applying it in the Django world?<br>
<br>
I haven't, yet, but I'm thinking of refactoring a vertical slice of<br>
our monster Django app into this style, and I'd love to hear if you<br>
think it's crazy / brilliant / obvious / old-hat, etc.<br>
</blockquote>
<br>
I have to confess I've only very lightly skimmed the article (which<br>
looks like it says some sensible things), but that's not going to stop<br>
me pontificating in over-general terms and posting a video that I liked:<br>
<br>
The best programmers I've worked with have a knack to ruthlessly pick<br>
the simplest possible abstractions to fit the job in hand. They never<br>
stop thinking to settle on any one-size-fits-all programming style. The<br>
problem with those two statements I just made is that everybody can read<br>
them and think that they agree with them. What *I* mean by simple is<br>
close to what Rich Hickey means in the first part of this talk (though I<br>
don't know enough to decide what I think about how he goes on to defend<br>
Clojure and its design principles in those terms):<br>
<br>
<a href="http://www.infoq.com/presentations/Simple-Made-Easy" target="_blank">http://www.infoq.com/<u></u>presentations/Simple-Made-Easy</a><br>
<br>
<br>
(BTW, it's a shame to hear him give security as an example of a<br>
separable concern, because it isn't one)<br>
<br>
The best code, you look at the functionality, then the code, and think<br>
"where is all the code?" and "how did such simplistic code happen to<br>
implement exactly what was needed?". That's different from the "OMG,<br>
what is all this stuff for" feeling you get from over-engineered or just<br>
badly-factored code. The best code is easy to change in the sense that<br>
changes in functionality require commensurate coding effort, and it's<br>
clear what code would have to change. But it is also hard to change, in<br>
the sense that any change that leaves the behaviour the same would<br>
clearly make it worse -- including adding or removing abstraction.<br>
<br>
I'd agree with Andy that not fighting too many battles with your<br>
framework has a lot to be said for it (and that it's maybe more<br>
important to nail basic coding practices of the kind you'd find in Code<br>
Complete than to take even a single step away from what the django<br>
tutorial tells you to do). But even short programs can gain simplicity<br>
from ignoring the framework or abstracting it a little, where it suits<br>
the problem, as it often does.<br>
<br>
<br>
John<br>
______________________________<u></u>_________________<br>
python-uk mailing list<br>
<a href="mailto:python-uk@python.org" target="_blank">python-uk@python.org</a><br>
<a href="http://mail.python.org/mailman/listinfo/python-uk" target="_blank">http://mail.python.org/<u></u>mailman/listinfo/python-uk</a><br>
<br>
______________________________<u></u>______________________________<u></u>__________<br>
This email has been scanned by the Symantec Email Security.cloud service.<br>
For more information please visit <a href="http://www.symanteccloud.com" target="_blank">http://www.symanteccloud.com</a><br>
______________________________<u></u>______________________________<u></u>__________<br>
</blockquote>
<br>
</blockquote>
<br>
-- <br></div></div><div class="im">
Jonathan Hartley    <a href="mailto:tartley@tartley.com" target="_blank">tartley@tartley.com</a>    <a href="http://tartley.com" target="_blank">http://tartley.com</a><br>
Made of meat.       <a href="tel:%2B44%207737%20062%20225" value="+447737062225" target="_blank">+44 7737 062 225</a>       twitter/skype: tartley<br>
<br></div><div class=""><div class="h5">
______________________________<u></u>_________________<br>
python-uk mailing list<br>
<a href="mailto:python-uk@python.org" target="_blank">python-uk@python.org</a><br>
<a href="http://mail.python.org/mailman/listinfo/python-uk" target="_blank">http://mail.python.org/<u></u>mailman/listinfo/python-uk</a><br>
</div></div></blockquote></div><br></div></div>