wpjr2’s Weblog

Artigos e tutoriais úteis

Archive for 22 de abril de 2008

Novidades no Blog

Posted by wpjr2 em abril 22, 2008

Segue abaixo algumas novidades no blog:

  • Links: novos links de páginas no blog para sugestões de livros, links, e para temas referentes às plataformas JavaSE e JavaME.
  • Projeto de Curso: disponibilizei as apresentações dos exercícios dos capítulos 3 e 4 do nosso projeto de curso. Estou em fase de análise do Slideshare no blog para que todos possam acessar os slides durante a semana.
  • Exercícios da apostila: disponibilizei também o gabarito dos exercícios da apostila. Como preciso fazer todos os exercícios, estarei disponibilzando-os aos poucos.

Ambas páginas estão disponíveis via link “Java SE”.

Comentários e sugestões são bem vindas.


Posted in Uncategorized | Etiquetado: | Leave a Comment »

Certificação de Programador Java: Ementa da Prova

Posted by wpjr2 em abril 22, 2008

Segue abaixo a ementa da prova de certificação de programador Java. As seções em laranja indicam alguns tópicos em que o curso de programação Java aborda de uma forma superficial e a seção em vermelho indica os tópicos em que o curso não aborda. As demais seções são cobertas pelo curso.

Sun Certified Programmer for the Java Platform, Standard Edition 6 (CX-310-065)

Section 1: Declarations, Initialization and Scoping

* Develop code that declares classes (including abstract and all forms of nested classes), interfaces, and enums, and includes the appropriate use of package and import statements (including static imports).
* Develop code that declares an interface. Develop code that implements or extends one or more interfaces. Develop code that declares an abstract class. Develop code that extends an abstract class.
* Develop code that declares, initializes, and uses primitives, arrays, enums, and objects as static, instance, and local variables. Also, use legal identifiers for variable names.
* Develop code that declares both static and non-static methods, and – if appropriate – use method names that adhere to the JavaBeans naming standards. Also develop code that declares and uses a variable-length argument list.
* Given a code example, determine if a method is correctly overriding or overloading another method, and identify legal return values (including covariant returns), for the method.
* Given a set of classes and superclasses, develop constructors for one or more of the classes. Given a class declaration, determine if a default constructor will be created, and if so, determine the behavior of that constructor. Given a nested or non-nested class listing, write code to instantiate the class.

Section 2: Flow Control

* Develop code that implements an if or switch statement; and identify legal argument types for these statements.
* Develop code that implements all forms of loops and iterators, including the use of for, the enhanced for loop (for-each), do, while, labels, break, and continue; and explain the values taken by loop counter variables during and after loop execution.
* Develop code that makes use of assertions, and distinguish appropriate from inappropriate uses of assertions.
* Develop code that makes use of exceptions and exception handling clauses (try, catch, finally), and declares methods and overriding methods that throw exceptions.
* Recognize the effect of an exception arising at a specified point in a code fragment. Note that the exception may be a runtime exception, a checked exception, or an error.
* Recognize situations that will result in any of the following being thrown: ArrayIndexOutOfBoundsException,ClassCastException, IllegalArgumentException, IllegalStateException, NullPointerException, NumberFormatException, AssertionError, ExceptionInInitializerError, StackOverflowError or NoClassDefFoundError. Understand which of these are thrown by the virtual machine and recognize situations in which others should be thrown programatically.

Section 3: API Contents

* Develop code that uses the primitive wrapper classes (such as Boolean, Character, Double, Integer, etc.), and/or autoboxing & unboxing. Discuss the differences between the String, StringBuilder, and StringBuffer classes.
* Given a scenario involving navigating file systems, reading from files, writing to files, or interacting with the user, develop the correct solution using the following classes (sometimes in combination), from java.io: BufferedReader, BufferedWriter, File, FileReader, FileWriter, PrintWriter, and Console.
* Develop code that serializes and/or de-serializes objects using the following APIs from java.io: DataInputStream, DataOutputStream, FileInputStream, FileOutputStream, ObjectInputStream, ObjectOutputStream and Serializable.
* Use standard J2SE APIs in the java.text package to correctly format or parse dates, numbers, and currency values for a specific locale; and, given a scenario, determine the appropriate methods to use if you want to use the default locale or a specific locale. Describe the purpose and use of the java.util.Locale class.
* Write code that uses standard J2SE APIs in the java.util and java.util.regex packages to format or parse strings or streams. For strings, write code that uses the Pattern and Matcher classes and the String.split method. Recognize and use regular expression patterns for matching (limited to: . (dot), * (star), + (plus), ?, \d, \s, \w, [], ()). The use of *, +, and ? will be limited to greedy quantifiers, and the parenthesis operator will only be used as a grouping mechanism, not for capturing content during matching. For streams, write code using the Formatter and Scanner classes and the PrintWriter.format/printf methods. Recognize and use formatting parameters (limited to: %b, %c, %d, %f, %s) in format strings.

Section 4: Concurrency

* Write code to define, instantiate, and start new threads using both java.lang.Thread and java.lang.Runnable.
* Recognize the states in which a thread can exist, and identify ways in which a thread can transition from one state to another.
* Given a scenario, write code that makes appropriate use of object locking to protect static or instance variables from concurrent access problems.
* Given a scenario, write code that makes appropriate use of wait, notify, or notifyAll.

Section 5: OO Concepts

* Develop code that implements tight encapsulation, loose coupling, and high cohesion in classes, and describe the benefits.
* Given a scenario, develop code that demonstrates the use of polymorphism. Further, determine when casting will be necessary and recognize compiler vs. runtime errors related to object reference casting.
* Explain the effect of modifiers on inheritance with respect to constructors, instance or static variables, and instance or static methods.
* Given a scenario, develop code that declares and/or invokes overridden or overloaded methods and code that declares and/or invokes superclass, or overloaded constructors.
* Develop code that implements “is-a” and/or “has-a” relationships.

Section 6: Collections / Generics

* Given a design scenario, determine which collection classes and/or interfaces should be used to properly implement that design, including the use of the Comparable interface.
* Distinguish between correct and incorrect overrides of corresponding hashCode and equals methods, and explain the difference between == and the equals method.
* Write code that uses the generic versions of the Collections API, in particular, the Set, List, and Map interfaces and implementation classes. Recognize the limitations of the non-generic Collections API and how to refactor code to use the generic versions. Write code that uses the NavigableSet and NavigableMap interfaces.
* Develop code that makes proper use of type parameters in class/interface declarations, instance variables, method arguments, and return types; and write generic methods or methods that make use of wildcard types and understand the similarities and differences between these two approaches.
* Use capabilities in the java.util package to write code to manipulate a list by sorting, performing a binary search, or converting the list to an array. Use capabilities in the java.util package to write code to manipulate an array by sorting, performing a binary search, or converting the array to a list. Use the java.util.Comparator and java.lang.Comparable interfaces to affect the sorting of lists and arrays. Furthermore, recognize the effect of the “natural ordering” of primitive wrapper classes and java.lang.String on sorting.

Section 7: Fundamentals

* Given a code example and a scenario, write code that uses the appropriate access modifiers, package declarations, and import statements to interact with (through access or inheritance) the code in the example.
* Given an example of a class and a command-line, determine the expected runtime behavior.
* Determine the effect upon object references and primitive values when they are passed into methods that perform assignments or other modifying operations on the parameters.
* Given a code example, recognize the point at which an object becomes eligible for garbage collection, determine what is and is not guaranteed by the garbage collection system, and recognize the behaviors of the Object.finalize() method.
* Given the fully-qualified name of a class that is deployed inside and/or outside a JAR file, construct the appropriate directory structure for that class. Given a code example and a classpath, determine whether the classpath will allow the code to compile successfully.
* Write code that correctly applies the appropriate operators including assignment operators (limited to: =, +=, -=), arithmetic operators (limited to: +, -, *, /, %, ++, –), relational operators (limited to: <, <=, >, >=, ==, !=), the instanceof operator, logical operators (limited to: &, |, ^, !, &&, ||), and the conditional operator ( ? : ), to produce a desired result. Write code that determines the equality of two objects or two primitives.

Posted in Certificações, Curso de Programação Java | Etiquetado: , | Leave a Comment »

Curso de Banco de Dados e Modelagem em UML

Posted by wpjr2 em abril 22, 2008

Gostaria de compartilhar uma dúvida que recentemente respondi para um de meus alunos que acho interessante todos saberem também.

1) É interessante investir em um curso de Banco de Dados, como Oracle?

Resposta: O investimento em um curso de banco de dados vai depender da área em que vc tem interesse em trabalhar. Por exemplo, se vc tem interesse na área de DBA (Database Administration), que é diferente da área de desenvolvimento, o curso torna-se interessante. Porém se vc tiver interessada em trabalhar com desenvolvimento de sistemas, este curso não agregará tanto quanto, por exemplo, um curso de desenvolvimento de aplicações Web. O curso só faria sentido se existe um interesse bem específico na área.

2) A Eteg tem o curso de Análise de Sistema com UML, tem certificação relacionada com este curso? É interessante fazer este curso?

Resposta: O conhecimento na área de análise de sistemas com UML é um extremamente importante para o desenvolvimento de sistemas em geral. Esta área de conhecimento é o que diferencia os programadores (conhecem pouco) dos engenheiros e analistas de sistemas de software (precisam conhecer mais) e dos projetistas de software (precisam conhecer detalhadamente). Eu recomendo o curso.

Se eu estiver correto, existem duas possiveis certificações para UML. Aqui no Brasil, os profissionais têem preferido fazer a da IBM ao invés da OMG.

OMG: Object Management Group, OMG Certified UML Professional

– IBM: IBM Certified Solution Designer – Object Oriented Analysis and Design, vUML 2

Como se preparar:

Posted in Certificações, Curso de Programação Java | Etiquetado: , , | 2 Comments »

História das Linguagens de Programação

Posted by wpjr2 em abril 22, 2008

Segue abaixo um infograma interessante sobre o histórico das linguagens de programação, incluindo o Javada Sun e o C# da Microsoft.

Fonte: http://www.georgehernandez.com/h/xComputers/Programming/Media/tongues-cleaner.png

Posted in Uncategorized | Leave a Comment »

Coesão e Acoplamento

Posted by wpjr2 em abril 22, 2008

Em toda atividade de modelagem de um sistema orientado por objetos, as propriedades de coesão e acoplamento devem ser consideradas. Mas o que significa cada uma destas? Segue abaixo um resumo que descreve cada uma destas características e sua importância na modelagem de sistemas de software orientados por objetos.


Para a computação, acoplamento é o nível de inter-dependência entre os módulos de um software. O acoplamento está diretamente relacionado com a coesão, pois quanto maior for o acoplamento menor será o nível de coesão. Isto se deve ao fato de que, quando um módulo ou classe possui uma dependência muito forte por outro módulo ou classe, ele não é “forte” o suficiente para desepenhar suas tarefas de forma individual, dificultando, por exemplo, alterações no código da sua dependência (módulo ou classe de serviço).

Tipos de Acoplamento:

Conteúdo (alto): quando um módulo ou classe altera ou depende de uma funcionalidade interna de outro módulo (Ex. acessando dados locais de um módulo). Uma alteração no modulo de serviço acarretará alterações no módulo dependente.

Comum: quando dois módulos ou classes compartilham os mesmos dados globais (Ex. uma variável global). Mudanças nos recursos compiartilhados implicará mudanças em todos os módulos que os utilizam.

Externo: quando dois módulos ou classes compartilham um formato de dados externo, protoloco de comunicação ou interface de dispositivo (Ex XML, HTTP).

Controle: quando um módulo ou classe controla a lógica de outro, passando informações de que operações executar.

Selo (dados estruturados): quando módulos ou classes compartilham uma estrutura de dados composta e utilizam apenas uma parte da mesma, possivelmente partes diferentes.

Dados: quando módulos ou classes compartilham dados via parâmetros. Cada parâmetro é uma parte elementar, send esta o unico dado compartilhado entre módulos ou classes (Ex. passando um inteiro para uma função que calcula aus raiz quadrada).

Mensagem (baixa): provê a menor acoplagem onde módulos ou classes não possuem dependências entre si. Ao invés, utilizam uma interface pública para a troca de mensagens ou eventos.


A coesão é a medida da força relativa de um módulo. Quanto maior for a coesão, menor será o nível de acoplamento de um módulo. A coesão pode se definida como uma medida qualitativa que apresenta os seguintes tipos:

Acidental (pior): partes de um módulo ou classes são agrupados de forma arbitrária (aleatória), onde as partes não possuem relacionamento relacionado.

Lógica: partes de um módulo ou classes são agrupados por agrupamento lógico (fazem a mesma coisa), mesmo se estes forem diferentes por natureza (agrupamento de rotinas E/S).

Temporal: partes de um módulo ou classes são agrupados quando estes forem processados – partes são processadas em um tempo específico na execução do programa (Ex. uma função que será chamada após capturar uma exceção que fecha o arquivo, criar um log de erros e notifica o usuário).

Procedural: partes de um módulo ou classes são agrupados porque seguem uma sequência específica de execução (Ex. uma função que verifica as permissões do arquivo e após disto abre o mesmo).

Comunicação: partes de um módulo ou classes sáo agrupados porque operam sobre os mesmos dados (Ex. módulo que opera sobre o mesmo registro de informações).

Sequencial: partes de um módulo ou classes são agrupados porque a saída de uma parte é a entrada de outra parte, similar à uma linha de montagem (Ex: função que lêe os dados de um arquivo e processa os dados).
Sequential cohesion

Funcional (melhor): partes de um módulo ou classes são agrupados porque todos contribuem a uma única tarefa definida do módulo.


Ambas características são utilizadas para a medição qualitativa de um software orientado por objetos. A grande meta na modelagem de um sistema orientado a objetos é prover uma alta coesão e um baixo acoplamento, garantindo assim um software de boa qualidade e facilitando assim mudanças em suas estruturas de dados e de funcionalidades internas.

Posted in Curso de Programação Java | Etiquetado: , , , | Leave a Comment »

Qualidade de Software

Posted by wpjr2 em abril 22, 2008

Segue abaixo uma figura interessante que apresenta a qualidade de software em forma de iceberg.

Posted in Curso de Programação Java, Engenharia/Arquitetura de SW | Etiquetado: | Leave a Comment »