C l e a n A r c h i t e c t u r e s i n P y t - - PowerPoint PPT Presentation

c l e a n a r c h i t e c t u r e s i n p y t h o n
SMART_READER_LITE
LIVE PREVIEW

C l e a n A r c h i t e c t u r e s i n P y t - - PowerPoint PPT Presentation

C l e a n A r c h i t e c t u r e s i n P y t h o n A t a l e o f d u r a b i l i t y , u t i l i t y , a n d b e a u t y L E O N A R D O G I O R D A N I S O F T W A R E D E V E L O P E


slide-1
SLIDE 1

C l e a n A r c h i t e c t u r e s i n P y t h

  • n

A t a l e

  • f

d u r a b i l i t y , u t i l i t y , a n d b e a u t y

slide-2
SLIDE 2

“Who wrote this code?”

L E O N A R D O G I O R D A N I

S O F T W A R E D E V E L O P E R A N D B L O G G E R

W W W. T H E D I G I T A L C AT O N L I N E . C O M @TW_LGIORDANI - @THEDIGICAT

slide-3
SLIDE 3

WHAT IS THE DEFINITION OF ARCHITECTURE?

slide-4
SLIDE 4

F I R M I T A S , U T I L I T A S , V E N U S T A S

Vitruvius, De architectura

slide-5
SLIDE 5

D U R A B I L I T Y, U T I L I T Y, B E A U T Y

Vitruvius, De architectura

slide-6
SLIDE 6

T H E A R T A N D S C I E N C E I N W H I C H T H E C O M P O N E N T S O F A C O M P U T E R S Y S T E M A R E O R G A N I S E D A N D I N T E G R AT E D

slide-7
SLIDE 7

D O W E N E E D A R C H I T E C T U R E ?

slide-8
SLIDE 8

Ivar Jacobson (1992)

Object Oriented Software Engineering: A Use-Case Driven Approach

  • E. Gamma, R. Helm, R. Johnson, J. Vlissides (1994)

Design Patterns

Robert Martin (2000)

Design Principles and Design Patterns

Eric Evans (2003)

Domain-Driven Design: Tackling Complexity in the Heart of Software

  • H. Hohpe, B. Woolf (2003)

Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions

slide-9
SLIDE 9

What is the meaning of clean?

slide-10
SLIDE 10

You know where things are, why components are there, what something is.

slide-11
SLIDE 11

Clean Architectures in Python

A practical approach to better software design

bit.ly/getpycabook

Leonardo Giordani

slide-12
SLIDE 12

The Clean Architecture A layered approach for a more civilized age

slide-13
SLIDE 13

The golden rule Talk inward with simple structures, talk outwards through interfaces.

slide-14
SLIDE 14

class Item: def __init__(self, code, price): self.code = code self.price = price

Entities: simple models

slide-15
SLIDE 15

Use case: retrieve a list of items

use_case = uc.ItemsListUseCase() use_case.execute()

slide-16
SLIDE 16

@blueprint.route('/items', methods=['GET']) def items(): pass

We want to build a web application

slide-17
SLIDE 17

@blueprint.route('/items', methods=['GET']) def items(): use_case = uc.ItemsListUseCase() use_case.execute(request.args)

Incoming HTTP requests become a call and simple structures

slide-18
SLIDE 18

@blueprint.route('/items', methods=['GET']) def items(): use_case = uc.ItemsListUseCase() use_case.execute(request.args)

The use case extracts data from a repository, which can be any source of data

slide-19
SLIDE 19

@blueprint.route('/items', methods=['GET']) def items(): use_case = uc.ItemsListUseCase() use_case.execute(request.args)

And the repository can be accessed through an interface

slide-20
SLIDE 20

@blueprint.route('/items', methods=['GET']) def items(): repo = PostgresRepo(CONNECTION_STRING) use_case = uc.ItemsListUseCase(repo) use_case.execute(request.args)

The use case receives the repository interface as an argument of the call

slide-21
SLIDE 21

class ItemsListUseCase: def __init__(self, repo): self.repo = repo def execute(self, params): # BUSINESS LOGIC HERE result = self.repo.list(params) # BUSINESS LOGIC HERE return result

The use case queries the repository interface with simple structures

slide-22
SLIDE 22

class PostgresRepo: def __init__(self, CONNECTION_STRING): self.ng = create_engine( CONNECTION_STRING) Base.metadata.bind = self.ng def list(self, filters): DBSession = sessionmaker(bind=self.ng) session = DBSession() query = ...

The database interface and the database exchange data in a specifjc language

slide-23
SLIDE 23

The database interface translates the specifjc language into simple structures and entities

class PostgresRepo: def __init__(self, CONNECTION_STRING): self.ng = create_engine( CONNECTION_STRING) Base.metadata.bind = self.ng def _create_items(self, results): return [Item(code=q.code, price=q.price) for q in results] def list(self, filters): DBSession = sessionmaker(bind=self.ng) session = DBSession() query = ... return self._create_items(query.all())

slide-24
SLIDE 24

@blueprint.route('/items', methods=['GET']) def items(): repo = PostgresRepo(CONNECTION_STRING) use_case = uc.ItemsListUseCase(repo) result = use_case.execute(request.args)

The use case returns the result of the business logic: entities and simple structures

slide-25
SLIDE 25

@blueprint.route('/items', methods=['GET']) def items(): repo = PostgresRepo(CONNECTION_STRING) use_case = uc.ItemsListUseCase(repo) result = use_case.execute(request.args) return Response( json.dumps(result), mimetype='application/json', status=200)

The web framework converts entities and simple structures into HTTP responses

slide-26
SLIDE 26

class ItemsListUseCase: def __init__(self, repo): self.repo = repo def execute(self, params): # BUSINESS LOGIC HERE result = self.repo.list(params) # BUSINESS LOGIC HERE return result

Testing the use case

slide-27
SLIDE 27

@blueprint.route('/items', methods=['GET']) def items(): repo = PostgresRepo(CONNECTION_STRING) use_case = uc.ItemsListUseCase(repo) result = use_case.execute(request.args) return Response( json.dumps(result), mimetype='application/json', status=200)

Testing the HTTP endpoint

slide-28
SLIDE 28

Testing the repository interface: integration test

class PostgresRepo: def __init__(self, CONNECTION_STRING): self.ng = create_engine( CONNECTION_STRING) Base.metadata.bind = self.ng def _create_items(self, results): return [Item(code=q.code, price=q.price) for q in results] def list(self, filters): DBSession = sessionmaker(bind=self.ng) session = DBSession() query = ... return self._create_items(query.all())

slide-29
SLIDE 29

Is it possible to migrate an existing system?

slide-30
SLIDE 30

Is this the defjnitive architecture?

slide-31
SLIDE 31

Clean Architectures in Python

A practical approach to better software design

bit.ly/getpycabook

Leonardo Giordani

slide-32
SLIDE 32

Harry Percival, Bob Gregory

github.com/python-leap/book (Published by O’Reilly)

Enterprise Architecture Patterns with Python

slide-33
SLIDE 33

Thank you!

@tw_lgiordani - @thedigicat - bit.ly/getpycabook https://speakerdeck.com/lgiordani