*** Classes: descrevem as instâncias (os objectos da classe) - atributos (ou variáveis): valores específicos das instâncias (e da classe). - métodos (ou funções): manipulam os atributos e podem receber argumentos. - static: atributos e funções comuns a todas as instâncias (não podem acder a atributos e métodos não estáticos, pois é necessário cria uma instância [new]) - não estáticos: podem aceder a atributos e métodos do próprio objecto [this] e estáticos (comuns a todas as instâncias). *** Encapsulamento: (linguagens baseadas em objectos) Código protegido do próprio programador (e também do utilizador) - variáveis todas private (será difícil justificar outra escolha!) - métodos o mais restritos possível (private, protected, [package], public) *** Herança: (linguagens orientadas por objectos) Herança como forma de especialização por extensão. - Tipos são substituídos por classes, logo nunca devem existem variáveis/métodos designados 'tipo'. Não se deve usar ifs para separar tipos, nem 'instanceOf' ou '.class', nem tão pouco Strings como super-tipo (guardar como texto e não como o objecto específico). Em casos limites pode-se recorrer ao ClassCastException, mas evitar ao máximo o instanceof. *** Polimorifismo: (o mesmo nome designa diversos conceitos) - sobreposição: nomes de métodos mais curtos e com argumentos facultativos (!), por exemplo add(A) e add(B) ou add(A) e add(A, B) - inclusão: herança para especializar comportamento através da redefinição de métodos (final para impedir redefinição). - paramétrico: diferenças de tipo são tratados por parâmetros . *** Engenharia: (boa programação) - factorização: não repetir código. - responsabilidades: nos respectivos objectos e não centralizado. - dimensão: manter objectos entre 5 e 25 (max. 50) métodos. - abstracção: Map = HashMap ou Map = TreeMap - extensibilidade: métodos não final, padrões, reflexão, ... - interface utilizador: lógica no domínio e separado do IO nos comandos - constantes: não modelar constantes como atributos.