Si può compilare con il tasto run oppure con “java HelloWorld.java” (compilazione), in questo caso il compilatore genera il corrispondente file eseguibile chiamato “HelloWorld.class”, e poi se non ci sono errori posso scrivere “java HelloWorld” (esecuzione).

SPIEGAZIONE CODICE

import java.time.LocalDate;
 
public class HelloWorld {
    private static int valore = 0;
    private int contatore;
    private String saluto="Ciao";
    private static LocalDate data= LocalDate.now();
 
    public static void main(String[] args){
        System.out.println("Hello World.");
 
        HelloWorld h=new HelloWorld();
        h.stampe();
    }
 
    private void stampe(){
        valore++;
        System.out.println(data);
        IO.println("ciao ciao");
        IO.println("valore : " +valore);
        System.out.println(saluto + ", Ingegneria del software.");
        contatore++;
        System.out.println("contatore: " +contatore);
       /**  HelloWorld hello;
        *hello= new HelloWorld(); lo tolgo perchè l'ho creato nel main
        *hello.contatore++;
        *System.out.println("contatore: " +hello.contatore);
        *HelloWorld hello1;
        *hello1= new HelloWorld();
        *System.out.println(hello1.contatore);
        */
    }
}
 
System.out.println("Hello World."); serve per stampare qualcosa
  • se scrivo sout mi spunta sotto il suggerimento per System.out.println().

Questa è una chiamata al metodo println che viene formata attraverso l’istanza di out

Un altro modo per stampare è:

 IO.println("ciao ciao");

La parola static nel main in dica che il metodo vive all’interno della classe, quando metodi o attributi sono static operiamo direttamente nella classe, non c’è bisogno di istanziare la classe ma operiamo con essa.

per dichiarare un valore:

private static int valore=0;
  • private è la visibilità della variabile per le altre classi
  • static indica che il la variabile vive dentro la classe

fin quando non uso la variabile creata spunta sottolineata.

IO.println("valore : "+valore);
  • Con alcuni editor può essere mostrata parte di testo in grigio che non abbiamo scritto, come in System.out.printl(x: ) in cui la x non è effettivamente presente nel codice ma è un suggerimento, viene scritto automaticamente, se apro il file con un editor differente non lo vedrò scritto.

Posso anche dichiarare una variabile senza usare static. ES: private int contatore;

ma se provo ad utilizzarlo dentro al main spunterà sottolineato in rosso come un errore perchè non possiamo usare una variabile non static all’interno dell’ambiente main che è static. Se lo voglio utilizzare devo creare l’istanza e inizializzarla in questo modo:

HelloWorld hello;
hello= new HelloWorld();

per richiamare la variabile dopo aver creato l’istanza scrivo:

  hello.contatore++;

devo mettere sempre “hello.” davanti alla variabile (in questo caso contatore) per utilizzarla:

 System.out.println("contatore: " +hello.contatore);

se parto da un’istanza e da quella prendo un attributo che è dentro la classe, quindi static, accedo all’unico contenuto che è dentro la classe non viene duplicato. Quindi non spunta un errore se scriviamo (ES. hello.valore) ma non è corretto.

CREAZIONE ISTANZA

La variabile chiamata “hello” punta alla parte di memoria in cui è stata creata, nell’istanza creata troveremo la variabile. In un’altra parte di memoria riservata alla classe HelloWorld troviamo valore.

Hello = new HelloWorld() (nella prima riga dell’immagine sopra)

HelloWorld hello1;
hello1=hello;
System.out.println(hello1.contatore);

in hello1 ricopiamo “il puntatore” che avevamo in hello, puntano alla stessa parte di memoria (stessa classe)

se invece scrivo:

HelloWorld hello1;
hello1= new HelloWorld();
System.out.println(hello1.contatore);

si crea un nuovo spazio di memoria (nuova istanza della stessa classe, come se fosse una copia)

  • Le variabili di tipo numerico non inizializzate valgono 0.

Se creo un’altro metodo deve essere poi richiamato nel main, ma si deve sempre creare un’istanza per il metodo.

 HelloWorld h=new HelloWorld();
 h.stampe();

se abbiamo più parametri possiamo concatenarli tra di loro in println() tramite il +

private String saluto="Ciao";
System.out.println(saluto + ", Ingegneria del software.");

Se usiamo dei tipi primitivi (int,float,double,char…) iniziano con la lettera minuscola mentre ad esempio altri come String che in realtà è una classe inizia con la maiuscola, questo serve per distinguere classi (che forniscono dei tipi) da tipi primitivi.

DATA E IMPORT

 private static LocalDate data= LocalDate.now();

serve per stampare la data, in alto troveremo: import java.time.LocalDate; serve per comunicare al compilatore dove si trova la classe LocalDate.

  • import indica la posizione. (in base all’editor import viene aggiunto direttamente). Indica dove trovare la definizione di una classe che sarà usata nel seguito

import indica dove andare a cercare nelle cartelle, → dentro java → dentro time → prendi LocalDate

Perchè si deve scrivere import per LocalDate ma non per IO, System e String se sono anche queste delle classi?

Per convenzione, tutti i tipi definiti nelle librerie standard di java (java.lang) non devono essere specificate con import, LocalDate non fa parte di quella libreria quindi si deve specificare.

se scrivo import java.time.*; significa che posso usare tutto quello che c’è nella cartella:

se non uso * importo il tipo specifico.

All’esame se non si ricorda import non è un problema!!!

“@param args” sono i parametri passati al main all’avvio della classe.

I commenti conviene scriverli fuori dai metodi come “descrizione”, quindi conviene scriverli prima di classi e metodi.

SINTASSI UML

UML: descrive il sistema software di ciò che si sta sviluppando, viene utilizzato per descrivere delle classi, relazioni tra di esse. Viene raffigurato come un rettangolo.

I simboli sono:

  • ” - ” ” + ” e ” ” (asterisco) per indicare la visibilità delle variabili, - indica private, + indica public e indica protected
  • La sottolineatura indica se una variabile è static

Abbiamo quindi il nome della classe in alto, poi le variabili e il tipo e infine i metodi con i loro eventuali parametri e i tipi di ritorno Ad esempio qui abbiamo: La classe HelloWorld e i suoi attributi sono: msg che è private è di tipo string ed è static, abbiamo anche d che è private e di tipo LocalDate ma non è static I metodi invece sono il main che è static e public e printDate che è private

Quando ho un diagramma UML ciò che non è presente nel diagramma, non significa che non esiste ma semplicemente che non è stato espresso all’interno di esso.

  • final definisce un campo o una variabile che non può essere assegnata più di una volta (una costante). Una classe final non può essere ereditata, un metodo final non può essere ridefinito (override).
  • new permette di creare un’istanza di una classe.
  • static è usata per dichiarare un campo o un metodo appartenente alla classe (e non all’istanza).

CARATTERISTICHE DEL SOFTWARE

Ha delle caratteristiche particolari:

  • È modificabile perchè non ha parti fisiche (non è costituito da atomi). Posso prendere il codice sorgente e modificare nomi di variabili ecc… ma anche modificare il codice eseguibile.

Se un software è di successo può esserci la necessità di modificarlo:

  • Per adattarlo ad una realtà che cambia (mutate esigenze).
  • Le richieste di estensione aumentano al crescere del successo.

Il sistema software sopravvive all’hardware, perché l’hardware può essere sostituito ma il software può essere comunque eseguito.

Il software quindi è modificabile e manutenibile. La manutenibilità è diversa dalla modificabilità.

QUALITÀ DEL SOFTWARE

Per valutare la qualità:

  • Correttezza: il sistema software aderisce allo scopo ed è conforme alle specifiche (requisiti). Documento dei requisiti scritto correttamente.
  • Efficienza: nessuno spreco di memoria e risorse (RAM e processore).
  • Manutenibilità: facilità a introdurre modifiche (poco spreco di risorse e tempo, si aumenta l’efficienza).

Modificare il software è proprio uno degli obiettivi principali quando si parla di grandi software, se si produce una versione non modificabile perchè c’è una bassa manutenibilità è un problema, si deve rifare.

Come lo rendo manutenibile se non so cosa modificherò in seguito? La risposta è design Pattern (soluzioni collaudate per riusabilità).

  • Dependability (Affidabilità e sicurezza): sicurezza (security, difesa dei dati; e safety, difesa del sistema e delle persone) e affidabilità (reliability, probabilità di operare senza guasti). Può eseguire per tanto tempo senza errori, più è il tempo più è affidabile. Ci sono delle misure che stabiliscono l’affidabilità.
  • La sicurezza è data da due fattori : Safety e Security. Hanno un significato diverso:
  1. SECURITY: capacità di proteggere i dati e non perderli.
  2. SAFETY: in termini di sicurezza/salute delle persone. Non mette in pericolo la vita delle persone.
  • Usabilità: capacità di fornire all’utente condizioni di uso efficaci. Permette all’utente di operare in modo facile rispetto a quello che deve fare.

Sistema software corretto

Un sistema software da risultati corretti se soddisfa le specifiche o requisiti richiesti. Per sapere se li soddisfa si fanno dei test. Si esegue e si valutano i risultati, se uguali a quelli dei requisiti allora il sistema si comporta in modo corretto (Domanda esame: come verifico se un sistema software è corretto?).

Per essere corretto si deve verificare non solo se rispetta i requisiti ma anche se è corretto per il cliente.