Escolar Documentos
Profissional Documentos
Cultura Documentos
Discentes:
Luís André Marreiros Silva nº21907478
Nelson Filipe Paulos Moreira nº21901240
Docente:
Prof. Doutor Tiago Candeias
ÍNDICE..........................................................................................................................2
INTRODUÇÃO..............................................................................................................4
Programação Orientada a Objetos ............................................................................5
DESENVOLVIMENTO ..................................................................................................8
Classe Centroid .........................................................................................................9
TESTES ......................................................................................................................13
REFERÊNCIAS ..........................................................................................................16
2
ÍNDICE DE FIGURAS
3
INTRODUÇÃO
1
Em geometria, o centroide (pré-AO 1990: centróide) é o ponto associado a uma forma
geométrica também conhecida como centro geométrico. Caso a forma geométrica represente
uma seção homogênea de um corpo, então o centroide coincide com o centro de massa. [2]
4
O desenvolvimento do trabalho prático conta com a imposição dos seguintes
requisitos:
• Realizar o planeamento através do desenho do diagrama de classes UML que
identifica as classes do problema e da solução;
• Utilizar os princípios e técnicas estudadas sobre programação orientada a
objetos, identificando e implementando classes coesas;
• Seguir uma metodologia de desenvolvimento baseado em testes (TDD – Test
Driven Development);
• Considerar a utilização de classes invariantes e de exceções.
5
ANÁLISE INICIAL
Classe POI
Rapidamente verificámos a necessidade de um método para o cálculo do centroide
através dos pontos fornecidos no input. Esse método retornaria um objeto Point
composto pelas coordenadas cartesianas X e Y do centroide.
Classe Client
Na nossa análise compreendemos que o termo cliente se refere a qualquer entidade
que requer um serviço de outra entidade. O cliente não se importa como a entidade
fornece o serviço, apenas que o forneça. Por assim ser, a classe Client processaria o
input, criaria um Objeto POI composto por centroides e após chamada do método
“solve()” trataria de resolver o input.
2
Em ciência da computação, boolean é um tipo de dado primitivo que possui dois valores, que
podem ser considerados como 0 ou 1, falso ou verdadeiro. [3]
6
A figura abaixo representa o diagrama UML inicial, a nossa primeira análise das
classes/estruturas. Esta apresenta bastantes diferenças em relação ao diagrama UML
final que está disponibilizado mais à frente neste relatório.
7
DESENVOLVIMENTO
8
Classe Centroid
Desenvolvemos a classe Centroid à qual anteriormente tínhamos dado o nome de
Container por ser um objeto que alberga dois argumentos. Um objeto Centroid é
composto por um ponto e um instante. Este ponto representa as coordenadas
cartesianas x e y num mapa bidimensional num determinado instante.
Classe POI
De acordo com a análise inicial houve a necessidade da criação da classe POI.
Esta classe é responsável por grande parte do tratamento da resolução do problema.
Um objeto POI é composto por ArrayList de Centroides. A classe POI conta com classes
tais como:
• findCentroid() – responsável pelo cálculo do centroide num determinado
instante;
• uniqueTime() – método que através de um iterador e uma estrutura de controlo
condicional, percorre todos os centroides do ArrayList de Centroides e filtra os
tempos únicos. Este método foi implementado para reforçar a generalização da
classe, desta forma o programa lê funcionar com qualquer instante(ex.:
0,1,2,3,10,...).
• pointsAtTime() – método que com um instante como argumento de entrada,
devolve um ArrayList de pontos nesse determinado instante. Este método, à
semelhança do método anterior, faz recurso de um iterador e uma estrutura de
controlo condicional para atingir o objetivo.
Classe Circle
De acordo com o mencionado anteriormente neste relatório, esta classe estende a
classe abstrata Shape, nesta classe implementámos todos os métodos impostos pela
mesma. Estes são:
• isInside() – Este método verifica se um ponto passado como argumento se
encontra dentro do objeto Circle. Esta verificação é feita através de uma
estrutura de controlo condicional “if”, que com recurso ao método “dist()” da
classe Point verifica se a distância entre o ponto de argumento e o centro do
objeto Circle é menor que o raio do mesmo ou não.
• solver() – Este método foi implementado para calcular o raio do objeto Circle
em que se encontrem pelo menos 70% dos pontos. Esta função aceita um
9
objeto Point e um instante como argumento. Este método recursivo verifica
através de uma estrutura de controlo condicional “if” se a percentagem de
pontos dentro do objeto Square é superior a 70% com recurso ao método
“percentageInside()” da classe hierárquica Shape, que por sua vez faz recurso
ao método “isInside()”, criando assim uma interdependência dos mesmos. O
raio do objeto Circle é aumentado até que a percentagem seja igual ou
superior a 70%; retorna o raio.
• calculateArea() – Método que calcula a área do Círculo.
Classe Square
À semelhança da classe Circle, esta classe estende a classe abstrata Shape, nesta
classe implementámos todos os métodos impostos pela class Shape, assim como
métodos necessários no alcance da solução. Estes são:
• topRightCorn() – Implementámos este método para calcular o ponto superior
direito do objeto Square;
• botLeftCorn() – À semelhança do anterior, este método foi implementado para
calcular o ponto inferior esquerdo do objeto;
• isInside() – Este método booleano verifica se um ponto passado como
argumento se encontra dentro do objeto Square. Esta verificação é feita
através de uma estrutura de controlo condicional “if” que com recurso aos
métodos “topRightCorn()” e “botLeftCorn()” verifica se a coordenadas do ponto
passado como argumento se encontram dentro do objeto Square.
• solver() – à semelhança da classe Circle, este método aceita um objeto Point e
um instante como argumento. Este método recursivo verifica através de uma
estrutura de controlo condicional “if” se a percentagem de pontos dentro do
objeto Square é superior a 70% com recurso ao método “percentageInside()”
da classe hierárquica Shape, que por sua vez faz recurso ao método
“isInside()”, criando assim uma interdependência dos mesmos. O raio do objeto
Square é aumentado até que a percentagem seja igual ou superior a 70%;
retorna o raio.
Classe Shape
Implementámos a classe abstrata Shape para que o nosso programa possa operar de
forma generalizada, desta forma esta classe engloba as classes Circle e Square. No
futuro poderá englobar qualquer outra forma geométrica desde que a mesma
10
implemente os métodos obrigatórios “calculateArea” e “isInside”, este último
imprescindível na solução do trabalho prático. Esta classe abstrata conta com os
seguinte método comum a ambas as classes que extendem esta classe:
• percentageInside() – este método recebe uma lista de pontos, percorre todos
os elementos e com recurso a um iterador e uma estrutura de controlo
condicional, calcula a percentagem de pontos dentro do objeto Circle.
Inicialmente este método e o método “isInside()” eram um só. Posteriormente
achámos necessário a separação de ambos pois o método “isInside()” deu
bastante jeito na verificação de determinados pontos durante esta fase de
desenvolvimento.
Classe Client
Foi implementada uma estrutura de controlo “for” para o processamento do input. A
leitura do input foi feita da seguinte forma:
1. Leitura do número de pontos;
2. Leitura das coordenadas X e Y, e o tempo;
3. Criação de um objeto Point com as coordenadas X e Y;
4. Criação de um objeto centroide composto pelo ponto criado e o tempo;
5. Adição do centroide a um ArrayList de objetos.
Criámos um objeto POI composto pelo ArrayList de centroides e uma lista de números
inteiros que com recurso ao método “uniqueTime()” guarda todos os instantes únicos
de tempo.
Através de um iterador percorremos cada instante e para cada, corremos o método
solver no nosso objeto Circle ou Square, e imprimimos o valor do centroide.
11
Após o desenvolvimento do programa e com recurso ao plugin UML do IDE IntelliJ,
gerámos o diagrama UML da figura abaixo.
12
TESTES
13
CONSIDERAÇÕES FINAIS
14
Tendo o TDD como requisito na elaboração da solução, tivemos em conta a
necessidade de criar testes para cada método e verificar a correta operabilidade dos
mesmos, antes de avançar com o desenvolvimento de outros. No entanto a alteração
constante da estrutura de desenvolvimento das classes e métodos e da
interdependência dos mesmos dificultou e atrasou bastante o desenvolvimento da
solução. Situações como a imagem abaixo, em que um teste do isInside() da classe
Square com AssertTrue ou AssertFalse davam erro, sendo que quando corríamos esse
mesmo comando na classe Client corria sem problemas.
15
REFERÊNCIAS
16