Para que server o DOCTYPE?

Postado por Herminio em março 29, 2010

O Standard Generalized Markup Language (SGML) é uma metalinguagem através da qual se pode definir linguagens de marcação para documentos. Documentos como (X)HTML e XML são derivadas do SGML. O DOCTYPE é um acrônimo para DTD (Definição de Tipo de Documento). É o doctype que diz para os user agents qual o tipo de documento que ele tem que interpretar (parsing) e como ele deve renderizar esse documento. A definição de um tipo de documento (doctype) informa quais as regras que os user agents devem utilizar do que é e o que não é permitido em uma determinada versão de um XML e de um (X)HTML. É uma forma de dizer a eles quais são as regras que aquele documento pretende seguir e quais as regras que o browser deve utilizar ao analisar (parsing) o documento. E basicamente existem 3 tipos de DOCTYPES que são: Strict, Transitional, Frameset.

Campanha Anti-IF para um código mais simples

Postado por Herminio em março 24, 2010

Bem fiz a tradução desse artigo Anti-IF.

O problema básico é que o IF cria dependências, o acoplamento entre os módulos (métodos, objetos, componentes, etc) e aumenta os caminhos possíveis dentro do nosso código (o que reduz a legibilidade).

Um IF parece ser uma maneira rápida e fácil de fazer mudanças, mas pelos motivos listados acima, se após o IF, criamos software cheio de duplicações que não pode ser modificado.

Aqui está um exemplo simples:

// Bond class
double calculateValue() {
       // look is here
       if(_type == BTP)  {
        return calculateBTPValue();
       // look is here
       } else if(_type == BOT) {
                 return calculateBOTValue();    
              } else {
                 return calculateEUBValue();
              }
}

Toda mudança no tipo de vínculo, por exemplo, um novo laço para avaliar, conduz a uma modificação no nosso pedaço de código. Imagine o que seria necessário fazer para modificar os métodos com CASES e IF’s e suas opções!

// Bond class
double calculateValue() {
    _bondProfile.calculate();
}
// AbstractBondProfile class
//
// look is here
abstract double calculate();
               
// classe BTPBondProfile >> AbstractBondProfile
double calculate() {
    ...
}
// classe BOTBondProfile >> AbstractBondProfile
double calculate() {
    ...
}
// classe EUBondProfile >> AbstractBondProfile
double calculate() {
    ...
}

O que ganhamos tirando IF?

A vantagem é que, amanhã, podemos atender a solicitação para um novo tipo de ligação, basta criar uma nova classe, com a única lógica necessária para calcular o valor do novo Bond.

A solução não é sempre criar uma nova classe abstrata ou uma interface. Mas a solução será sempre fazer o software flexível, comunicativo, testável, prontos para a mudança.