SlideShare uma empresa Scribd logo
1 de 35
Código Limpo Gustavo Rezende
Especificação é código
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
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
Robert C. Martin
Qual a diferença entre um código limpo e um mal organizado?
 
:-(  Sujo  X  limpo  :-)
Mantenha-se  limpo
 
[object Object]
Use nomes que revelam seu Propósito. D  =  1 #tempo decorrido em dias Int elapsedTimeInDays; Int daysSinceCreation; Int fileAgeInDays;
Evite Informações Erradas. accountList accountGroup bunchOfAccounts accounts
A Notação Húngara. Phone String  = PhoneNumber() Account List  = () Account List .append( account ) o nome não muda  na alteração do tipo
Faça Distições Significativas. getActiveAccount() getActiveAccounts() getActiveAccountInfo() getActiveAccountData()
Selecione uma Palavra por Conceito. pegar recuperar obter
Faça Distinções Significativas. def  getThem(): list1 = [] for  x in self.the_list: if  x[0] == 4: list1.append(x) return  list1
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
Use Nomes Pronunciáveis. Genymdhms ↔ generationTimestamp  Modymdhms ↔ modificationTimestamp
Métodos. Métodos pequenos. Faça Apenas uma Coisa.
def  process(): self.input() self.count += 1 self.output() Faça Apenas uma Coisa.
def  process(): self.input() self.increment_count() self.output() Simetria.
def  process(): self.input() self.tally() self.output() Simetria.
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)
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 ...
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 ...
Organizando modulos e Classes.
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
As classes devem ser pequenas
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 ...
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 ...
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
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
 
FIM Gustavo Rezende [email_address]

Mais conteúdo relacionado

Mais procurados

Introdução a JavaScript
Introdução a JavaScriptIntrodução a JavaScript
Introdução a JavaScriptBruno Catão
 
LabMM3 - Aula teórica 06
LabMM3 - Aula teórica 06LabMM3 - Aula teórica 06
LabMM3 - Aula teórica 06Carlos Santos
 
Apresentação de ruby com blocos de programação, módulos e outros exemplos
Apresentação de ruby com blocos de programação, módulos e outros exemplosApresentação de ruby com blocos de programação, módulos e outros exemplos
Apresentação de ruby com blocos de programação, módulos e outros exemplosWende Mendes
 
Curso de OO com C# - Parte 04 - Estruturas de controle e Strings
Curso de OO com C# - Parte 04 - Estruturas de controle e StringsCurso de OO com C# - Parte 04 - Estruturas de controle e Strings
Curso de OO com C# - Parte 04 - Estruturas de controle e StringsLeonardo Melo Santos
 
Algoritmos 1 - Semana 2
Algoritmos 1 - Semana 2Algoritmos 1 - Semana 2
Algoritmos 1 - Semana 2Eder Samaniego
 
Curso de OO com C# - Parte 05 - Coleções genéricas e não-genéricas
Curso de OO com C# - Parte 05 - Coleções genéricas e não-genéricasCurso de OO com C# - Parte 05 - Coleções genéricas e não-genéricas
Curso de OO com C# - Parte 05 - Coleções genéricas e não-genéricasLeonardo Melo Santos
 
3. Funções/repórteres e listas em Snap!; Utilização de variáveis – Fundamento...
3. Funções/repórteres e listas em Snap!; Utilização de variáveis – Fundamento...3. Funções/repórteres e listas em Snap!; Utilização de variáveis – Fundamento...
3. Funções/repórteres e listas em Snap!; Utilização de variáveis – Fundamento...Manuel Menezes de Sequeira
 
Pseudocódigo ou Portugol (Lógica de Programação)
Pseudocódigo ou Portugol (Lógica de Programação)Pseudocódigo ou Portugol (Lógica de Programação)
Pseudocódigo ou Portugol (Lógica de Programação)Gercélia Ramos
 
5. Atribuições especiais; Arrays; Tipos de ciclos; Classes-pacote – Fundament...
5. Atribuições especiais; Arrays; Tipos de ciclos; Classes-pacote – Fundament...5. Atribuições especiais; Arrays; Tipos de ciclos; Classes-pacote – Fundament...
5. Atribuições especiais; Arrays; Tipos de ciclos; Classes-pacote – Fundament...Manuel Menezes de Sequeira
 
Maratona de Programação
Maratona de ProgramaçãoMaratona de Programação
Maratona de ProgramaçãoMarcos Castro
 
Aula 10 - Comando de Decisão Múltipla e Comandos de Repetição
Aula 10 - Comando de Decisão Múltipla e Comandos de RepetiçãoAula 10 - Comando de Decisão Múltipla e Comandos de Repetição
Aula 10 - Comando de Decisão Múltipla e Comandos de RepetiçãoAndré Constantino da Silva
 
Desenvolvimento iOS - Aula 1
Desenvolvimento iOS - Aula 1Desenvolvimento iOS - Aula 1
Desenvolvimento iOS - Aula 1Saulo Arruda
 
Logica Algoritmo 07 Subalgoritmos
Logica Algoritmo 07 SubalgoritmosLogica Algoritmo 07 Subalgoritmos
Logica Algoritmo 07 SubalgoritmosRegis Magalhães
 
mod2-mecanismos
mod2-mecanismosmod2-mecanismos
mod2-mecanismosdiogoa21
 
Programação Estruturada 2 - Aula 01 - Código Fonte
Programação Estruturada 2 - Aula 01 - Código FonteProgramação Estruturada 2 - Aula 01 - Código Fonte
Programação Estruturada 2 - Aula 01 - Código Fontethomasdacosta
 
Aula 9 - Resultado Operandos Matemáticos, Operadores Aritmeticos, Relacionais...
Aula 9 - Resultado Operandos Matemáticos, Operadores Aritmeticos, Relacionais...Aula 9 - Resultado Operandos Matemáticos, Operadores Aritmeticos, Relacionais...
Aula 9 - Resultado Operandos Matemáticos, Operadores Aritmeticos, Relacionais...André Constantino da Silva
 

Mais procurados (18)

Introdução a JavaScript
Introdução a JavaScriptIntrodução a JavaScript
Introdução a JavaScript
 
LabMM3 - Aula teórica 06
LabMM3 - Aula teórica 06LabMM3 - Aula teórica 06
LabMM3 - Aula teórica 06
 
Introducao logica
Introducao logicaIntroducao logica
Introducao logica
 
Apresentação de ruby com blocos de programação, módulos e outros exemplos
Apresentação de ruby com blocos de programação, módulos e outros exemplosApresentação de ruby com blocos de programação, módulos e outros exemplos
Apresentação de ruby com blocos de programação, módulos e outros exemplos
 
Curso de OO com C# - Parte 04 - Estruturas de controle e Strings
Curso de OO com C# - Parte 04 - Estruturas de controle e StringsCurso de OO com C# - Parte 04 - Estruturas de controle e Strings
Curso de OO com C# - Parte 04 - Estruturas de controle e Strings
 
Algoritmos 1 - Semana 2
Algoritmos 1 - Semana 2Algoritmos 1 - Semana 2
Algoritmos 1 - Semana 2
 
Curso de OO com C# - Parte 05 - Coleções genéricas e não-genéricas
Curso de OO com C# - Parte 05 - Coleções genéricas e não-genéricasCurso de OO com C# - Parte 05 - Coleções genéricas e não-genéricas
Curso de OO com C# - Parte 05 - Coleções genéricas e não-genéricas
 
3. Funções/repórteres e listas em Snap!; Utilização de variáveis – Fundamento...
3. Funções/repórteres e listas em Snap!; Utilização de variáveis – Fundamento...3. Funções/repórteres e listas em Snap!; Utilização de variáveis – Fundamento...
3. Funções/repórteres e listas em Snap!; Utilização de variáveis – Fundamento...
 
Pseudocódigo ou Portugol (Lógica de Programação)
Pseudocódigo ou Portugol (Lógica de Programação)Pseudocódigo ou Portugol (Lógica de Programação)
Pseudocódigo ou Portugol (Lógica de Programação)
 
5. Atribuições especiais; Arrays; Tipos de ciclos; Classes-pacote – Fundament...
5. Atribuições especiais; Arrays; Tipos de ciclos; Classes-pacote – Fundament...5. Atribuições especiais; Arrays; Tipos de ciclos; Classes-pacote – Fundament...
5. Atribuições especiais; Arrays; Tipos de ciclos; Classes-pacote – Fundament...
 
Maratona de Programação
Maratona de ProgramaçãoMaratona de Programação
Maratona de Programação
 
Aula 10 - Comando de Decisão Múltipla e Comandos de Repetição
Aula 10 - Comando de Decisão Múltipla e Comandos de RepetiçãoAula 10 - Comando de Decisão Múltipla e Comandos de Repetição
Aula 10 - Comando de Decisão Múltipla e Comandos de Repetição
 
Algoritmo 04 - Estruturas de decisão
 Algoritmo 04 - Estruturas de decisão Algoritmo 04 - Estruturas de decisão
Algoritmo 04 - Estruturas de decisão
 
Desenvolvimento iOS - Aula 1
Desenvolvimento iOS - Aula 1Desenvolvimento iOS - Aula 1
Desenvolvimento iOS - Aula 1
 
Logica Algoritmo 07 Subalgoritmos
Logica Algoritmo 07 SubalgoritmosLogica Algoritmo 07 Subalgoritmos
Logica Algoritmo 07 Subalgoritmos
 
mod2-mecanismos
mod2-mecanismosmod2-mecanismos
mod2-mecanismos
 
Programação Estruturada 2 - Aula 01 - Código Fonte
Programação Estruturada 2 - Aula 01 - Código FonteProgramação Estruturada 2 - Aula 01 - Código Fonte
Programação Estruturada 2 - Aula 01 - Código Fonte
 
Aula 9 - Resultado Operandos Matemáticos, Operadores Aritmeticos, Relacionais...
Aula 9 - Resultado Operandos Matemáticos, Operadores Aritmeticos, Relacionais...Aula 9 - Resultado Operandos Matemáticos, Operadores Aritmeticos, Relacionais...
Aula 9 - Resultado Operandos Matemáticos, Operadores Aritmeticos, Relacionais...
 

Destaque

Diapositivasunplug anexoc
Diapositivasunplug anexocDiapositivasunplug anexoc
Diapositivasunplug anexocPuyana44
 
Presentacion colegio alfredo iriarte
Presentacion colegio alfredo iriartePresentacion colegio alfredo iriarte
Presentacion colegio alfredo iriartemilena
 
1intropresocratica
1intropresocratica1intropresocratica
1intropresocraticaÀ. Baldó
 

Destaque (7)

Diapositivasunplug anexoc
Diapositivasunplug anexocDiapositivasunplug anexoc
Diapositivasunplug anexoc
 
Avid slides
Avid slidesAvid slides
Avid slides
 
Presentacion colegio alfredo iriarte
Presentacion colegio alfredo iriartePresentacion colegio alfredo iriarte
Presentacion colegio alfredo iriarte
 
Linux-install
Linux-installLinux-install
Linux-install
 
1intropresocratica
1intropresocratica1intropresocratica
1intropresocratica
 
2011 PSAE Test Prep
2011 PSAE Test Prep2011 PSAE Test Prep
2011 PSAE Test Prep
 
Grammar: Parts of Speech
Grammar: Parts of SpeechGrammar: Parts of Speech
Grammar: Parts of Speech
 

Semelhante a Código limpo: princípios e boas práticas

Removendo o cheiro ruim do seu código - SoLiSC 2011
Removendo o cheiro ruim do seu código - SoLiSC 2011Removendo o cheiro ruim do seu código - SoLiSC 2011
Removendo o cheiro ruim do seu código - SoLiSC 2011Luís Cobucci
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmGuilherme Blanco
 
Programação Orientada a Testes
Programação Orientada a TestesProgramação Orientada a Testes
Programação Orientada a TestesGregorio Melo
 
Domain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHDomain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHGiovanni Bassi
 
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ávelDesign 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ávelAndrews Medina
 
Comandos de Controle de Programa em C
Comandos de Controle de Programa em CComandos de Controle de Programa em C
Comandos de Controle de Programa em CElaine Cecília Gatto
 
Jason: Componentes personalizados
Jason: Componentes personalizados Jason: Componentes personalizados
Jason: Componentes personalizados Nécio de Lima Veras
 
Linguagens Poo
Linguagens PooLinguagens Poo
Linguagens PooInfogenius
 
PHP Experience 2016 - [Palestra] Rumo à Certificação PHP
PHP Experience 2016 - [Palestra] Rumo à Certificação PHPPHP Experience 2016 - [Palestra] Rumo à Certificação PHP
PHP Experience 2016 - [Palestra] Rumo à Certificação PHPiMasters
 
Conceitos e técnicas de programação aula 2
Conceitos e técnicas de programação aula 2Conceitos e técnicas de programação aula 2
Conceitos e técnicas de programação aula 2Robson Ferreira
 
UFCG.JCert Reunião 1 - Declarações e Controle de Acesso
UFCG.JCert Reunião 1 - Declarações e Controle de AcessoUFCG.JCert Reunião 1 - Declarações e Controle de Acesso
UFCG.JCert Reunião 1 - Declarações e Controle de AcessoAnderson Ledo
 

Semelhante a Código limpo: princípios e boas práticas (20)

Removendo o cheiro ruim do seu código - SoLiSC 2011
Removendo o cheiro ruim do seu código - SoLiSC 2011Removendo o cheiro ruim do seu código - SoLiSC 2011
Removendo o cheiro ruim do seu código - SoLiSC 2011
 
Clean Code
Clean CodeClean Code
Clean Code
 
Python Emsl2009
Python Emsl2009Python Emsl2009
Python Emsl2009
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine Orm
 
Programação Orientada a Testes
Programação Orientada a TestesProgramação Orientada a Testes
Programação Orientada a Testes
 
Introdução ao Java 5
Introdução ao Java 5Introdução ao Java 5
Introdução ao Java 5
 
Working with legacy code 3
Working with legacy code 3Working with legacy code 3
Working with legacy code 3
 
M5 php rc
M5 php rcM5 php rc
M5 php rc
 
Domain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHDomain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BH
 
Clean code
Clean codeClean code
Clean code
 
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ávelDesign 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
 
Programação Defensiva
Programação DefensivaProgramação Defensiva
Programação Defensiva
 
Comandos de Controle de Programa em C
Comandos de Controle de Programa em CComandos de Controle de Programa em C
Comandos de Controle de Programa em C
 
Jason: Componentes personalizados
Jason: Componentes personalizados Jason: Componentes personalizados
Jason: Componentes personalizados
 
Linguagens Poo
Linguagens PooLinguagens Poo
Linguagens Poo
 
Testes de software de A a Z
Testes de software de A a ZTestes de software de A a Z
Testes de software de A a Z
 
PHP Experience 2016 - [Palestra] Rumo à Certificação PHP
PHP Experience 2016 - [Palestra] Rumo à Certificação PHPPHP Experience 2016 - [Palestra] Rumo à Certificação PHP
PHP Experience 2016 - [Palestra] Rumo à Certificação PHP
 
Aula5
Aula5Aula5
Aula5
 
Conceitos e técnicas de programação aula 2
Conceitos e técnicas de programação aula 2Conceitos e técnicas de programação aula 2
Conceitos e técnicas de programação aula 2
 
UFCG.JCert Reunião 1 - Declarações e Controle de Acesso
UFCG.JCert Reunião 1 - Declarações e Controle de AcessoUFCG.JCert Reunião 1 - Declarações e Controle de Acesso
UFCG.JCert Reunião 1 - Declarações e Controle de Acesso
 

Código limpo: princípios e boas práticas

  • 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
  • 6. Qual a diferença entre um código limpo e um mal organizado?
  • 7.  
  • 8. :-( Sujo X limpo :-)
  • 10.  
  • 11.
  • 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 ...
  • 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
  • 29. As classes devem ser pequenas
  • 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 ...
  • 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 ...
  • 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]