• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Design de código: princípios e práticas para ter um código sustentável
 

Design de código: princípios e práticas para ter um código sustentável

on

  • 1,580 views

Escrever código é algo fácil o difícil é manter seu código limpo, legível por muito tempo sem transformá-lo em um código legado. Irei abordar várias práticas, princípios e padrões que nos ...

Escrever código é algo fácil o difícil é manter seu código limpo, legível por muito tempo sem transformá-lo em um código legado. Irei abordar várias práticas, princípios e padrões que nos ajudam a escrever e manter o código limpo.

Statistics

Views

Total Views
1,580
Views on SlideShare
1,349
Embed Views
231

Actions

Likes
1
Downloads
19
Comments
0

7 Embeds 231

http://andrewsmedina.com 97
http://www.andrewsmedina.com 89
http://cobrateam.info 37
https://twitter.com 3
http://digg.com 3
http://www.cobrateam.info 1
http://andrewsmedina1.rssing.com 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Apple Keynote

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n

Design de código: princípios e práticas para ter um código sustentável Design de código: princípios e práticas para ter um código sustentável Presentation Transcript

  • design de código: princípios e práticas para ter um código sustentável @andrewsmedina
  • existem muitos códigos ruins...globo .com
  • o trileando é um deles...globo .com
  • mas eles já tem um lugar reservado para eles:globo .com
  • codecrap.comglobo .com
  • trileano?globo .com
  • if variavel == True: return “cara” else variavel == False: return “coroa” else: return “moeda cai em pe”globo .com
  • design de código: sustentável
  • design códigosustentável
  • design?
  • design = forma de demonstrar ‣ como você está organizado os componentes de sua aplicação e como eles se comunicam entre si.globo .com
  • design = forma de demonstrar ‣ diagramas (uml, fluxo) ‣ desenhos ‣ códigoglobo .com
  • código?
  • sustentável?
  • códigoglobo .com
  • código nasceglobo .com
  • classglobo .com
  • cresceglobo .com
  • class1 class2globo .com
  • reproduzglobo .com
  • globo .com
  • morreglobo .com
  • globo .com
  • sustentavelglobo .com
  • from random import suffle VaRiAvEl = 8 variavelZoada = 10 class classe_zoada: pass classe_zoada.foo = lambda self, x: x / 2globo .com
  • pep8 from random import suffle variavel = 8 variavel_zoada = 10 class ClasseZoada(object): def foo(self, x): return x / 2globo .com
  • pyflakes class ClasseZoada(object): def foo(self, x): return x / 2globo .com
  • testes classe_zoada = ClasseZoada() assert classe_zoada.foo(10) == 5globo .com
  • tdd ‣ testes primeiro!globo .com
  • globo .com
  • tdd classe_zoada = ClasseZoada() assert classe_zoada.dobro(10) == 20globo .com
  • tdd - baby steps class ClasseZoada(object): def dobro(self, x): return 20globo .com
  • tdd - baby steps classe_zoada = ClasseZoada() assert classe_zoada.dobro(10) == 20globo .com
  • tdd - refactoring classe_zoada = ClasseZoada() assert classe_zoada.dobro(10) == 20globo .com
  • tdd - refactoring class ClasseZoada(object): def dobro(self, x): return x * 2globo .com
  • tdd - refactoring classe_zoada = ClasseZoada() assert classe_zoada.dobro(10) == 20globo .com
  • the zen of python ‣ by Tim Peters ‣ import thisglobo .com
  • the zen of python ‣ simples é melhor que complexo ‣ bonito é melhor que feio ‣ explícito é melhor que implícito ‣ legibilidade conta ‣ Casos especiais não são especiais o suficiente para quebrar as regras ‣ Se a implementação é difícil de explicar, é uma má idéia ‣ Se a implementação é fácil de explicar, pode ser uma boa idéiaglobo .com
  • é possível escrever um código “não sustentável” usando tdd, seguindo pep8, flakes e o zen?globo .com plataformas de conteúdo e vendas
  • #Iglobo .com
  • for texto in leia(): imprima(texto)globo .com
  • for texto in leia(): if fonte == “impressora”: imprima(texto) if fonte == “tela”: exiba(texto)globo .com
  • for texto in leia(): if fonte == “impressora”: imprima(texto) if fonte == “tela”: exiba(texto) if fonte == “fax”: envie_fax(texto) if fonte == “email”: envie_email(texto)globo .com
  • interfacesglobo .com
  • interfaces em python?globo .com
  • interfaces em python? interface Writer: write(msg) class EmailWriter implements Writer: def write(self, msg): send_email(msg)globo .com
  • interfaces em python! reader = MyReader() writer = Emailer() for text in reader.read(): writer.write(text)globo .com
  • interfaces em python! reader = MyReader() writer = Printer() for text in reader.read(): writer.write(text)globo .com
  • interfaces em python? interface Writer: write(msg) class EmailWriter implements Writer: def write(self, msg): send_email(msg)globo .com
  • interfaces em python! class Printer(object): def write(self, text): print(text) class Emailer(object): def write(self, text) smtp_send(text)globo .com
  • interfaces em python! class Writer(object): def write(self, text): raise NotImplementedError() class Printer(Writer): def write(self, text): print(text) class Emailer(Writer): def write(self, text) smtp_send(text)globo .com
  • #2globo .com
  • o que esse código faz? def timeout_handler(signum, frame): raise TimeoutException() signal.signal(signal.SIGALRM, timeout_handler) signal.alarm(3) url = "http://github.com/{0}/last-commit/" response = requests.get(url.format(username)) return response.jsonglobo .com
  • o que esse código faz? def last_commit(username): def timeout_handler(signum, frame): raise TimeoutException() signal.signal(signal.SIGALRM, timeout_handler) signal.alarm(3) url = "http://github.com/{0}/last-commit/" response = requests.get(url.format(username)) return response.jsonglobo .com
  • o que esse código faz? def last_commit(username): def timeout_handler(signum, frame): raise TimeoutException() signal.signal(signal.SIGALRM, timeout_handler) signal.alarm(3) url = "http://github.com/{0}/last-commit/" response = requests.get(url.format(username)) return response.jsonglobo .com
  • mais de uma responsabilidade!globo .com
  • difícil de explicarglobo .com
  • difícil de lerglobo .com
  • classes com muitas responsabilidades ‣ muitos métodosglobo .com
  • funções/métodos com muitas responsabilidades ‣ método/função muito grandeglobo .com
  • def last_commit(username): timeout(seconds=3) url = "http://github.com/{0}/last-commit/" response = requests.get(url.format(username)) return response.jsonglobo .com
  • @timeout(seconds=3) def last_commit(username): url = "http://github.com/{0}/last-commit/" response = requests.get(url.format(username)) return response.jsonglobo .com
  • #3globo .com
  • def extract_context(content): all_tags = list(content.tags.all()) keywords = ", ".join([t.name for t in all_tags]) return { keywords: keywords, page_title: _build_breadcrumb(content) }globo .com
  • domain driver developmentglobo .com
  • def page_metadata(content): return { keywords: content.keywords, page_title: content.breadcrumb }globo .com
  • domain driver development 2 a missãoglobo .com
  • class Content(object): @property def metadata(self): return { keywords: self.keywords, page_title: self.breadcrumb }globo .com
  • content.metadataglobo .com
  • #4globo .com
  • def get_plugin_by_id(id): plugins = [plugin for plugin in get_plugins() if plugin.id == id] plugin = plugins[0] return pluginglobo .com
  • e se get_plugins() retornar []?globo .com
  • get_plugin_by_id(1)globo .com
  • e se get_plugins() retornar o plugin com id 1 como primeiro na lista?globo .com
  • def plugin_by_id(id): for plugin in get_plugins(): if plugin.id == id: return plugin return Noneglobo .com
  • e se o plugin não existir?globo .com
  • plugin = get_plugin_by_id(1) plugin.run()globo .com
  • plugin = get_plugin_by_id(1) if plugin: plugin.run()globo .com
  • def plugin_by_id(id): for plugin in get_plugins(): if plugin.id == id: return plugin raise NotFound()globo .com
  • #5globo .com
  • class Actions(object): def save_file(self, filename, content): file = open(filename, "w") file.write(content) file.close() def read_file(self, filename): file = open(filename) return file.read()globo .com
  • actions = Actions() ??? actions.save_file(“foo.txt”, “foo”)globo .com
  • actions = Actions() ??? print actions.read_file(“foo.txt”)globo .com
  • class Controllers(object): def index(self, request): items = Itens() return render("index.html", items) def posts(self, request): posts = Posts() return render("posts.html", posts) def add_comment(self, request): post = Post(request.POST or {}) if post.is_valid(): post.save() return render("add_comment.html", post)globo .com
  • controllers = Controller() ??? controllers.index(request)globo .com
  • controllers = Controller() ??? controllers.add_comment(request)globo .com
  • classes para “agrupar” métodos?globo .com
  • você pode usar módulo!globo .com
  • #controller.py def index(request): items = Itens() return render("index.html", items) def posts(request): posts = Posts() return render("posts.html", posts)globo .com
  • import controllers controllers.index(request)globo .com
  • #6globo .com
  • >>> “andrews” + “medina” “andrews medina”globo .com
  • >>> imagem1 + imagem2globo .com
  • >>> sprite.do( Jump(10, 1) + Move(10, 10) )globo .com
  • class Action(object): def __add__(self, action): return sequence(self, action) def __or__(self, action): return spawn(self, action)globo .com
  • globo .com
  • globo .com
  • globo .com
  • globo .com
  • globo .com
  • Agora é melhor que nuncaglobo .com
  • obrigado! @andrewsmedina