PDA

View Full Version : [Java] Consigli per primo progetto


pag65
13-01-2009, 15:40
ciao a tutti

sto lavorando al mio primo progetto in Java,
è solo da circa 2 mesi che seguo il linguaggio.

il progetto riguarda la programmazione di un software che organizzi le pubblicazioni di una Unversità:

"Il gruppo deve implementare un software perla gestione di pubblicazioni scientifiche.
Le pubblicazioni (Publication) possono essere dei seguenti tipi:
● Slide
● Paper, che può essere dei seguenti tipi:
---● Conference Paper
---● Journal Article
---● Workshop Paper
---● Technical Report
● Journal
● Poster
● Book Chapter
● Book
● Thesis.

Ogni pubblicazione ha uno o più autori (Author), che possono essere dei seguentitipi:
● Graduated Student
● PhD
● Researcher
● Assistant Professor
● Professor

Le funzionalità da implementare obbligatoriamente, tramite opportune API, sono le
seguenti:
● Ricerca degli autori di una pubblicazione
● Ricerca di tutte le pubblicazioni di un certo autore
● Ricerca di tutti i co-autori di un certo autore (un co autore è qualcuno che ha
almeno una pubblicazione scritta insieme all'autore)
● Ricerca di tutte le pubblicazioni di un certo anno
● Ricerca di tutte le pubblicazioni di un certo autore in un certo anno"



il mio primo problema è quello di creare una struttura delle classi e soprattutto le sottoclassi.
pensavo di salvare i dati in un file .txt visto che i database non sono permessi.
e poi sfruttare i metodi di ricerca a partire dal file .txt

naturalmente non vi chiedo di scrivere il codice, anche perché non imparerei niente :D, ma di darmi qualche dritta su come impostare il lavoro.

Grazie anticipatamente

gokan
13-01-2009, 17:05
Ciao, IMHO, creare un'applicazione del genere senza usare un database è veramente una cavolata. :)

Detto questo, per la parte di progettazione ti consiglio di seguire proprio quello che hai scritto.

Un esempio:
Sicuramente ci sarà una classe Pubblicazione, che magari è astratta e da cui tutti i vari tipi di Pubblicazioni estendono.
Se ha detto che ogni pubblicazione è composta da uno o più autori, potresti pensare che ad una lista di autori...quindi:

abstract class Pubblicazione{

private List<Autore> autori;
...
}

class Autore{
....
}


Questo è ovviamente solo un esempio. Comincia a scrivere qualcosa che somigli ad UML su carta e poi cerca di portare tutto in java.
Prima però considera quali possono essere tutti i protagonisti della tua applicazione e a come possono collaborare l'uno con l'altro.

Ciao

pag65
13-01-2009, 17:24
Prima di tutto ti ringrazio di avermi risposto e dell'aiuto che mi hai dato, comunque i miei problemi principali sono quelli di non sapere come importare nel programma java dei file di tipo txt quindi di poter aggiungere tutti i relativi attributi della pubblicazione (quindi associandola ad autori e a la sua appropriata categoria). Magari utilizzando API di cui al momento ignoro l'esistenza.

gokan
13-01-2009, 17:35
Se proprio devi salvare su file, potresti scegliere di utilizzare file csv oppure excel e magari scaricare ed usare qualche libreria che ti semplifichi la cosa.
Un'altra soluzione e scriversi a manina tutto utilizzando le API di java usando quindi la classe File e tutto il cucuzzaro di api java.
Io opterei per la prima se proprio vuoi scrivere su file piuttosto che usare un db.

pag65
13-01-2009, 17:42
il mio problema è come far recuperare al prog i dati da un txt,
così li ci scrivo le varie pubblicazioni con anno, autori, ecc...
poi queste pubblicazioni devono essere recuperate dal prog per poi chiamare i metodi di ricerca.
mi era stato proposto come esempio di simulare il codice xml, ossia utilizzando tag, identificatori per poter far capire al programma come etichettare l'elemento tra i tag, è una buona idea?

gokan
13-01-2009, 17:51
Si, utilizzare file xml non è una cattiva soluzione. Potrebbe esserti utile la libreria JDom.

Ad ogni modo, non ti fossilizzare su questo problema. Se pensi bene tutta l'architettura del tuo progetto, il problema di come salvare su file o recuperare informazioni è secondario.

pag65
13-01-2009, 18:00
allora vediamo:

abstract class Pubblicazione{

private List<Autore> autori;
private String tipo;
private int anno;
...
}

class Autore{
//potrei creare un array di autori in modo da assegnare una posizione per ogni autore
}

sono proprio alle prime armi con il java :muro: :D

Don[ITA]
13-01-2009, 18:45
Non c'è bisogno ne di usare un txt ne un db :D
Se i file li devi salvare in locale, usando i suggerimenti di gokan, ovvero di Pubblicazione come classe astratta, ti potresti mettere tutte le pubblicazioni che hai in una collezione (tipo ArrayList) e poi salvare direttamente la collezione come oggetto.
Ad esempio:

ArrayList<Pubblicazione> pub = new ArrayList<Pubblicazione>();
...riempi pub...
ObjectOutputStream o_out = new ObjectOutputStream(new FileOutputStream(nomeFile));
o_out.writeObject(pub);
o_out.close();

E per leggerlo:

ObjectInputStream o_in = new ObjectInputStream(new FileInputStream(nomeFile));
ArrayList<Pubblicazione> pub_salvate = (ArrayList<Pubblicazione>)o_in.readObject();
o_in.close();

Spero ti possa servire :D

Saluti

pag65
13-01-2009, 19:16
mi sto incastrando il cervello...
non riesco nemmeno a creare le classi...:muro:

come posso dividere le varie tipologie di un autore?
e come posso legare autori e pubblicazioni?

Don[ITA]
13-01-2009, 21:27
public abstract class Pubblicazione {

private ArrayList<Autore> autori;

..bla..bla..bla...

}

public abstract class Autore {

...bla...bla...bla...

}

public class Slide extends Pubblicazione {

...bla...bla...bla...

}

public class GraduatedStudent extends Autore {

...bla...bla...bla...

}

Più o meno qualcosa del genere ;)

Saluti

vincejin
14-01-2009, 11:26
Ciao..
Ti dico la verità...
Da come è scritta la traccia.. (tutte quelle estensioni)
Sembra che vogliano farti fare un DB infatti con un modello Entità-Relazione semplice sbrogli il tutto...
Altrimenti se lo vuoi fare con LinkedList
Fatti la classe pubblicazione e tutte le altre la estenderanno
Attenzione tieniti il + generale possibile cioè fai LinkedList<Pubblicazione> e poi usa instanceof per gestire i casi

Ti consiglierei di disaccoppiare il progetto in package

CommonClasses (contiene pubblicazione e figli)
GestioneDati (contiene una classe Struttura dati che gestisce le pubblicazioni)
Actor( che contiene due classi : Client e Admin)
Client ricerca le pubblicazioni
Admin aggiunge pubblicazioni alla struttura dati (una volta che ti metti a fare una cosa falla bene , è bruttino caricare le pubblicazioni da txt )
GUI (per le interfacce grafiche)

Attenzione fai in modo che tutte le classi che usi implementano serializable così puoi salvarle su disco)
Nel caso vuoi usare il db resta tutto identico tranne che al posto della classe StrutturaDati ti fai un DB managere che accede al DB

Mamma come mi piace Java :sofico:

pag65
16-01-2009, 14:41
Ciao..
Ti dico la verità...
Da come è scritta la traccia.. (tutte quelle estensioni)
Sembra che vogliano farti fare un DB infatti con un modello Entità-Relazione semplice sbrogli il tutto...
Altrimenti se lo vuoi fare con LinkedList
Fatti la classe pubblicazione e tutte le altre la estenderanno
Attenzione tieniti il + generale possibile cioè fai LinkedList<Pubblicazione> e poi usa instanceof per gestire i casi

Ti consiglierei di disaccoppiare il progetto in package

CommonClasses (contiene pubblicazione e figli)
GestioneDati (contiene una classe Struttura dati che gestisce le pubblicazioni)
Actor( che contiene due classi : Client e Admin)
Client ricerca le pubblicazioni
Admin aggiunge pubblicazioni alla struttura dati (una volta che ti metti a fare una cosa falla bene , è bruttino caricare le pubblicazioni da txt )
GUI (per le interfacce grafiche)

Attenzione fai in modo che tutte le classi che usi implementano serializable così puoi salvarle su disco)
Nel caso vuoi usare il db resta tutto identico tranne che al posto della classe StrutturaDati ti fai un DB managere che accede al DB

Mamma come mi piace Java :sofico:

classi (almeno alcune) e package creati...
adesso per inserire qualche esempio di pubblicazione come faccio?



la mia classe Autore si presenta cosi:

package Actor;

import java.util.ArrayList;

public class Autore {

public static void main(String[] args){
ArrayList<String> list=new ArrayList<String>();
list.add("Mario");
list.add("Pippo");
list.add("Peppe");

}

}

adesso devo creare anche un arraylist per le pubblicazioni?
come faccio ad associare ogni pubblicazione al proprio\propri autore\i?

Don[ITA]
16-01-2009, 15:50
Errore :)
Le tue classi devono rappresentare un'astrazione della realtà.
In questo caso ad esempio, Autore non deve contenere ne main ne tantomeno un ArrayList di autori, ma dovrà contenere chennesò nome, cognome, un identificativo, ecc ecc e dei metodi comuni a tutti gli autori (magari getNome() ecc).
In uguale maniera anche la tua classe Pubblicazione dovrà rappresentare quella che, a tutti gli effetti, è una pubblicazione reale. Quindi dovrà contenere ad esempio la lista degli autori, il testo della pubblicazione, la data di creazione ecc ecc (con relativi metodi ecc ecc).
Una volta create queste classi che ti rappresentano quello che ti serve, le puoi estendere creando delle classi specifiche che rappresentano ad esempio una Slide, un Journal, un Researcher o un Professor. Queste specializzazioni conterranno qualcosa di unico e utile per loro. Ad esempio una Slide potrebbe contenere un riferimento alla slide successiva e precedente, o un Professor potrebbe conenere il suo titolo di studio piuttosto che il dipartimento in cui lavora ecc ecc.
Una volta create tutte le classi che ti interessano le usi come ti pare.
Ma ricordati che la classe Pubblicazione o Autore sono solo delle astrazioni delle loro controparti reali. Non vederle dal punto di vista prettamente della programmazione ;)

Saluti

pag65
16-01-2009, 16:53
;25875251']Errore :)
Le tue classi devono rappresentare un'astrazione della realtà.
In questo caso ad esempio, Autore non deve contenere ne main ne tantomeno un ArrayList di autori, ma dovrà contenere chennesò nome, cognome, un identificativo, ecc ecc e dei metodi comuni a tutti gli autori (magari getNome() ecc).
In uguale maniera anche la tua classe Pubblicazione dovrà rappresentare quella che, a tutti gli effetti, è una pubblicazione reale. Quindi dovrà contenere ad esempio la lista degli autori, il testo della pubblicazione, la data di creazione ecc ecc (con relativi metodi ecc ecc).
Una volta create queste classi che ti rappresentano quello che ti serve, le puoi estendere creando delle classi specifiche che rappresentano ad esempio una Slide, un Journal, un Researcher o un Professor. Queste specializzazioni conterranno qualcosa di unico e utile per loro. Ad esempio una Slide potrebbe contenere un riferimento alla slide successiva e precedente, o un Professor potrebbe conenere il suo titolo di studio piuttosto che il dipartimento in cui lavora ecc ecc.
Una volta create tutte le classi che ti interessano le usi come ti pare.
Ma ricordati che la classe Pubblicazione o Autore sono solo delle astrazioni delle loro controparti reali. Non vederle dal punto di vista prettamente della programmazione ;)

Saluti

capito, una cosa semplice quindi:

package Actor;

import java.util.ArrayList;

public abstract class Autore {

public String nome;
public String cognome;
public String ideNum;

getNome....

getCognome...

getIdeNum....

}

ma come devo strutturare il mio "gestioneDati" in modo che le mie classi possano recuperare tali dati?

Don[ITA]
16-01-2009, 17:32
Mettiamo che ti fai una classe Database così:

public class Database {

ArrayList<Pubblicazione> pubblicazioni;
ArrayList<Autore> autori;

public Database() {
pubblicazioni = new ArraiList<Pubblicazione>();
autori = new ArrayList<Autore>();
}

...bla...bla...ti riempi i 2 ArrayList...bla....bla

//metodo ipotetico per recuperare tutte le pubblicazioni di un autore
public ArrayList<Pubblicazione> getAut_pub(Autore aut) {
return aut.getPubblicazioni();
}

//metodo ipotetico per recuperare tutti gli autori di una pubblicazione
public ArrayList<Attore> getPublication_aut(Pubblicazione pub) {
return pub.getAutori();
}
}

Ovviamente le classi Autore e Pubblicazione dovranno contenere quei metodi ;)
Poi i dati li tratti come ti pare, proprio come se fosse un database vero.

pag65
16-01-2009, 18:05
ricordo che con il java parto proprio da 0 :D :muro:

i metodi di cui parli sono:
-get.Pubblicazioni
-get.Autore

ho un po di dubbi:

nel compilare l'array Pubblicazioni come posso inserire anche l'anno?
come posso far riconoscene al programma che quello è l'anno e non un altro valore?
nell'array Pubblicazioni devo mettere anche ideNum dell'autore giusto?

scusa l'infinita ignoranza...
mi ci sto impegnando di brutto :D

pag65
30-01-2009, 12:13
buongiorno

sono sempre qui :D

se invece di una classe astratta definissi un "interface"?
da quello che ho capito, se uso una classe astratta, le sottoclassi (cioè che le classi che estendono la classe astratta) ereditano variabili istanza e metodi definiti nella classe astratta...se poi metto un metodo astratto, questo deve essere ridefinito nelle sottoclassi

invece in un'interfaccia posso definire solo metodi che poi dovranno essere ridefiniti nelle classi che implementano l'interfaccia..


grazie :)

pag65
10-02-2009, 08:17
sono incappato in un problemome...

come posso fare ciò "● Ricerca di tutte le pubblicazioni di un certo anno"

dovrei organizzare tutte le pubblicazioni in un array o simili come posso fare?

Grazie

edit:
nella classe Database devo creare un solo oggetto di tipo Database perchè il database è unico...

edit2:
io nella classe Autore ho messo come variabile istanza anche un arraylist di pubblicazioni.

Don[ITA]
10-02-2009, 09:28
Posta il codice ;)

pag65
10-02-2009, 09:41
;26230870']Posta il codice ;)

quale ti metto?

Questo è Database:



public class Database {

public ArrayList<ClPubblicazioni> pubblicazioni;
public ArrayList<Autore> autori;

public Database() {
pubblicazioni = new ArrayList<ClPubblicazioni>();
autori = new ArrayList<Autore>();
}
{
//...bla...bla...riempire i 2 ArrayList...bla....bla

}


//metodo ipotetico per recuperare tutte le pubblicazioni di un autore
public ArrayList<ClPubblicazioni> getAut_pub(Autore aut){
return aut.getPubblicazioni();
}


//metodo ipotetico per recuperare tutti gli autori di una pubblicazione
public ArrayList<Autore> getPublication_aut(ClPubblicazioni pub) {
return pub.getAutori();
}

//metodo ipotetico per recuperare tutti gli autori di una pubblicazione
@SuppressWarnings("null")
public ArrayList<ClPubblicazioni> getPublication_Year(int z) {
if (z < 1900){
System.out.println("Aiutooooooooo");
}
ArrayList<ClPubblicazioni> stessoAnno = null;
for(int i = 0; i<pubblicazioni.size(); i++){
ClPubblicazioni pub = pubblicazioni.get(i);
if (z == pub.getYear()){
stessoAnno.add(pub);
}
if (stessoAnno == null)
{
System.out.println("erroraccio");
}
System.out.println(pub.getTitolo());
}
return stessoAnno;
}

}


La classe principale delle Pubblicazioni:

public class ClPubblicazioni {
public String titolo;
public int year;
public ArrayList<Autore> autori;

getAutori;
getTitolo;
getYear;
addAutore;// aggiunge solo l'autore ad "autori"
addAutoreComp;// aggiunge l'autore ad "autori" e la pubblicazione all'autore