SlideShare uma empresa Scribd logo
1 de 92
Baixar para ler offline
Como fazer boas libs?
Flávio Juvenal
Vinta Software
www.vinta.com.br
● Dia 16: Estrutura de dados e collections em Python -
André Ericson (Sala Sambaqui 3)
● Dia 17: Definindo um Boilerplate Customizável usando
Django, React e Bootstrap - Lais Varejão (Sala Sambaqui 3)
Outras talks da Vinta na PyBR 12
Como fazer boas libs APIs?
Não vamos abordar
● Estrutura de projeto
● Distribuição
● Licença de uso
● Semantic Versioning
● Code-style
● Continuous Integration
● Coverage
● etc...
API
"Um conjunto de definições de subrotinas, protocolos e
ferramentas para construir software e aplicações."
https://en.wikipedia.org/wiki/Application_programming_inter
face
Sua API é uma UI
Sua API é uma UI
10 Usability Heuristics for User Interface Design
https://www.nngroup.com/articles/ten-usability-heuristics/
Sua API é uma UI
● Visibility of system status
● Match between system and the real world
● User control and freedom
● Consistency and standards
● Recognition rather than recall
● Flexibility and efficiency of use
● Aesthetic and minimalist design
● Error prevention
● Help users recognize, diagnose, and recover from errors
● Help and documentation
Sua API é uma UI
Hmm… bonito… mas abstrato demais...
Máximas como esta são difíceis de aplicar e avaliar.
Precisamos de princípios mais práticos!
Consistência
- Com ou sem underscore?
gettype VS get_class (PHP)
- objeto + verbo ou verbo + objeto?
str_shuffle VS recode_string (PHP)
Consistência na prática: nomenclatura
- Abreviações
activatePreviousWindows VS fetchPrev (Qt < 4)
bin2hex VS strtolower (PHP)
Consistência na prática: nomenclatura
- Ordem dos argumentos?
datetime.datetime(year, month, day, hour=0,
minute=0, second=0, microsecond=0, tzinfo=None)
datetime.timedelta(days=0, seconds=0,
microseconds=0, milliseconds=0, minutes=0,
hours=0, weeks=0)
Consistência na prática: ordem
- Significado de vazio: None, False, [], '', 0
- Use o mais adequado. Cuidado com significados
obscuros:
>>> import datetime
>>> bool(datetime.date(datetime.MINYEAR, 1, 1))
True
>>> bool(datetime.time(0)) # Python < 3.5
False
Consistência na prática: semântica
[ ] A API exige que o usuário volte
constantemente para documentação para saber como
faz algo?
[ ] Existe consistência na nomenclatura (ordem
dos termos, abreviações, plurais, etc)?
[ ] Existe consistência na ordem dos argumentos?
[ ] Existe consistência no que significa vazio?
Aumentar a consistência
Verbosidade
Zen of Python
Flat is better than nested.
Sparse is better than dense.
Readability counts.
[ ] A API exige que você copie e cole muito
código para fazer algo comum? Se sim, faça
funções mais gerais (mas mantenha as mais
específicas para não perder composability).
Exemplo:
Reduzir a verbosidade
import urllib.request
gh_url = 'https://api.github.com/user'
password_mgr = urllib.request.HTTPPasswordMgrWithDefaultRealm()
password_mgr.add_password(None, gh_url, 'user', 'pswd')
handler = urllib.request.HTTPBasicAuthHandler(password_mgr)
opener = urllib.request.build_opener(handler)
opener.open(gh_url)
Reduzir a verbosidade
Reduzir a verbosidade
import requests
session = requests.Session()
session.auth = ('user', 'pswd')
session.get('https://api.github.com/user')
[ ] É possível usar um tipo padrão adequado ao
invés de um novo tipo customizado da API?
urllib.request.HTTPPasswordMgrWithDefaultRealm VS tuple
Reduzir a verbosidade
[ ] A API tem valores defaults sãos?
// Aff...
history.pushState(null, "", "https://vinta.com.br");
// Por que não é?
history.pushState("https://vinta.com.br");
Reduzir a verbosidade
Principle of Least Astonishment
Principle of Least Astonishment
Previna que seu cliente da API fale WAT.
http://programmers.stackexchange.com/questions/187457/
what-is-the-principle-of-least-astonishment
JavaScript < ES5
>>> parseInt('010')
>>> 8
Se o valor vier de um input do usuário, lascou…
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects
/parseInt#ECMAScript_5_removes_octal_interpretation
Principle of Least Astonishment
Python
>>> int('010')
>>> 10
Principle of Least Astonishment
JavaScript
>>> new Date(2016, 1, 1)
Mon Feb 01 2016 00:00:00 GMT-0300 (BRT)
Principle of Least Astonishment
Python
>>> datetime.datetime(2016, 1, 1).isoformat()
'2016-01-01T00:00:00'
Principle of Least Astonishment
[ ] PLA funcional: O comportamento padrão faz o
que o usuário realmente espera? Testar com
usuários reais!
Garantir o Principle of Least Astonishment
Em Python, "assimetria de comportamentos deve se refletir
em assimetria de formas":
numbers.sort() VS sorted(numbers)
.append() VS +
Evitar misturar retornos com side-effects:
http://stackoverflow.com/questions/13062423/is-making-in-place-operations-ret
urn-the-object-a-bad-idea
Principle of Least Astonishment
Cuidado com falsa simetria:
QStatusBar::message(text, msecs) (Qt 3)
QStatusBar::setMessage(text, msecs)
QStatusBar::showMessage(text, msecs) (Qt 4)
Principle of Least Astonishment
[ ] PLA não-funcional: O comportamento padrão
está de acordo com as expectativas de
performance, efeitos colaterais, safety,
segurança, etc?
Garantir o Principle of Least Astonishment
Abstrações
vazadas
"Abstração: uma simplificação de algo muito mais complicado
que está acontecendo por debaixo dos panos"
Joel Spolsky em
http://www.joelonsoftware.com/articles/LeakyAbstractions.h
tml
Abstrações
from collections import Counter
c = Counter(['eggs', 'ham', 'eggs'])
print(c)
>>> Counter({'eggs': 2, 'ham': 1})
Abstrações
sorted([2,3,1])
>>> [1, 2, 3]
Abstrações
PS: Mas só porque está acontecendo debaixo dos panos, não
deve ser completamente invisível. O como às vezes precisa
estar evidente.
Mais sobre isso a seguir...
Law of Leaky Abstractions
O problema é que "Todas abstrações não-triviais são
vazadas".
Esta é a "The Law of Leaky Abstractions".
Ou seja, detalhes da implementação vazam.
Law of Leaky Abstractions
O que causa vazamentos?
Quando tentamos garantir algo impossível ou não-natural.
Law of Leaky Abstractions
APIs RPC que tentam igualar chamadas remotas a chamadas
locais.
guido_profile = Facebook.get_profile('guido')
guido_profile.set_name("Benevolent Dictator For Life")
Law of Leaky Abstractions
REST não abstrai a
dualidade cliente-servidor.
Pelo contrário, abraça ela.
Por exemplo com o
Conditional PUT:
Law of Leaky Abstractions
[ ] Existe algo que a API está tentando abstrair
e não devia?
Minimizar vazamentos das abstrações em APIs
Completude
Outro problema das abstrações é quando elas não são
completas, são restritas.
O cliente precisará estender a abstração com mais
funcionalidades, mudar partes de funcionalidades existentes
ou compor a abstração com outras.
Completude e extensibilidade
Completude e extensibilidade
"O maior objetivo de uma API deve ser eliminar a
descontinuidade de integração."
Casey Muratori em:
https://mollyrocket.com/casey/stream_0028.html
ORM count
ORM annotate com
F object
ORM com
annotate e
custom
Aggregate
ORM annotate
com F object e
Func
O cliente precisará estender a abstração com mais
funcionalidades, mudar partes de funcionalidades existentes
ou compor a abstração com outras.
Não tem problema a API não ser completa, mas ela deve ser
extensível, flexível e "composable".
Completude e extensibilidade
Retenção
Um dos vilões da extensibilidade se chama retenção.
Retenção ocorre quando a API sequestra ou encapsula um
recurso e impede seu uso direto.
Retenção
- retenção para ser + extensível
[ ] Ofereça a opção de deixar um recurso interno
aberto/alocado mesmo depois de ter terminado de
usá-lo.
[ ] Dê acesso (mesmo que com _) a recursos que o
cliente pode precisar.
[ ] Retorne objetos que o cliente pode precisar.
[ ] Ao fazer Inversion of Control ou chamar
callbacks, passe tudo que a função do cliente
pode precisar.
Exemplo a seguir:
- retenção para ser + extensível
Encapsulamento,
sim ou não?
Além de mais retenção, encapsulamento total resulta em menos
flexibilidade. Quem quiser mudar o comportamento interno vai
conseguir de um jeito ou de outro (monkey-patching, reflection,
etc)… então pra que esconder tanto?
"For a Pythonista, encapsulation is not the inability of seeing
internals of classes, but the possibility of avoiding to look at it"
http://stackoverflow.com/questions/7456807/python-name-mangl
ing
Encapsulamento total para que?
Encapsulamento total para que?
- encapsulamento para ser + extensível
[ ] A API permite a modificação ou remoção de
comportamentos sem que o usuário tenha que
reescrever o código interno dela? Permita
sobrescrita para evitar reescrita!
Exemplo dropzone.js:
- encapsulamento para ter + composability
[ ] Aceite recursos oferecidos pelo cliente caso
eles sejam similares aos seus (aproveite
duck-typing).
[ ] Ofereça a opção de aceitar um recurso externo
previamente aberto/alocado.
[ ] Se for necessário fazer muitos mock.patch,
então está faltando Inversion of
Control/Dependecy Injection para ser mais
flexível. Faça mais DI.
Exemplo:
- encapsulamento para ter + composability
- encapsulamento para ter + composability
@patch('my.project.trading.get_enriched_trade_data', lambda: TEST_TRADE_DATA)
@patch('my.project.subledger.get_subledger_data', get_test_subledger_data)
@patch('my.project.metadata.get_subledger_codes', return_value=TEST_CODES)
@patch('my.project.reports.store_report')
def test_build_report(self, store_report):
build_report()
store_report.assert_called_with(EXPECTED_REPORT)
http://mauveweb.co.uk/posts/2014/09/every-mock-patch-is-a-little-smell.html
Mais
níveis
de abstração
Se os três pontos
de integração
forem da mesma
lib, já muito!
Mas o ideal é
sempre mais
+ níveis de abstração para ter + composability
[ ] A API provê vários níveis de abstração, do
mais abstrato ao mais específico/customizável/
baixo-nível?
[ ] Na API, você deixou "o simples fácil, o
complexo possível e o errado impossível"?
Exemplo a seguir:
+ níveis de abstração para ter + composability
@app.task
def add(x, y):
return x + y
class AdderTask(Task):
rate_limit = '100/h'
def run(self, x, y):
return x + y
+ níveis de abstração para ter + composability
Granular!
Não-granular!
[ ] Tem "and" no nome da função? A função muda o
estado de vários objetos? A função tem mais de um
interesse (concern)? Se sim, quebre a função
maior fazendo ela chamar funções menores.
Exemplo a seguir:
+ granularidade para ter + composability e + extensibilidade
● Não forçar o usuário a especificar o que é óbvio ou
frequente.
● Mas também não esconder o que é importante e muitos
podem querer mudar.
● Quanto mais níveis de abstração a API tiver, mais a API
vai acertar os níveis que os clientes precisam.
Acertar o nível de abstração
Pythonic
● Prefira @property a métodos
import urllib.request
r = urllib.request.urlopen('http://python.org/')
r.getcode()
import requests
r = requests.get('http://python.org/')
r.status_code
Pythonic
● Use Context managers para objetos com life-cycle
f = open('file.txt')
contents = f.read()
f.close()
with open('file.txt') as f:
contents = f.read()
Pythonic
● Defina __repr__
>>> requests.get('http://httpbin.org/status/200')
<Response [200]>
>>> Github().gists()
<TapiocaClientExecutor object
'https://api.github.com/gists'>
Pythonic
Pythonic
● Operator overloading
● Decorators
● Generators
● asyncio
● etc...
"Design Patterns are missing language features"
Exemplo: strategy pattern < high order functions
● Documentação!!!!!!!!!!
○ Mostrar quick-start com poucas linhas para fazer o
básico
○ Top-down: primeiro pensar em o que a API deve fazer,
documentar isso, e só depois implementar
○ Exemplos hands-on, com casos de uso (exemplo:
python-social-auth)
○ Documentar erros comuns, depois proteger a API
contra eles (se estiver falando muito "note" ou
"careful", mude sua API)
Também é importante
● Visibilidade de contexto: cuidado com interfaces modais
● Exceções
○ Vários tipos
○ Mensagens de erro
○ Fail-fast, especialmente em operações sequenciais
○ "Errors should never pass silently. Unless explicitly
silenced."
● Safety (não é segurança!)
● Imutabilidade
● Discoverability
● etc...
Também é importante
● Slides disponíveis em:
http://bit.ly/pybr12-vinta
● Twitter: @flaviojuvenal
Dúvidas?
● Designing and Evaluating Reusable Components
● The Little Manual of API Design
● API Design Tips
● API Design
● What Makes Software Good?
● What makes a good software library?
● Bumper-Sticker API Design
● Ten Good Rules for Bad APIs
Referências
Referências
● What guidelines should I follow while designing a library?
● API: Design Matters
● How to Design a Good API and Why it Matters
● API Design Principles - Qt Wiki
● PHP: a fractal of bad design
● Why frameworks are evil
● Multiple levels of abstraction
● The Law of Leaky Abstractions
Referências
● On DRY and the cost of wrongful abstractions
● The Wrong Abstraction
● Separation of concerns
● Command–query separation
● PEP 8

Mais conteúdo relacionado

Mais procurados

Técnicas de frontend para aplicações django - PythonBrasil[9]
Técnicas de frontend para aplicações django  - PythonBrasil[9]Técnicas de frontend para aplicações django  - PythonBrasil[9]
Técnicas de frontend para aplicações django - PythonBrasil[9]Rael Max
 
A mágica por trás dos aplicativos ( Api com o Laravel )
A mágica por trás dos aplicativos ( Api com o Laravel )A mágica por trás dos aplicativos ( Api com o Laravel )
A mágica por trás dos aplicativos ( Api com o Laravel )Michael Douglas
 
Começando com Zend Framework 2
Começando com Zend Framework 2Começando com Zend Framework 2
Começando com Zend Framework 2Cezar Souza
 
Cya grunt.js, hello gulp.js
Cya grunt.js, hello gulp.jsCya grunt.js, hello gulp.js
Cya grunt.js, hello gulp.jsMichael Douglas
 
Evitando a fadiga com Laravel Homestead
Evitando a fadiga com Laravel HomesteadEvitando a fadiga com Laravel Homestead
Evitando a fadiga com Laravel HomesteadDanilo Esser
 
Dicas para Workflow WordPress + JavaScript - WordCamp Salvador
Dicas para Workflow WordPress + JavaScript - WordCamp SalvadorDicas para Workflow WordPress + JavaScript - WordCamp Salvador
Dicas para Workflow WordPress + JavaScript - WordCamp SalvadorFellyph Cintra
 
APIs do Jeito Certo
APIs do Jeito CertoAPIs do Jeito Certo
APIs do Jeito CertoRavan Scafi
 
Programando php com mais segurança
Programando php com mais segurançaProgramando php com mais segurança
Programando php com mais segurançaMichael Douglas
 
Apresentação zend framework 2 parte 1
Apresentação zend framework 2   parte 1 Apresentação zend framework 2   parte 1
Apresentação zend framework 2 parte 1 Edgar Dantas
 
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2Cezar Souza
 
O que esperar do Zend Framework 3
O que esperar do Zend Framework 3O que esperar do Zend Framework 3
O que esperar do Zend Framework 3Flávio Lisboa
 
Entendendo a Arquitetura MVC do Zend Framework
Entendendo a Arquitetura MVC do Zend FrameworkEntendendo a Arquitetura MVC do Zend Framework
Entendendo a Arquitetura MVC do Zend FrameworkGedvan Dias
 
Trabalhando de forma profissional com silex
Trabalhando de forma profissional com silexTrabalhando de forma profissional com silex
Trabalhando de forma profissional com silexMichael Douglas
 
Desenvolvendo para WordPress com Docker, Git e WP-CLI
Desenvolvendo para WordPress com Docker, Git e WP-CLIDesenvolvendo para WordPress com Docker, Git e WP-CLI
Desenvolvendo para WordPress com Docker, Git e WP-CLIRudá Almeida
 
Conhecendo o Zend Framework
Conhecendo o Zend FrameworkConhecendo o Zend Framework
Conhecendo o Zend FrameworkJaime Neto
 
Usando tapioca para acessar APIs web [PyBR11]
Usando tapioca para acessar APIs web [PyBR11]Usando tapioca para acessar APIs web [PyBR11]
Usando tapioca para acessar APIs web [PyBR11]Filipe Ximenes
 
Drupal Performance - Dicas e técnicas para levar seu Drupal às nuvens
Drupal Performance - Dicas e técnicas para levar seu Drupal às nuvensDrupal Performance - Dicas e técnicas para levar seu Drupal às nuvens
Drupal Performance - Dicas e técnicas para levar seu Drupal às nuvensPaulino Michelazzo
 
APIs: o que são? onde vivem? do que se alimentam? [PyNE2016]
APIs: o que são? onde vivem? do que se alimentam? [PyNE2016]APIs: o que são? onde vivem? do que se alimentam? [PyNE2016]
APIs: o que são? onde vivem? do que se alimentam? [PyNE2016]Filipe Ximenes
 

Mais procurados (20)

Técnicas de frontend para aplicações django - PythonBrasil[9]
Técnicas de frontend para aplicações django  - PythonBrasil[9]Técnicas de frontend para aplicações django  - PythonBrasil[9]
Técnicas de frontend para aplicações django - PythonBrasil[9]
 
A mágica por trás dos aplicativos ( Api com o Laravel )
A mágica por trás dos aplicativos ( Api com o Laravel )A mágica por trás dos aplicativos ( Api com o Laravel )
A mágica por trás dos aplicativos ( Api com o Laravel )
 
Django - Muito além do básico
Django - Muito além do básicoDjango - Muito além do básico
Django - Muito além do básico
 
Começando com Zend Framework 2
Começando com Zend Framework 2Começando com Zend Framework 2
Começando com Zend Framework 2
 
Cya grunt.js, hello gulp.js
Cya grunt.js, hello gulp.jsCya grunt.js, hello gulp.js
Cya grunt.js, hello gulp.js
 
Evitando a fadiga com Laravel Homestead
Evitando a fadiga com Laravel HomesteadEvitando a fadiga com Laravel Homestead
Evitando a fadiga com Laravel Homestead
 
Dicas para Workflow WordPress + JavaScript - WordCamp Salvador
Dicas para Workflow WordPress + JavaScript - WordCamp SalvadorDicas para Workflow WordPress + JavaScript - WordCamp Salvador
Dicas para Workflow WordPress + JavaScript - WordCamp Salvador
 
APIs do Jeito Certo
APIs do Jeito CertoAPIs do Jeito Certo
APIs do Jeito Certo
 
Programando php com mais segurança
Programando php com mais segurançaProgramando php com mais segurança
Programando php com mais segurança
 
Apresentação zend framework 2 parte 1
Apresentação zend framework 2   parte 1 Apresentação zend framework 2   parte 1
Apresentação zend framework 2 parte 1
 
Python na Web
Python na WebPython na Web
Python na Web
 
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2
 
O que esperar do Zend Framework 3
O que esperar do Zend Framework 3O que esperar do Zend Framework 3
O que esperar do Zend Framework 3
 
Entendendo a Arquitetura MVC do Zend Framework
Entendendo a Arquitetura MVC do Zend FrameworkEntendendo a Arquitetura MVC do Zend Framework
Entendendo a Arquitetura MVC do Zend Framework
 
Trabalhando de forma profissional com silex
Trabalhando de forma profissional com silexTrabalhando de forma profissional com silex
Trabalhando de forma profissional com silex
 
Desenvolvendo para WordPress com Docker, Git e WP-CLI
Desenvolvendo para WordPress com Docker, Git e WP-CLIDesenvolvendo para WordPress com Docker, Git e WP-CLI
Desenvolvendo para WordPress com Docker, Git e WP-CLI
 
Conhecendo o Zend Framework
Conhecendo o Zend FrameworkConhecendo o Zend Framework
Conhecendo o Zend Framework
 
Usando tapioca para acessar APIs web [PyBR11]
Usando tapioca para acessar APIs web [PyBR11]Usando tapioca para acessar APIs web [PyBR11]
Usando tapioca para acessar APIs web [PyBR11]
 
Drupal Performance - Dicas e técnicas para levar seu Drupal às nuvens
Drupal Performance - Dicas e técnicas para levar seu Drupal às nuvensDrupal Performance - Dicas e técnicas para levar seu Drupal às nuvens
Drupal Performance - Dicas e técnicas para levar seu Drupal às nuvens
 
APIs: o que são? onde vivem? do que se alimentam? [PyNE2016]
APIs: o que são? onde vivem? do que se alimentam? [PyNE2016]APIs: o que são? onde vivem? do que se alimentam? [PyNE2016]
APIs: o que são? onde vivem? do que se alimentam? [PyNE2016]
 

Destaque

Junho 2016 - Django - A sua cápsula de soluções web em python
Junho 2016 - Django - A sua cápsula de soluções web em pythonJunho 2016 - Django - A sua cápsula de soluções web em python
Junho 2016 - Django - A sua cápsula de soluções web em pythonGrupo de Testes Carioca
 
Django, Framework Python para desenvolvimento web
Django, Framework Python para desenvolvimento webDjango, Framework Python para desenvolvimento web
Django, Framework Python para desenvolvimento webMayron Cachina
 
Mini curso introdutório ao Django
Mini curso introdutório ao DjangoMini curso introdutório ao Django
Mini curso introdutório ao DjangoVinicius Mendes
 
Mini curso de django
Mini curso de djangoMini curso de django
Mini curso de djangorosenclever
 
DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS
DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APISDJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS
DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APISFernando Rocha
 
Django: Desenvolvendo uma aplicação web em minutos
Django: Desenvolvendo uma aplicação web em minutosDjango: Desenvolvendo uma aplicação web em minutos
Django: Desenvolvendo uma aplicação web em minutosRodrigo Nossal
 
Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril
Como um verdadeiro sistema REST funciona: arquitetura e performance na AbrilComo um verdadeiro sistema REST funciona: arquitetura e performance na Abril
Como um verdadeiro sistema REST funciona: arquitetura e performance na AbrilLuis Cipriani
 
Python e django na prática
Python e django na práticaPython e django na prática
Python e django na práticaRafael Cassau
 
Tutorial Django + Python
Tutorial Django + PythonTutorial Django + Python
Tutorial Django + PythonMateus Padua
 
Learning python with flask (PyLadies Malaysia 2017 Workshop #1)
Learning python with flask (PyLadies Malaysia 2017 Workshop #1)Learning python with flask (PyLadies Malaysia 2017 Workshop #1)
Learning python with flask (PyLadies Malaysia 2017 Workshop #1)Sian Lerk Lau
 

Destaque (13)

Junho 2016 - Django - A sua cápsula de soluções web em python
Junho 2016 - Django - A sua cápsula de soluções web em pythonJunho 2016 - Django - A sua cápsula de soluções web em python
Junho 2016 - Django - A sua cápsula de soluções web em python
 
Django, Framework Python para desenvolvimento web
Django, Framework Python para desenvolvimento webDjango, Framework Python para desenvolvimento web
Django, Framework Python para desenvolvimento web
 
Mini curso introdutório ao Django
Mini curso introdutório ao DjangoMini curso introdutório ao Django
Mini curso introdutório ao Django
 
Aplicacoes Rapidas Para Web Com Django
Aplicacoes Rapidas Para Web Com DjangoAplicacoes Rapidas Para Web Com Django
Aplicacoes Rapidas Para Web Com Django
 
Mini curso de django
Mini curso de djangoMini curso de django
Mini curso de django
 
DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS
DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APISDJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS
DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS
 
Django: Desenvolvendo uma aplicação web em minutos
Django: Desenvolvendo uma aplicação web em minutosDjango: Desenvolvendo uma aplicação web em minutos
Django: Desenvolvendo uma aplicação web em minutos
 
Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril
Como um verdadeiro sistema REST funciona: arquitetura e performance na AbrilComo um verdadeiro sistema REST funciona: arquitetura e performance na Abril
Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril
 
Python e django na prática
Python e django na práticaPython e django na prática
Python e django na prática
 
Tutorial Django + Python
Tutorial Django + PythonTutorial Django + Python
Tutorial Django + Python
 
Curso de Python e Django
Curso de Python e DjangoCurso de Python e Django
Curso de Python e Django
 
Learning python with flask (PyLadies Malaysia 2017 Workshop #1)
Learning python with flask (PyLadies Malaysia 2017 Workshop #1)Learning python with flask (PyLadies Malaysia 2017 Workshop #1)
Learning python with flask (PyLadies Malaysia 2017 Workshop #1)
 
Introdução ao Django
Introdução ao DjangoIntrodução ao Django
Introdução ao Django
 

Semelhante a Como criar APIs Python robustas e extensíveis

Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010Emerson Macedo
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmGuilherme Blanco
 
Zabbix Conference LatAm 2019 - Automação: Ganhando produtividade
Zabbix Conference LatAm 2019 - Automação: Ganhando produtividadeZabbix Conference LatAm 2019 - Automação: Ganhando produtividade
Zabbix Conference LatAm 2019 - Automação: Ganhando produtividadeIgor Nicoli
 
Curso de Verão - Aula 03 - Introdução ao CI-CD e Infraestrutura como Código
Curso de Verão - Aula 03 - Introdução ao CI-CD e Infraestrutura como CódigoCurso de Verão - Aula 03 - Introdução ao CI-CD e Infraestrutura como Código
Curso de Verão - Aula 03 - Introdução ao CI-CD e Infraestrutura como CódigoGuilhermeJorgeAragod
 
Dependency injection WTF? - PHPSC Conference 2012
Dependency injection WTF? - PHPSC Conference 2012Dependency injection WTF? - PHPSC Conference 2012
Dependency injection WTF? - PHPSC Conference 2012Luís Cobucci
 
Inversão de Controlo e Injecção de Dependência na .NET Framework
Inversão de Controlo e Injecção de Dependência na .NET FrameworkInversão de Controlo e Injecção de Dependência na .NET Framework
Inversão de Controlo e Injecção de Dependência na .NET FrameworkC. Augusto Proiete
 
CEPUG 2 - Bem-vindo a Framework CodeIgniter
CEPUG 2 - Bem-vindo a Framework CodeIgniterCEPUG 2 - Bem-vindo a Framework CodeIgniter
CEPUG 2 - Bem-vindo a Framework CodeIgniterEric Silva
 
Porque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhor
Porque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhorPorque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhor
Porque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhorDickson S. Guedes
 
Entendendo Frameworks web com Python
Entendendo Frameworks web com PythonEntendendo Frameworks web com Python
Entendendo Frameworks web com PythonLuiz Aldabalde
 
Entendendo Framework Web com Python
Entendendo Framework Web com PythonEntendendo Framework Web com Python
Entendendo Framework Web com PythonPythOnRio
 
Automação de Teste em Front End - Caipira Ágil
Automação de Teste em Front End - Caipira ÁgilAutomação de Teste em Front End - Caipira Ágil
Automação de Teste em Front End - Caipira ÁgilElias Nogueira
 
Como DDD e Strategic Design estão nos ajudando a modernizar um Legado
Como DDD e Strategic Design estão nos ajudando a modernizar um LegadoComo DDD e Strategic Design estão nos ajudando a modernizar um Legado
Como DDD e Strategic Design estão nos ajudando a modernizar um LegadoLuiz Costa
 
Inversão de Controlo (IoC) / Injecção de Dependência (DI) - Bruno Lopes & C. ...
Inversão de Controlo (IoC) / Injecção de Dependência (DI) - Bruno Lopes & C. ...Inversão de Controlo (IoC) / Injecção de Dependência (DI) - Bruno Lopes & C. ...
Inversão de Controlo (IoC) / Injecção de Dependência (DI) - Bruno Lopes & C. ...Comunidade NetPonto
 
Palestra - Symfony Framework MVC PHP 5
Palestra - Symfony Framework MVC PHP 5Palestra - Symfony Framework MVC PHP 5
Palestra - Symfony Framework MVC PHP 5Lucas Augusto Carvalho
 
Produtividade infinito e além com We.js
Produtividade infinito e além com We.jsProdutividade infinito e além com We.js
Produtividade infinito e além com We.jsAlberto Souza
 
Python, a arma secreta do Google
Python, a arma secreta do GooglePython, a arma secreta do Google
Python, a arma secreta do GoogleLuciano Ramalho
 
Desenvolvimento Ágil com Grails.
Desenvolvimento Ágil com Grails.Desenvolvimento Ágil com Grails.
Desenvolvimento Ágil com Grails.Alex Guido
 
[JS EXPERIENCE 2018] Do jQuery aos microfrontends: os desafios de manter uma ...
[JS EXPERIENCE 2018] Do jQuery aos microfrontends: os desafios de manter uma ...[JS EXPERIENCE 2018] Do jQuery aos microfrontends: os desafios de manter uma ...
[JS EXPERIENCE 2018] Do jQuery aos microfrontends: os desafios de manter uma ...iMasters
 

Semelhante a Como criar APIs Python robustas e extensíveis (20)

Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine Orm
 
Zabbix Conference LatAm 2019 - Automação: Ganhando produtividade
Zabbix Conference LatAm 2019 - Automação: Ganhando produtividadeZabbix Conference LatAm 2019 - Automação: Ganhando produtividade
Zabbix Conference LatAm 2019 - Automação: Ganhando produtividade
 
Curso de Verão - Aula 03 - Introdução ao CI-CD e Infraestrutura como Código
Curso de Verão - Aula 03 - Introdução ao CI-CD e Infraestrutura como CódigoCurso de Verão - Aula 03 - Introdução ao CI-CD e Infraestrutura como Código
Curso de Verão - Aula 03 - Introdução ao CI-CD e Infraestrutura como Código
 
Dependency injection WTF? - PHPSC Conference 2012
Dependency injection WTF? - PHPSC Conference 2012Dependency injection WTF? - PHPSC Conference 2012
Dependency injection WTF? - PHPSC Conference 2012
 
Inversão de Controlo e Injecção de Dependência na .NET Framework
Inversão de Controlo e Injecção de Dependência na .NET FrameworkInversão de Controlo e Injecção de Dependência na .NET Framework
Inversão de Controlo e Injecção de Dependência na .NET Framework
 
Palestra
PalestraPalestra
Palestra
 
CEPUG 2 - Bem-vindo a Framework CodeIgniter
CEPUG 2 - Bem-vindo a Framework CodeIgniterCEPUG 2 - Bem-vindo a Framework CodeIgniter
CEPUG 2 - Bem-vindo a Framework CodeIgniter
 
Porque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhor
Porque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhorPorque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhor
Porque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhor
 
Entendendo Frameworks web com Python
Entendendo Frameworks web com PythonEntendendo Frameworks web com Python
Entendendo Frameworks web com Python
 
Entendendo Framework Web com Python
Entendendo Framework Web com PythonEntendendo Framework Web com Python
Entendendo Framework Web com Python
 
Automação de Teste em Front End - Caipira Ágil
Automação de Teste em Front End - Caipira ÁgilAutomação de Teste em Front End - Caipira Ágil
Automação de Teste em Front End - Caipira Ágil
 
Como DDD e Strategic Design estão nos ajudando a modernizar um Legado
Como DDD e Strategic Design estão nos ajudando a modernizar um LegadoComo DDD e Strategic Design estão nos ajudando a modernizar um Legado
Como DDD e Strategic Design estão nos ajudando a modernizar um Legado
 
Inversão de Controlo (IoC) / Injecção de Dependência (DI) - Bruno Lopes & C. ...
Inversão de Controlo (IoC) / Injecção de Dependência (DI) - Bruno Lopes & C. ...Inversão de Controlo (IoC) / Injecção de Dependência (DI) - Bruno Lopes & C. ...
Inversão de Controlo (IoC) / Injecção de Dependência (DI) - Bruno Lopes & C. ...
 
Palestra - Symfony Framework MVC PHP 5
Palestra - Symfony Framework MVC PHP 5Palestra - Symfony Framework MVC PHP 5
Palestra - Symfony Framework MVC PHP 5
 
Produtividade infinito e além com We.js
Produtividade infinito e além com We.jsProdutividade infinito e além com We.js
Produtividade infinito e além com We.js
 
Python, a arma secreta do Google
Python, a arma secreta do GooglePython, a arma secreta do Google
Python, a arma secreta do Google
 
Desenvolvimento Ágil com Grails.
Desenvolvimento Ágil com Grails.Desenvolvimento Ágil com Grails.
Desenvolvimento Ágil com Grails.
 
Grails
GrailsGrails
Grails
 
[JS EXPERIENCE 2018] Do jQuery aos microfrontends: os desafios de manter uma ...
[JS EXPERIENCE 2018] Do jQuery aos microfrontends: os desafios de manter uma ...[JS EXPERIENCE 2018] Do jQuery aos microfrontends: os desafios de manter uma ...
[JS EXPERIENCE 2018] Do jQuery aos microfrontends: os desafios de manter uma ...
 

Mais de Vinta Software

Contribuir com o django é mais simples do que voce imagina!
Contribuir com o django é mais simples do que voce imagina!Contribuir com o django é mais simples do que voce imagina!
Contribuir com o django é mais simples do que voce imagina!Vinta Software
 
Python e tipagem estática
Python e tipagem estáticaPython e tipagem estática
Python e tipagem estáticaVinta Software
 
Django’s Club: Como fazer um sistema de assinatura
Django’s Club: Como fazer um sistema de assinaturaDjango’s Club: Como fazer um sistema de assinatura
Django’s Club: Como fazer um sistema de assinaturaVinta Software
 
5 meses de python o que aprendi
5 meses de python  o que aprendi5 meses de python  o que aprendi
5 meses de python o que aprendiVinta Software
 
Conheça como a Vinta trabalha.
Conheça como a Vinta trabalha.Conheça como a Vinta trabalha.
Conheça como a Vinta trabalha.Vinta Software
 
Vinta Software Presentation
Vinta Software PresentationVinta Software Presentation
Vinta Software PresentationVinta Software
 

Mais de Vinta Software (6)

Contribuir com o django é mais simples do que voce imagina!
Contribuir com o django é mais simples do que voce imagina!Contribuir com o django é mais simples do que voce imagina!
Contribuir com o django é mais simples do que voce imagina!
 
Python e tipagem estática
Python e tipagem estáticaPython e tipagem estática
Python e tipagem estática
 
Django’s Club: Como fazer um sistema de assinatura
Django’s Club: Como fazer um sistema de assinaturaDjango’s Club: Como fazer um sistema de assinatura
Django’s Club: Como fazer um sistema de assinatura
 
5 meses de python o que aprendi
5 meses de python  o que aprendi5 meses de python  o que aprendi
5 meses de python o que aprendi
 
Conheça como a Vinta trabalha.
Conheça como a Vinta trabalha.Conheça como a Vinta trabalha.
Conheça como a Vinta trabalha.
 
Vinta Software Presentation
Vinta Software PresentationVinta Software Presentation
Vinta Software Presentation
 

Como criar APIs Python robustas e extensíveis

  • 1. Como fazer boas libs? Flávio Juvenal Vinta Software www.vinta.com.br
  • 2.
  • 3.
  • 4. ● Dia 16: Estrutura de dados e collections em Python - André Ericson (Sala Sambaqui 3) ● Dia 17: Definindo um Boilerplate Customizável usando Django, React e Bootstrap - Lais Varejão (Sala Sambaqui 3) Outras talks da Vinta na PyBR 12
  • 5. Como fazer boas libs APIs?
  • 6. Não vamos abordar ● Estrutura de projeto ● Distribuição ● Licença de uso ● Semantic Versioning ● Code-style ● Continuous Integration ● Coverage ● etc...
  • 7. API "Um conjunto de definições de subrotinas, protocolos e ferramentas para construir software e aplicações." https://en.wikipedia.org/wiki/Application_programming_inter face
  • 8. Sua API é uma UI
  • 9.
  • 10. Sua API é uma UI 10 Usability Heuristics for User Interface Design https://www.nngroup.com/articles/ten-usability-heuristics/
  • 11. Sua API é uma UI ● Visibility of system status ● Match between system and the real world ● User control and freedom ● Consistency and standards ● Recognition rather than recall ● Flexibility and efficiency of use ● Aesthetic and minimalist design ● Error prevention ● Help users recognize, diagnose, and recover from errors ● Help and documentation
  • 12. Sua API é uma UI Hmm… bonito… mas abstrato demais... Máximas como esta são difíceis de aplicar e avaliar. Precisamos de princípios mais práticos!
  • 14. - Com ou sem underscore? gettype VS get_class (PHP) - objeto + verbo ou verbo + objeto? str_shuffle VS recode_string (PHP) Consistência na prática: nomenclatura
  • 15. - Abreviações activatePreviousWindows VS fetchPrev (Qt < 4) bin2hex VS strtolower (PHP) Consistência na prática: nomenclatura
  • 16. - Ordem dos argumentos? datetime.datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None) datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0) Consistência na prática: ordem
  • 17. - Significado de vazio: None, False, [], '', 0 - Use o mais adequado. Cuidado com significados obscuros: >>> import datetime >>> bool(datetime.date(datetime.MINYEAR, 1, 1)) True >>> bool(datetime.time(0)) # Python < 3.5 False Consistência na prática: semântica
  • 18. [ ] A API exige que o usuário volte constantemente para documentação para saber como faz algo? [ ] Existe consistência na nomenclatura (ordem dos termos, abreviações, plurais, etc)? [ ] Existe consistência na ordem dos argumentos? [ ] Existe consistência no que significa vazio? Aumentar a consistência
  • 20. Zen of Python Flat is better than nested. Sparse is better than dense. Readability counts.
  • 21. [ ] A API exige que você copie e cole muito código para fazer algo comum? Se sim, faça funções mais gerais (mas mantenha as mais específicas para não perder composability). Exemplo: Reduzir a verbosidade
  • 22. import urllib.request gh_url = 'https://api.github.com/user' password_mgr = urllib.request.HTTPPasswordMgrWithDefaultRealm() password_mgr.add_password(None, gh_url, 'user', 'pswd') handler = urllib.request.HTTPBasicAuthHandler(password_mgr) opener = urllib.request.build_opener(handler) opener.open(gh_url) Reduzir a verbosidade
  • 23. Reduzir a verbosidade import requests session = requests.Session() session.auth = ('user', 'pswd') session.get('https://api.github.com/user')
  • 24. [ ] É possível usar um tipo padrão adequado ao invés de um novo tipo customizado da API? urllib.request.HTTPPasswordMgrWithDefaultRealm VS tuple Reduzir a verbosidade
  • 25. [ ] A API tem valores defaults sãos? // Aff... history.pushState(null, "", "https://vinta.com.br"); // Por que não é? history.pushState("https://vinta.com.br"); Reduzir a verbosidade
  • 26. Principle of Least Astonishment
  • 27. Principle of Least Astonishment Previna que seu cliente da API fale WAT. http://programmers.stackexchange.com/questions/187457/ what-is-the-principle-of-least-astonishment
  • 28. JavaScript < ES5 >>> parseInt('010') >>> 8 Se o valor vier de um input do usuário, lascou… https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects /parseInt#ECMAScript_5_removes_octal_interpretation Principle of Least Astonishment
  • 29. Python >>> int('010') >>> 10 Principle of Least Astonishment
  • 30. JavaScript >>> new Date(2016, 1, 1) Mon Feb 01 2016 00:00:00 GMT-0300 (BRT) Principle of Least Astonishment
  • 31. Python >>> datetime.datetime(2016, 1, 1).isoformat() '2016-01-01T00:00:00' Principle of Least Astonishment
  • 32. [ ] PLA funcional: O comportamento padrão faz o que o usuário realmente espera? Testar com usuários reais! Garantir o Principle of Least Astonishment
  • 33. Em Python, "assimetria de comportamentos deve se refletir em assimetria de formas": numbers.sort() VS sorted(numbers) .append() VS + Evitar misturar retornos com side-effects: http://stackoverflow.com/questions/13062423/is-making-in-place-operations-ret urn-the-object-a-bad-idea Principle of Least Astonishment
  • 34. Cuidado com falsa simetria: QStatusBar::message(text, msecs) (Qt 3) QStatusBar::setMessage(text, msecs) QStatusBar::showMessage(text, msecs) (Qt 4) Principle of Least Astonishment
  • 35. [ ] PLA não-funcional: O comportamento padrão está de acordo com as expectativas de performance, efeitos colaterais, safety, segurança, etc? Garantir o Principle of Least Astonishment
  • 37. "Abstração: uma simplificação de algo muito mais complicado que está acontecendo por debaixo dos panos" Joel Spolsky em http://www.joelonsoftware.com/articles/LeakyAbstractions.h tml Abstrações
  • 38. from collections import Counter c = Counter(['eggs', 'ham', 'eggs']) print(c) >>> Counter({'eggs': 2, 'ham': 1}) Abstrações
  • 39. sorted([2,3,1]) >>> [1, 2, 3] Abstrações
  • 40. PS: Mas só porque está acontecendo debaixo dos panos, não deve ser completamente invisível. O como às vezes precisa estar evidente. Mais sobre isso a seguir... Law of Leaky Abstractions
  • 41. O problema é que "Todas abstrações não-triviais são vazadas". Esta é a "The Law of Leaky Abstractions". Ou seja, detalhes da implementação vazam. Law of Leaky Abstractions
  • 42. O que causa vazamentos? Quando tentamos garantir algo impossível ou não-natural. Law of Leaky Abstractions
  • 43. APIs RPC que tentam igualar chamadas remotas a chamadas locais. guido_profile = Facebook.get_profile('guido') guido_profile.set_name("Benevolent Dictator For Life") Law of Leaky Abstractions
  • 44. REST não abstrai a dualidade cliente-servidor. Pelo contrário, abraça ela. Por exemplo com o Conditional PUT: Law of Leaky Abstractions
  • 45. [ ] Existe algo que a API está tentando abstrair e não devia? Minimizar vazamentos das abstrações em APIs
  • 47. Outro problema das abstrações é quando elas não são completas, são restritas. O cliente precisará estender a abstração com mais funcionalidades, mudar partes de funcionalidades existentes ou compor a abstração com outras. Completude e extensibilidade
  • 48. Completude e extensibilidade "O maior objetivo de uma API deve ser eliminar a descontinuidade de integração." Casey Muratori em: https://mollyrocket.com/casey/stream_0028.html
  • 49.
  • 50.
  • 51. ORM count ORM annotate com F object ORM com annotate e custom Aggregate ORM annotate com F object e Func
  • 52.
  • 53.
  • 54. O cliente precisará estender a abstração com mais funcionalidades, mudar partes de funcionalidades existentes ou compor a abstração com outras. Não tem problema a API não ser completa, mas ela deve ser extensível, flexível e "composable". Completude e extensibilidade
  • 56. Um dos vilões da extensibilidade se chama retenção. Retenção ocorre quando a API sequestra ou encapsula um recurso e impede seu uso direto. Retenção
  • 57. - retenção para ser + extensível [ ] Ofereça a opção de deixar um recurso interno aberto/alocado mesmo depois de ter terminado de usá-lo. [ ] Dê acesso (mesmo que com _) a recursos que o cliente pode precisar.
  • 58. [ ] Retorne objetos que o cliente pode precisar. [ ] Ao fazer Inversion of Control ou chamar callbacks, passe tudo que a função do cliente pode precisar. Exemplo a seguir: - retenção para ser + extensível
  • 59.
  • 60.
  • 62. Além de mais retenção, encapsulamento total resulta em menos flexibilidade. Quem quiser mudar o comportamento interno vai conseguir de um jeito ou de outro (monkey-patching, reflection, etc)… então pra que esconder tanto? "For a Pythonista, encapsulation is not the inability of seeing internals of classes, but the possibility of avoiding to look at it" http://stackoverflow.com/questions/7456807/python-name-mangl ing Encapsulamento total para que?
  • 64. - encapsulamento para ser + extensível [ ] A API permite a modificação ou remoção de comportamentos sem que o usuário tenha que reescrever o código interno dela? Permita sobrescrita para evitar reescrita! Exemplo dropzone.js:
  • 65.
  • 66. - encapsulamento para ter + composability [ ] Aceite recursos oferecidos pelo cliente caso eles sejam similares aos seus (aproveite duck-typing). [ ] Ofereça a opção de aceitar um recurso externo previamente aberto/alocado.
  • 67. [ ] Se for necessário fazer muitos mock.patch, então está faltando Inversion of Control/Dependecy Injection para ser mais flexível. Faça mais DI. Exemplo: - encapsulamento para ter + composability
  • 68. - encapsulamento para ter + composability @patch('my.project.trading.get_enriched_trade_data', lambda: TEST_TRADE_DATA) @patch('my.project.subledger.get_subledger_data', get_test_subledger_data) @patch('my.project.metadata.get_subledger_codes', return_value=TEST_CODES) @patch('my.project.reports.store_report') def test_build_report(self, store_report): build_report() store_report.assert_called_with(EXPECTED_REPORT) http://mauveweb.co.uk/posts/2014/09/every-mock-patch-is-a-little-smell.html
  • 69. Mais
  • 72. Se os três pontos de integração forem da mesma lib, já muito!
  • 73. Mas o ideal é sempre mais
  • 74. + níveis de abstração para ter + composability [ ] A API provê vários níveis de abstração, do mais abstrato ao mais específico/customizável/ baixo-nível? [ ] Na API, você deixou "o simples fácil, o complexo possível e o errado impossível"? Exemplo a seguir:
  • 75. + níveis de abstração para ter + composability @app.task def add(x, y): return x + y
  • 76. class AdderTask(Task): rate_limit = '100/h' def run(self, x, y): return x + y + níveis de abstração para ter + composability
  • 79. [ ] Tem "and" no nome da função? A função muda o estado de vários objetos? A função tem mais de um interesse (concern)? Se sim, quebre a função maior fazendo ela chamar funções menores. Exemplo a seguir: + granularidade para ter + composability e + extensibilidade
  • 80.
  • 81. ● Não forçar o usuário a especificar o que é óbvio ou frequente. ● Mas também não esconder o que é importante e muitos podem querer mudar. ● Quanto mais níveis de abstração a API tiver, mais a API vai acertar os níveis que os clientes precisam. Acertar o nível de abstração
  • 83. ● Prefira @property a métodos import urllib.request r = urllib.request.urlopen('http://python.org/') r.getcode() import requests r = requests.get('http://python.org/') r.status_code Pythonic
  • 84. ● Use Context managers para objetos com life-cycle f = open('file.txt') contents = f.read() f.close() with open('file.txt') as f: contents = f.read() Pythonic
  • 85. ● Defina __repr__ >>> requests.get('http://httpbin.org/status/200') <Response [200]> >>> Github().gists() <TapiocaClientExecutor object 'https://api.github.com/gists'> Pythonic
  • 86. Pythonic ● Operator overloading ● Decorators ● Generators ● asyncio ● etc... "Design Patterns are missing language features" Exemplo: strategy pattern < high order functions
  • 87. ● Documentação!!!!!!!!!! ○ Mostrar quick-start com poucas linhas para fazer o básico ○ Top-down: primeiro pensar em o que a API deve fazer, documentar isso, e só depois implementar ○ Exemplos hands-on, com casos de uso (exemplo: python-social-auth) ○ Documentar erros comuns, depois proteger a API contra eles (se estiver falando muito "note" ou "careful", mude sua API) Também é importante
  • 88. ● Visibilidade de contexto: cuidado com interfaces modais ● Exceções ○ Vários tipos ○ Mensagens de erro ○ Fail-fast, especialmente em operações sequenciais ○ "Errors should never pass silently. Unless explicitly silenced." ● Safety (não é segurança!) ● Imutabilidade ● Discoverability ● etc... Também é importante
  • 89. ● Slides disponíveis em: http://bit.ly/pybr12-vinta ● Twitter: @flaviojuvenal Dúvidas?
  • 90. ● Designing and Evaluating Reusable Components ● The Little Manual of API Design ● API Design Tips ● API Design ● What Makes Software Good? ● What makes a good software library? ● Bumper-Sticker API Design ● Ten Good Rules for Bad APIs Referências
  • 91. Referências ● What guidelines should I follow while designing a library? ● API: Design Matters ● How to Design a Good API and Why it Matters ● API Design Principles - Qt Wiki ● PHP: a fractal of bad design ● Why frameworks are evil ● Multiple levels of abstraction ● The Law of Leaky Abstractions
  • 92. Referências ● On DRY and the cost of wrongful abstractions ● The Wrong Abstraction ● Separation of concerns ● Command–query separation ● PEP 8