Código Limpo

1,252 views

Published on

Como criar código claro, limpo e legível, que comunique a intenção do programador ao escrevê-lo.

Published in: Technology
1 Comment
1 Like
Statistics
Notes
No Downloads
Views
Total views
1,252
On SlideShare
0
From Embeds
0
Number of Embeds
5
Actions
Shares
0
Downloads
22
Comments
1
Likes
1
Embeds 0
No embeds

No notes for slide

Código Limpo

  1. 1. Código Limpo Gustavo Rezende
  2. 2. Especificação é código
  3. 3. Um código limpo é simples e direto. Ele é tão bem legível quanto uma prosa bem escrita. Ele jamais torna confuso o objetivo do desenvolvedor, em vez disso, ele está repleto de abstrações claras e linhas de controle objetivas. Grady Booch
  4. 4. Além de seu criador, um desenvolvedor pode ler e melhorar um código limpo. Ele tem testes de unidade e de aceitação, nomes significativos; ele oferece apenas uma maneira, e não várias, de se fazer uma tarefa; possui poucas dependências, as quais são explicitamente declaradas e oferecem uma API mínima e clara. O código deve ser inteligível já que dependendo da linguagem, nem toda informação necessária pode expressar no código em si. Dave Thomas
  5. 5. Robert C. Martin
  6. 6. Qual a diferença entre um código limpo e um mal organizado?
  7. 8. :-( Sujo X limpo :-)
  8. 9. Mantenha-se limpo
  9. 11. <ul>Nomes Significativos </ul>
  10. 12. Use nomes que revelam seu Propósito. D = 1 #tempo decorrido em dias Int elapsedTimeInDays; Int daysSinceCreation; Int fileAgeInDays;
  11. 13. Evite Informações Erradas. accountList accountGroup bunchOfAccounts accounts
  12. 14. A Notação Húngara. Phone String = PhoneNumber() Account List = () Account List .append( account ) o nome não muda na alteração do tipo
  13. 15. Faça Distições Significativas. getActiveAccount() getActiveAccounts() getActiveAccountInfo() getActiveAccountData()
  14. 16. Selecione uma Palavra por Conceito. pegar recuperar obter
  15. 17. Faça Distinções Significativas. def getThem(): list1 = [] for x in self.the_list: if x[0] == 4: list1.append(x) return list1
  16. 18. Faça Distinções Significativas. def getFlaggedCells(): flagged_cells = [] for cell in self.game_board: if cell.is_flagged() flagged_cells.append(cell) return flagged_cells
  17. 19. Use Nomes Pronunciáveis. Genymdhms ↔ generationTimestamp Modymdhms ↔ modificationTimestamp
  18. 20. Métodos. Métodos pequenos. Faça Apenas uma Coisa.
  19. 21. def process(): self.input() self.count += 1 self.output() Faça Apenas uma Coisa.
  20. 22. def process(): self.input() self.increment_count() self.output() Simetria.
  21. 23. def process(): self.input() self.tally() self.output() Simetria.
  22. 24. Parâmetros de Métodos. def criar_circulo(x, y, raio): ... def criar_circulo(centro, raio): … raio = 3.0 centro = Ponto(1.1, 3.8) circulo = criar_circulo(centro, raio)
  23. 25. Evite Efeitos Colaterais. ... def check_password( self , user, password): codedPhrase = user.getPhraseEncodedBuPassword() phrase = cryptographer.decrypt( codedPhrase, password) if “Valid Password” == phrase: self .session = Session.initialize() return True return False ...
  24. 26. Código inútil ... #import pdb; pdb.set_trace() ... def check_password( self , user, password): codedPhrase = self. user. / getPhraseEncodedBuPassword() phrase = self. cryptographer.decrypt( codedPhrase, password) if “Valid Password” == phrase: # self.session = Session.initialize() return True return False ...
  25. 27. Organizando modulos e Classes.
  26. 28. Organização import importes CONSTANTES = None variaveis_globais = False class ClassName(object): CONSTANTES = None publica = &quot;variaveis pulicas&quot; _privado = None def __init__( self ,): pass def metodos_publicos( self ): pass def _metodos_privados( self ): pass
  27. 29. As classes devem ser pequenas
  28. 30. Comentários ... def extractorRegion( self ,filename=None, data=None, **args): &quot;&quot;&quot; Extractor Rich Rock Methods Sun Shine &quot;&quot;&quot; GranulateObj = self .__process( filename=filename, data=data, **args) if hasattr(GranulateObj, 'extractRegion'): return GranulateObj.extractRegion() else : return None ...
  29. 31. Comentários ... def extractorRegion( self ,filename=None, data=None, **args): &quot;&quot;&quot; Extractor Region &quot;&quot;&quot; GranulateObj = self .__process( filename=filename, data=data, **args) if hasattr(GranulateObj, 'extractRegion'): return GranulateObj.extractRegion() else : return None ...
  30. 32. Comentários … farFrame = frame + 1 #variavel que controla os frames seguintes a serem comparados com o atual e incrementada save = 1 #a variavel save permanecendo com um o frame devera ser gravado #enquanto nao for o fim do vetor e nao forem analisados os 20 frames e o frame ainda pode ser gravado while (farFrame < len(vetImg)) and (farFrame < (frame + 20)) and (save == 1): frameDHistogram = self.createHistogramBoxes(vetImg, farFrame) #armazena o histograma do frame distante a ser comparado #diferenca do frame atual para o distante a ser analisado farDiference = self.calculateBoxesHistogramDiference(frameBHistogram, frameDHistogram) #se a diferenca dos histogramas dos frames for menor do que a sensibilidade nao gravar o frame if not self.potentialShot(farDiference, sensitivity): save = 0
  31. 33. Comentários #if is Mac Os and is IE Browser and was Initialized if ( &quot;MAC&quot; in platform.upper() and &quot;IE&quot; in browser.upper() and wasInitialized() and resize > 0): ... do something is_mac_os = &quot;MAC&quot; in platform.upper() is_IE_browser = &quot;IE&quot; in browser.upper() was_resized = resize > 0 if is_mac_os and is_IE_browser and wasInitialized() and was_resized: . .. do something
  32. 35. FIM Gustavo Rezende [email_address]

×