Progettazione di un contatore
Specifiche: Realizzazione di una classe come ADT che funga da contatore: scrivere inoltre un breve
programma che ne illustri i metodi ed il funzionamento. Non ci sono vincoli sui metodi da
implementare e sul loro funzionamento.
Indice
Discussione del codice
Listato di Counter.java
Listato di Example.java
Generazione del bytecode
Esecuzione
Documentazione
Strumenti
Autore
Discussione del codice
Counter.java
Il progetto parte dall’idea che un oggetto di questo tipo debba necessariamente implementare alcune
funzioni. Un contatore deve poter essere incrementato, decrementato, resettato e deve poter
restituire il proprio valore.
Mi sono preoccupato quindi di estendere le funzionalità sopra elencate. Per esempio potere settare
un valore qualsiasi nel contatore: questo compito è delegato alla funzione setValue.
Un discorso analogo si può effettuare per l’incremento ed il decremento: per questo ho sottoposto
ad overload i relativi metodi . Inoltre il metodo setStep permette di settare un valore di passo per
l’incremento. Ho previsto anche la possibilità di utilizzare dei limiti di conteggio: le funzioni
coinvolte in questo processo sono setMinOn, setMaxOn, setMin e setMax. Le prime si occupano
dell’attivazione/disattivazione dei limiti che per default sono off. Le ultime invece impostano i
limiti veri e propri. Le funzioni di conteggio sono state quindi adattate per consentire il
riconoscimento di questi limiti.
Siccome spesso è utile poter confrontare il valore del contatore con quello di un altro ho ritenuto
necessario implementare dei metodi relativi all’algebra relazionale: in particolare si occupano di
questo compito le funzioni equalTo, greaterThan e lessThan.
Tutti i metodi implementati sono stati resi accessibili al cliente in quanto pubblici. Le variabili
coinvolte nei vari processi sono private e quindi non accessibili direttamente.
Example.java
La classe Example è un breve programma di testing sul funzionamento del contatore: caratteristica
fondamentale è la presenza del metodo main, nel cui corpo sono incluse le vere e proprie “azioni”
del programma.
Listato dell’oggetto Counter.java:
/**
* Counter.java
* Created on 28 aprile 2001
*
* @author Luca Gardelli
* @version 1.0
*
* A Counter is an objects that counts integer values:
* it provides methods to be incremented, to be decremented, to be reset,
* to retrieve its value, to set its value
*/
public class Counter {
//public stuff
/**
* Constructs a counter with default values.
* High and low threshold aren't active.
*/
public Counter() {
value=0;
step=1;
maxon=false;
minon=false;
}
/**
* Constructs a counter based on k and m parameters.
* High and low threshold aren't active.
* @param k - value amount
* @param m - step amount
*/
public Counter(int k, int m) {
value=k;
step=m;
maxon=false;
minon=false;
}
/**
* Checks boundary constraint (if on) and then
* increments the counter value of k.
* @param k - increment amount
*/
public void inc(int k) {
if(maxon) {
if (value + k <max)
value += k;
}
else value += k;
}
/**
* Checks boundary constraint (if on) and then increments
* the counter value of a step.
*/
public void inc() {
if(maxon) {
if(value+step<max)
value += step;
}
else value += step;
}
/**
* Checks boundary constraint (if on) and then
* decrements the counter value of k.
* @param k - decrement amount
*/
public void dec(int k) {
if(minon) {
if (value-k>min)
value -= k;
}
else value -=k;
}
/**
* Checks boundary constraint (if on) and then
* decrements the counter value of a step.
*/
public void dec() {
if(minon) {
if (value-step>min)
value -= step;
}
else value -= step;
}
/**
* Retrieves the counter value.
*/
public int getValue() {
return value;
}
/**
* Sets the counter value to k.
* @param k - value amount
*/
public void setValue(int k) {
value=k;
}
/**
* Sets the counter value to zero.
*/
public void reset() {
value=0;
}
/**
* Sets the counter step.
* @param k - step amount
*/
public void setStep(int k) {
step=k;
}
/**
* Sets min value assignable to the counter value.
* @param k - low threshold amount
*/
public void setMin(int k) {
min=k;
}
/**
* Sets max value assignable to the counter value.
* @param k - high threshold amount
*/
public void setMax(int k) {
max=k;
}
/**
* Activates/Deactivates low threshold.
*/
public void setMinOn() {
minon = !minon;
}
/**
* Activates/Deactivates high threshold.
*/
public void setMaxOn() {
maxon = !maxon;
}
/**
* Returns true if two counter have the same value.
* @param k - Counter object
*/
public boolean equalTo(Counter k) {
return value == k.value;
}
/**
* Returns true if our counter value is greater than the parameter one.
* @param k - Counter object
*/
public boolean greaterThan(Counter k) {
return value > k.value;
}
/**
* Returns true if our counter value is less than the parameter one.
* @param k - Counter object
*/
public boolean lessThan(Counter k) {
return value < k.value;
}
//private stuff
private int value,step,min,max;
private boolean minon,maxon;
}
Listato dell’oggetto Example.java:
/**
* Example.java
* Created on 28 aprile 2001
*
* @author Luca Gardelli
* @version 1.0
*
* Shows how to use Counter.class
*/
public class Example {
public static void main(String[] argv) {
Counter c1= new Counter();
Counter c2= new Counter(4,2);
c1.inc();
c2.inc();
System.out.println("c1 = " + c1.getValue());
System.out.println("c2 = " + c2.getValue());
System.out.println("c2 = c1 ? " + c1.equalTo(c2));
c2.inc(3);
c1.setStep(5);
c1.inc();
System.out.println("c2 < c1 ? " + c2.lessThan(c1));
c2.reset();
c2.setMinOn();
c2.setMin(0);
System.out.println("c2 = " + c2.getValue() + " Low threshold active- min=0");
c2.dec(20);
System.out.println("c2 = " + c2.getValue());
}
}
Generazione del bytecode
Il java come soluzione alla portabilità dei programmi utilizza una forma intermedia rispetto ai
linguaggi interpretati e quelli compilati (eseguibili). Il compilatore java trasforma il sorgente (.java)
nel bytecode, che non è esattamente un eseguibile ma nemmeno il sorgente stesso. Il file generato
(.class) viene eseguito dal macchina virtuale java.
Per generare il codice nel bytecode ho utilizzato il comando Javac con i seguenti parametri:
Javac Example.java Counter.java
Esecuzione
Per eseguire il bytecode il JDK della Sun mette a disposizione il comando Java. La riga di comando
utilizzata è:
Java Example
L’esecuzione del programma ha prodotto come output le seguenti linee:
c1 = 1
c2 = 6
c2 = c1 ? false
c2 < c1 ? false
c2 = 0 Low threshold Active – min=0
c2 = 0
Documentazione
Il JDK della Sun mette a disposizione un comando per la generazione di documentazione, a partire
dai commenti inseriti nel sorgente. Di particolare rilievo le linee @author, @version, @param che
permettono rispettivamente di mettere in evidenza l’autore del codice, la versione della classe e i
parametri passati ai metodi.
Dalla riga di comando si può quindi generare la documentazione con la linea:
Javadoc Example.java Counter.java –author -version
Nota I comandi Java, Javac e Javadoc sono stati utilizzati nella maniera sopra descritta in quanto
le due classi non fanno parte di un package specifico.
I parametri –author e –version sono necessaria a javadoc per tradurre correttamente rispettivamente
i tags @author e @version
Strumenti
Per la realizzazione di questo progetto mi sono avvalso di Forte for Java CE per la stesura del
codice e di Java 2 SDK per la generazione del bytecode e della documentazione. Tutti i file di
progetto, bytecode e di documentazione sono presenti all’interno della directory data.
Autore
Realizzato da Luca Gardelli studente al II anno del DU di Ingegneria Informatica sede di Cesena.
Indirizzo e-mail: [email protected]