• Like
Código Limpo
Upcoming SlideShare
Loading in...5
×
Uploaded on

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

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

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
  • Notação hungara... só uso agora na empresa porque é obrigatório

    Muito bom essa apresentação
    Are you sure you want to
    Your message goes here
No Downloads

Views

Total Views
1,024
On Slideshare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
18
Comments
1
Likes
1

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Código Limpo Gustavo Rezende
  • 2. Especificação é código
  • 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. 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. Robert C. Martin
  • 6. Qual a diferença entre um código limpo e um mal organizado?
  • 7.  
  • 8. :-( Sujo X limpo :-)
  • 9. Mantenha-se limpo
  • 10.  
  • 11.
      Nomes Significativos
  • 12. Use nomes que revelam seu Propósito. D = 1 #tempo decorrido em dias Int elapsedTimeInDays; Int daysSinceCreation; Int fileAgeInDays;
  • 13. Evite Informações Erradas. accountList accountGroup bunchOfAccounts accounts
  • 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
  • 15. Faça Distições Significativas. getActiveAccount() getActiveAccounts() getActiveAccountInfo() getActiveAccountData()
  • 16. Selecione uma Palavra por Conceito. pegar recuperar obter
  • 17. Faça Distinções Significativas. def getThem(): list1 = [] for x in self.the_list: if x[0] == 4: list1.append(x) return list1
  • 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
  • 19. Use Nomes Pronunciáveis. Genymdhms ↔ generationTimestamp Modymdhms ↔ modificationTimestamp
  • 20. Métodos. Métodos pequenos. Faça Apenas uma Coisa.
  • 21. def process(): self.input() self.count += 1 self.output() Faça Apenas uma Coisa.
  • 22. def process(): self.input() self.increment_count() self.output() Simetria.
  • 23. def process(): self.input() self.tally() self.output() Simetria.
  • 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)
  • 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 ...
  • 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 ...
  • 27. Organizando modulos e Classes.
  • 28. Organização import importes CONSTANTES = None variaveis_globais = False class ClassName(object): CONSTANTES = None publica = "variaveis pulicas" _privado = None def __init__( self ,): pass def metodos_publicos( self ): pass def _metodos_privados( self ): pass
  • 29. As classes devem ser pequenas
  • 30. Comentários ... def extractorRegion( self ,filename=None, data=None, **args): """ Extractor Rich Rock Methods Sun Shine """ GranulateObj = self .__process( filename=filename, data=data, **args) if hasattr(GranulateObj, 'extractRegion'): return GranulateObj.extractRegion() else : return None ...
  • 31. Comentários ... def extractorRegion( self ,filename=None, data=None, **args): """ Extractor Region """ GranulateObj = self .__process( filename=filename, data=data, **args) if hasattr(GranulateObj, 'extractRegion'): return GranulateObj.extractRegion() else : return None ...
  • 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
  • 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
  • 34.  
  • 35. FIM Gustavo Rezende [email_address]