quarta-feira, 28 de novembro de 2007

Evento Tchelinux nesse Sábado

Nerds do Sul!

Sábado (1 de dezembro) haverá mais uma edição do Tchelinux, dessa vez em Porto Alegre.

Será um dia cheio de palestras de workshops, ao custo de 2 kilos de alimentos não pereciveis.

http://www.tchelinux.org/2007/

Inclusive eu irei ministrar uma palestra sobre AWK/SED no começo da tarde. Destaco também a palestra do Carlos Santos sobre "A História do Unix".

Enfim, um dia cheio de Ubuntu, Python, KDE, Kernel, BSD e muito mais!

Apareçam!

sábado, 17 de novembro de 2007

Analise Orientada a Objetos com Java - Parte 1

Estes dias eu me deparei com um problema bem interessante: uma forma de atribuir professores a disciplinas por meio de um sistema feito em Java.

Já aviso, estou tentando aprender e achei este exemplo interessante. Este post é uma tentativa de análise orientada à objetos feita de forma progressiva, comentários são bem vindos.

A primeira proposta foram 2 matrizes bidimensionais, uma com os professores disponíveis naquele dia e outra com as turmas, distribuidas ao longo de uma semana. Eu logo percebi que isso podia ser um problema de modelagem, pois se vc vai utilizar matrizes, paineis, interface textual ou seja lá o que for, isto é apenas uma camada - a visão. Um modelo muito mais rico pode ser criado, vejamos este exemplo em Java:

class Professor{}
class Disciplina{}
class Turma{
Disciplina disciplina;
Professor professor;
}
public class Main{
public static void main(String[] args) {
Professor oseias = new Professor();
Disciplina matematica = new Disciplina();
Turma matA = new Turma();

matA.disciplina = matematica;
matA.professor = oseias;
}
}


A minha classe Main mostra como seriam as operações sobre estas 3 classes. Basicamente eu tenho uma classe Professor, uma classe Disciplina e uma classe Turma. Se vc observarem qualquer instituição de ensino vão perceber que uma turma tem-um professor e tem-uma disciplina associados (composição).

Percebam também que eu não fui até uma escola ou universidade e fiquei horas levantando requisitos, criado diagramas uml ou documentos no word - apenas criei uma casca inicial de código (cheio de problemas por sinal). Também não me importo, ainda, com nenhum aspecto temporal. Sem falar que esta escola todos os professores podem dar qualquer disciplina - agora vamos implementar direito.

Vejamos... uma turma não troca de disciplina facilmente, mas de professor sim. Faz sentido, então, ter um setter de professor e um construtor que receba uma disciplina. Outra coisa, eu não defini nada nas outras classes, então está na hora de definir 2 atributos : id (numérico) e nome (String). Vou diferenciar os objetos pelo código, isto é, o seu id, e o nome será utilizado como descrição. Vou sobreescrever os métodos equals e toString.

Como o nome desses objetos é importante, vou coloca-los no construtor também (assim como o id).

class Professor{
long id;
private String nome;
public Professor(long id,String nome){
this.id = id;
this.nome = nome;
}
public long getId(){ return id; }
public String toString(){ return this.nome ; }
public boolean equals(Object o){
boolean test = false;

if (!(o instanceof Professor))
test = super.equals(o);
else
test = ((Professor) o).getId() == this.id;
return test;
}
}
class Disciplina{
long id;
private String nome;
public Disciplina(long id,String nome){
this.id = id;
this.nome = nome;
}
public long getId(){ return id; }
public String toString(){ return this.nome ; }
public boolean equals(Object o){
boolean test = false;

if (!(o instanceof Disciplina))
test = super.equals(o);
else
test = ((Disciplina) o).getId() == this.id;
return test;
}
}
class Turma{
long id;
private String nome;
private Disciplina disciplina;
private Professor professor;
public Turma(long id, String nome,Disciplina disciplina){
this.id = id;
this.nome = nome;
this.disciplina = disciplina;
}
public void setProfessor(Professor professor){
this.professor = professor;
}
public long getId(){ return id; }
public String toString(){
return this.nome + " [" + this.disciplina
+ "] c/ " + this.professor ;
}
public boolean equals(Object o){
boolean test = false;

if (!(o instanceof Turma))
test = super.equals(o);
else
test = ((Turma) o).getId() == this.id;
return test;
}
}
public class Main {
public static void main(String[] args) {
/* objetos bem comportados */
Professor oseias = new Professor(1L,"Oseias");
Disciplina matematica = new Disciplina(1L,"Matematica");
Turma matA = new Turma(1L,"Matematica A", matematica);
matA.setProfessor(oseias);

System.out.println("Professor " + oseias);
System.out.println("Disciplina " + matematica);
System.out.println("Turma " + matA);

/* objetos mal comportados
* Sujeitos a NullPointerException */
Professor juca = new Professor(2L,null);
Disciplina calculo = new Disciplina(2L,null);
Turma matB = new Turma(2L,"Matematica B", null);
matB.setProfessor(null); // nem precisava mas...
Turma matC = new Turma(3L,"Matematica C",calculo);
Turma matD = new Turma(4L,"Matematica D",calculo);
matD.setProfessor(juca);

System.out.println("Juca? " + juca);
System.out.println("Calculo?" + calculo);
System.out.println("matB? " + matB);
System.out.println("matC? " + matC);
System.out.println("matD? " + matD);
}
}


Mas que raios eu estou fazendo? veja a saída desse programa:

Professor  Oseias
Disciplina Matematica
Turma Matematica A [Matematica] c/ Oseias
Juca? null
Calculo?null
matB? Matematica B [null] c/ null
matC? Matematica C [null] c/ null
matD? Matematica D [null] c/ null


Qual o significado? Bom... eu tenho uma forma razoavel de representar um professor, disciplina e turma, porém não é pratico, o construtor está gigante e, em muitas situações, eu posso ter parâmetros nulos, o que pode ser uma fonte de problemas. Existem muitas formas de refatorar estas classes, eu nem toquei no HashCode, enfim, tem muito pano pra manga.

Apresento a vcs o desenvolvimento em etapas, iterativo. Eu estou chutando requisitos aos poucos, é verdade, mas eu entrego um codigo testável e completo e cada ciclo. Com os usuarios testando esse código (nesse caso, uma API, mas enfim...) eu obtenho um feedback interessante. O que vc acha?

quinta-feira, 8 de novembro de 2007

Nascimentos

Coisas maravilhosas acontecem.

Descubro recentemente que um amigo meu virou papai. A pequena Sophia nasceu prematura, logo deve estar aos cuidados da família coruja. Agora descubro que outro amigo será pai: já está na sétima semana. Eta Canoenses!

É... o tempo passa... quando estamos na faculdade descobri que um colega será pai/mãe é incomum, mas com o passar do tempo temos que escutar "e tu, pra quando vai ser?"...

Na hora certa (espero eu).

terça-feira, 6 de novembro de 2007

Ferramentas de Teste

Excelente comparativo de duas ferramentas gratuitas de teste automatizado para interfaces web.

http://mguillem.wordpress.com/2007/10/29/webtest-vs-selenium-webtest-wins-13-5/

Pelo escore final, creio que muitos projetos web poderiam ser beneficiados pela combinação destas duas ferramentas.

From Nand to Tetris in 12 Steps

Otimo vídeo - Google Tech Talks October 10 ,2007


Link direto aqui.