Share
Embed
Clean Software Design: The Practices to Make The Design Simple
These are the slides that I delivered during PHPKonf18 at Istanbul.
Lemi Orhan Ergin PRO
May 20, 2018
Transcript
43 slides
-
LEMi ORHAN ERGiN co-founder @ craftbase CLEAN DESIGN SOFTWARE THE
PRACTICES TO MAKE THE DESIGN SIMPLE -
code design process team management organization tests customer ux &
ui culture office architecture infrastructure ux & ui meetings security -
Let’s talk about what is so!ware design and how we
can build it clean -
Jack W. Reeves The C++ Journal Vol. 2, No. 2.
1992 http://user.it.uu.se/~carle/softcraft/notes/Reeve_SourceCodeIsTheDesign.pdf What is So"ware Design? https://medium.com/t%C3%BCrkiye/yaz%C4%B1l%C4%B1m-tasar%C4%B1m%C4%B1-nedir-cd8aad12c8ae Türkçe Çevirisi: Muhammed Hilmi Koca -
Source code is the real so"ware design Designing so!ware is
an exercise in managing complexity Jack W. Reeves What is Software Design? The C++ Journal Vol. 2, No. 2. 1992 http://user.it.uu.se/~carle/softcraft/notes/Reeve_SourceCodeIsTheDesign.pdf -
The so"ware design is not complete until it has been
coded and tested Testing is part of the process of refining the design Jack W. Reeves What is Software Design? The C++ Journal Vol. 2, No. 2. 1992 http://user.it.uu.se/~carle/softcraft/notes/Reeve_SourceCodeIsTheDesign.pdf -
The very first value of so"ware is Robert C. Martin
Author of Clean Code and Clean Coder Owner of cleancoders.com training site … -
to tolerate and facilitate on-going changes Robert C. Martin Author
of Clean Code and Clean Coder Owner of cleancoders.com training site The very first value of so"ware is -
Each city has to be renewed in order to meet
the needs of its populace. So!ware-intensive systems are like that. Grady Booch Developed UML Wrote foreword to “Design Patterns” and “Technical Debt” books Istanbul, Turkey Credit: European Space Imaging -
Testing and Refactoring are first class citizens of so"ware
design Tests should pass Refactoring should be continuous -
SOFTWARE DESIGN v0.2 Refactoring Programming Source Code Automated Testing (Unit,
Functional, etc.) clean? -
COUPLING When readFile() is changed, do you change writeFile() too?
It shows how many places we need to change -
public class CakeCooker { private Powder cakePowder; private Event event
= new CookingEvent(); public void cook(Cake cake) { prepareIngredients(); int numberOfLayers = cake.getNumberOfLayers(); cakePowder = new BrownCakePowder(); float weight = cakePowder.getWeightUsed(); Egg egg = new Egg(); egg.crack(); cake.getChef().getCompany().registerEvent(event); } private void prepareIngredients() { // prepare ingredients here ... } } Don't talk to strangers Law of Demeter do not reach into an object to gain access to a third object’s methods 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 example of high coupling -
Two elements are loosely coupled if they are not shown
in the same diff Kent Beck The creator of extreme programming One of the signatories of the Agile Manifesto Pioneered software design patterns and TDD -
COHESION Do you search a lot where to change? It
shows how easy to find the places we need to change -
public class EmailMessage { private String sendTo; private String subject;
private String message; private String username; public EmailMessage(String to, String sbj, String m) { this.sendTo = to; this.subject = sbj; this.message = m; } public void sendMessage() { // send message using sendTo, subject, message } public void authenticate(String username, String pass) { this.username = username; // code to login } } A cohesive module performs a single task within a so!ware procedure, requiring li#le interaction with the procedures being performed in other parts of the program 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 example of low cohesion -
How many files at any one time is still open
for edit shows the level of cohesion Nat Pryce Co-Author of Growing Object-Oriented Software Guided by Tests Early adopter of XP -
Refactoring Low Coupling High Cohesion SOFTWARE DESIGN v0.3 Programming Source
Code Automated Testing (Unit, Functional, etc.) -
If people program solo, they are more likely to make
mistakes, more likely to over design, and more likely drop the other practices, particularly under pressure. Kent Beck The creator of extreme programming One of the signatories of the Agile Manifesto Pioneered software design patterns and TDD — from book “XP Explained” by Kent Beck -
Higher quality in code Faster in deployment* Faster defect removal
Higher morale Be"er collaboration Shared knowledge Quicker to market Automatic code review Useful for training people Lower defect rates https://www.flickr.com/photos/fraserspeirs/3394902061 Joe O'Brien and Jim Weirich while doing ruby code review Benefits of Programming in Pairs -
Refactoring Low Coupling High Cohesion SOFTWARE DESIGN v0.3 Programming Source
Code Automated Testing (Unit, Functional, etc.) -
Pair Programming and Code Review Refactoring Low Coupling High Cohesion
SOFTWARE DESIGN v0.4 Programming Source Code Automated Testing (Unit, Functional, etc.) -
1 tests pass Tests should always pass. If you can’t
prove that your system works and does what it is required to do then it doesn’t really ma!er if your design is clean, simple or complex. -
2 code expresses intent Reveal what you are doing, not
why you are doing or how you are doing (how) (what-generic) (what-specific) mailer.use_gmail_smtp_send_email() mailer.send_email() mailer.send_activation_email() Give great names. because you have to live with them forever -
2 code expresses intent manager handler helper utils facade repository
wrapper interceptor controller parser service validator converter gateway generator Avoid using honeypot names a!racting behaviors and functionalities Give great names. because you have to live with them forever -
3 keep it small Less code is cleaner and maintainable.
Keep your methods and classes small. I mean really small. The application shouldn’t have pieces that you don’t need. Delete the unused. -
4 do not repeat yourself Find and remove duplications. It’s
not only about code duplication, it’s also about knowledge duplication. Every piece of knowledge should have one and only one representation. -
5 tame abstractions Align the level of abstractions. Do not
expose details and limitations of its underlying implementation to its users that should ideally be hidden away. -
5 tame abstractions All non-trivial abstractions, to some degree, are
leaky. Abstractions fail. Sometimes a li!le, sometimes a lot. There’s leakage. Things go wrong. It happens all over the place when you have abstractions. https://www.joelonsoftware.com/2002/11/11/the-law-of-leaky-abstractions/ Law of Leaky Abstractions -
Singletons Meaning on Nulls Sharing state Static & new keywords
Framework slave coding Composition over Aggregation Premature optimization Primitive obsession Huge upfront design Checked exceptions Stop, or use them wisely -
tests pass code expresses intent keep it small do not
repeat yourself tame abstractions 1 2 3 4 5