Mini-baza danych uczniów, proszę o krytykę/pochwałe

1

Witam
Ucze sie javy, jestem poczatkujacy. Ambicje mam spore i zapał również jest. Postanowilem napisac mini-aplikacje zeby co-nieco nauczyc sie skladni jezyka, czytania z pliku, dziedziczenia itp.
Stworzyłem mini-pseudo baze danych uczniow operujacą na plikach .txt Nie jest to wersja okienkowa, wstępnie pisalem pod konsole i dopiero ucze sie Swinga ;)

Oto kod: (nizej krotki opis)
Klasa: Listy

package Paczka;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;

public class Listy 
{
	ArrayList<Integer> id = new ArrayList<Integer>();
	ArrayList<String> imie = new ArrayList<String>();
	ArrayList<String> nazwisko = new ArrayList<String>();
	ArrayList<String> klasa = new ArrayList<String>();
	ArrayList<String> listaUwag = new ArrayList<String>();
	ArrayList<String> listaOcen = new ArrayList<String>();
	ArrayList<String> listaUczniow = new ArrayList<String>();
	
	
	public int getRozmiarID()
	{
		return id.size();
	}
	
	public int getNextID()
	{
		int max=0;
		for(int i=0; i<id.size(); i++)
		{
			if(id.get(i) > max)
				max = id.get(i);
		}
		return max+1;
	}
	
	public void czytajUczniowDoList()
	{
		try{
		Scanner in = new Scanner(new File("uczniowie.txt"));
	
		while(in.hasNext())
		{
			id.add(in.nextInt());
			imie.add(in.next());
			nazwisko.add(in.next());
			klasa.add(in.next());
		}

		in.close();
		}catch(FileNotFoundException e)
		{
			System.err.println("Nie znaleziono pliku!");
		}
	}
	
	public boolean czyIstnieje(String imie, String nazwisko)
	{
		czytajUczniowDoList();
		int licznik = 0;
		boolean spr = false;
		
		for(int i = 0; i<getRozmiarID(); i++)
		{
			if(this.imie.get(i).equals(imie))
			{
				licznik++;
				if(this.nazwisko.get(i).equals(nazwisko))
				{
					licznik++;
					i = getRozmiarID();
				}
				else
				licznik = 0;
			}
		}
		
		if(licznik>=2)
			spr = true;
		else if(licznik<2)
			spr = false;
		
		return spr;
	}
	
}
 

Klasa: Uczniowie

package Paczka;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;

public class Uczniowie extends Listy
{
	
	public void czytajUczniow()
	{
		super.czytajUczniowDoList();
		
		for(int i=0; i<=super.getRozmiarID()-1; i++)
		{
			System.out.println(super.id.get(i) + " " + super.imie.get(i) + " " + super.nazwisko.get(i) + " " + super.klasa.get(i) + " " );
		}
	}
	
	public void dodajUczniow(String imie, String nazwisko, String klasa)
	{
		
		if(super.czyIstnieje(imie,nazwisko))
		{
			System.out.println("Jest juz taki uczen w bazie");
		}
		else
		{
			try{
			FileWriter uczniowie = new FileWriter("uczniowie.txt", true);
				
			int nastepneID = super.getNextID();
				
			uczniowie.write(nastepneID + " " + imie + " " + nazwisko + " " + klasa + "\r\n");
				
			uczniowie.close();
			}catch(IOException e)
			{
					System.err.println("Nie znaleziono pliku!");
			}
		}
	}

	public void szukajUcznia(int id)

	{
		super.czytajUczniowDoList();
		int licznik = 0;
		
		for(int i=0; i<super.getRozmiarID(); i++)
		{
			if(super.id.get(i) == id)
			{
				System.out.println(super.id.get(i) + " " + super.imie.get(i) + " " + super.nazwisko.get(i) + " " + super.klasa.get(i) + " " );
				licznik++;
			}
		}
		if(licznik==0)
			System.out.println("Nie ma ucznia z tym ID w bazie");
	}
	
	public void szukajUcznia(String imie)


	{
		super.czytajUczniowDoList();
		int licznik = 0;
		
		for(int i=0; i<super.getRozmiarID(); i++)
		{
			if(super.imie.get(i).equals(imie))
			{
				System.out.println(super.id.get(i) + " " + super.imie.get(i) + " " + super.nazwisko.get(i) + " " + super.klasa.get(i) + " " );
				licznik++;
			}
		}
		if(licznik==0)
			System.out.println("Nie ma takiego ucznia w bazie");
	}
	
	public void szukajUcznia(String imie, String nazwisko)

	{
		super.czytajUczniowDoList();
		int licznik = 0;
		
		for(int i=0; i<super.getRozmiarID(); i++)
		{
			if(super.imie.get(i).equals(imie) && super.nazwisko.get(i).equals(nazwisko))
			{
				System.out.println(super.id.get(i) + " " + super.imie.get(i) + " " + super.nazwisko.get(i) + " " + super.klasa.get(i) + " " );
				licznik++;
			}
		}
		if(licznik==0)
			System.out.println("Nie ma takiego ucznia w bazie");
	}
	
	public void dodajeBrakujacegoUcznia(String imie, String nazwisko, String komunikatKoncowy)

	{
		System.out.println("Nie ma takiego ucznia w bazie, dodaj by utworzyc uwage.");
		Scanner in = new Scanner(System.in);
		System.out.println("Czy chcesz dodac tego ucznia? tak/nie");
		String odp = in.next();
		
		if(odp.equals("tak"))
		{
			System.out.println("Podaj klase:");
			String klasa = in.next();
			dodajUczniow(imie, nazwisko, klasa);
			System.out.println(komunikatKoncowy);
		}
		in.close();
	}

	public void usunUcznia(String imie, String nazwisko)
	{
		try{
		Scanner in = new Scanner(new File("uczniowie.txt"));
		
		while(in.hasNextLine())
		{
			String linia = in.nextLine();
			if(linia.contains(imie) && linia.contains(nazwisko))
			{
				System.out.println("Usunieto!");
			}
			else
			{
				listaUczniow.add(linia);
			}
		}
		
		FileWriter uczn = new FileWriter("uczniowie.txt");
		uczn.write("");
		uczn.close();
		
		FileWriter uczn1 = new FileWriter("uczniowie.txt",true);
		for(int i=0; i<listaUczniow.size(); i++)
		{
			uczn1.write(listaUczniow.get(i) + "\r\n");
		}
		
		uczn1.close();
		in.close();
		}catch(IOException e)
		{
			System.err.println("Nie odnaleziono pliku!");
		}
	}
}

Klasa: Uwagi

 package Paczka;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;

public class Uwagi extends Listy
{
	
	public void czytajUwage()

	{
		try{
		Scanner in = new Scanner(new File("uwagi.txt"));
		
		while(in.hasNextLine())
		{
			System.out.println(in.nextLine());
		}
			
		in.close();
		}catch(FileNotFoundException e)
		{
			System.err.println("Nie odnaleziono pliku!");
		}
	}
	
	public void czytajUwage(String imie, String nazwisko)
	{
		try{
		Scanner in = new Scanner(new File("uwagi.txt"));
		
		while(in.hasNextLine())
		{
			String im = in.next();
			String naz = in.next();
			String uwa = in.nextLine();
			if(im.equals(imie) && naz.equals(nazwisko))
			{
				System.out.println(im + " " + naz + " " + uwa);
			}
		}
		
		in.close();
		}catch(FileNotFoundException e)
		{
			System.out.println("Nie odnaleziono pliku!");
		}
	}
	
	public void dodajUwage(String imie, String nazwisko, String trescUwagi)
	{
		super.czytajUczniowDoList();
		
		if(super.czyIstnieje(imie, nazwisko))
		{
			try{
			FileWriter uwagi = new FileWriter("uwagi.txt",true);

			uwagi.write(imie + " " + nazwisko + " " + trescUwagi + "\r\n");
			
			uwagi.close();
			}catch(IOException e)
			{
				System.err.println("Nie odnaleziono pliku!");
			}
		}
		else
		{
			Uczniowie uczn = new Uczniowie();
			uczn.dodajeBrakujacegoUcznia(imie, nazwisko, "Uczen dodany, mozesz teraz dodac uwage.");
		}
	}

	public void usunUwagi(String imie, String nazwisko)
	{
		if(super.czyIstnieje(imie, nazwisko))
		{
		try{
			Scanner in = new Scanner(new File("uwagi.txt"));
			
			while(in.hasNextLine())
			{
				String ciag = in.nextLine();
				if(ciag.contains(imie) && ciag.contains(nazwisko))
				{
					System.out.print("|");	
				}
				else
				{
					super.listaUwag.add(ciag);
				}
			}
			
			
			FileWriter uwagi = new FileWriter("uwagi.txt");
			uwagi.write("");
			uwagi.close();
			
			FileWriter uwagi1 = new FileWriter("uwagi.txt",true);
			
			for(int i=0; i<super.listaUwag.size(); i++)
			{
				uwagi1.write(super.listaUwag.get(i) + "\r\n");	
			}
			
			in.close();
			uwagi1.close();
		}catch(IOException e)
		{
			System.err.println("Nie odnaleziono pliku!");
		}
		}
		else if(!super.czyIstnieje(imie, nazwisko))
		{
			Uczniowie uczn = new Uczniowie();
			uczn.dodajeBrakujacegoUcznia(imie, nazwisko,"Uczen dodany, mozesz teraz dodac mu uwage i je usuwac.");
		}
	}
}

Klasa: Oceny

package Paczka;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;

public class Oceny extends Listy
{
	
	public void czytajOcene()
	{
		try{
		Scanner in = new Scanner(new File("oceny.txt"));
		
		while(in.hasNextLine())
		{
			System.out.println(in.nextLine());
		}
		
		in.close();
		}catch(IOException e)
		{
			System.err.println("Nie odnaleziono pliku!");
		}
	}

	public void dodajOcene(String imie, String nazwisko, String przedmiot, int ocena)
	{
		if(czyIstnieje(imie, nazwisko))
		{
			try{
			FileWriter oceny = new FileWriter("oceny.txt",true);
			
			oceny.write(imie + " " + nazwisko + " " + przedmiot + " " + ocena + "\r\n");
			
			oceny.close();
			}catch(IOException e)
			{
				System.err.println("Nie odnaleziono pliku!");
			}
		}
		
		else if(!czyIstnieje(imie, nazwisko))
		{
			Uczniowie uczn = new Uczniowie();
			uczn.dodajeBrakujacegoUcznia(imie, nazwisko, "Uczeń został dodany, mozesz teraz dodac mu ocene.");
		}
	}

	public void czytajOcene(String imie, String nazwisko)
	{
		try{
			Scanner in = new Scanner(new File("oceny.txt"));
			int licznik=0;
			
			while(in.hasNextLine())
			{
				String imie1 = in.next();
				String nazwisko1 = in.next();
				String przedmiot = in.next();
				String ocena = in.nextLine();
				
				if(imie1.equals(imie) && nazwisko1.equals(nazwisko))
				{
					System.out.println(imie1 + " " + nazwisko1 + " " + przedmiot + ocena);
					licznik++;
				}
			}
			
			if(licznik==0)
			{
				System.err.println("Ten uczen nie ma jeszcze oceny.");
			}
			
			in.close();
			}catch(IOException e)
			{
				System.err.println("Nie odnaleziono pliku!");
			}
	}

	public void usunOcene(String imie, String nazwisko)
	{
		try{
		Scanner in = new Scanner(new File("oceny.txt"));
		
		while(in.hasNextLine())
		{
			String linia = in.nextLine();
			if(linia.contains(imie) && linia.contains(nazwisko))
			{
				System.out.print("|");
			}
			else
			{
				listaOcen.add(linia);
			}
			
			FileWriter oceny = new FileWriter("oceny.txt");
			oceny.write("");
			oceny.close();
			
			FileWriter oceny1 = new FileWriter("oceny.txt");
			for(int i=0; i<listaOcen.size(); i++)
			{
				oceny1.write(listaOcen.get(i) + "\r\n");
			}
			oceny1.close();
		}
		
		in.close();
		}catch(IOException e)
		{
			System.err.println("Nie odnaleziono pliku.");
		}
	}



}
 

KLASA: Main - TESTOWA

 package Paczka;

public class Main
{

	public static void main(String[] args) 
	{

		Uczniowie uczn = new Uczniowie();
//		uczn.czytajUczniow();	
//		uczn.dodajUczniow("Erewan","Nulko","kl3");
//		uczn.szukajUcznia("Maciej");
//		uczn.usunUcznia("Daniel", "Bulka");

		
		
		Uwagi uwagi = new Uwagi();
//		uwagi.czytajUwage();
//		uwagi.czytajUwage("Bartosz","Wodek");
//		uwagi.dodajUwage("Stanislaw", "Wrona", "Nie reaguje na przestrogi nauczyciela");
//		uwagi.usunUwagi("Maciej", "Tulaza");
		
		
		
		Oceny oceny = new Oceny();
//		oceny.czytajOcene();
//		oceny.dodajOcene("Eugeniusz", "Tulaza", "religia", 5);
//		oceny.czytajOcene("Maciej", "Anyz");
//		oceny.usunOcene("Maciej", "Anyz");
		
	}
	
}

W klasie Main - jak widac tylko testowałem jak to wszystko działa ;) moznaby tu stworzyc mini-menu na switch-case

Klasa Listy - zawiera pola z ArrayList'ami, w ktore wprowadzam dane celem czytania z pliku, dodawania, dopisywania itp.
1)Od razu odosnie tej klasy mam pytanie: czy dobrze zrobilem, ze tą klase rozszerzam w klasach potomnych(uczniowie, uwagi, oceny)? W koncu z tego co slyszalem, mozna powiedziec, ze słówko "extends" przedstawiamy jako "jest" czyli.. "listy są uczniami"? Troche to prawde powiedziawszy nie logiczne, a moze jednak?
Powiedzcie no jak to jest z tym, czy zastosowalem odpowiednia metode? czy lepiej bylo stworzyc prosta klase publiczna i jej obiekt i tym sposobem dodawac do pól i wywolywac metody tej klasy(Listy)?
2) I tak sobie myśle: czy powinienem zastosować enkapsulacje? dla kazdej listy dać setter i getter? bo niby z zewnatrz maja dostep inne klasy do pól, ale z drugiej strony czemu miałyby nie miec, w koncu od tego są, hmm? TO WAZNE
Klasa Uczniowie - jak wiadomo, czyta, dopisuje uczniow, szuka uczniow po id, imieniu nazwisku itp

Klasa Uwagi - czyta uwagi, dodaje, usuwa

Klasa Oceny - dodaje, usuwa oceny, jak pozostałe dwie tylko inna rola ;)

Pytanie moje - czy dobrze pisałem kod?
Znaczy sie - wszystko działa fajnie jak chciałem, tylko czy pewnego rodzaju "sposoby pisania" czy też tworzenie "czytelnego kodu" (chociaz w miare) zostały spełnione?
Czy dobrze zachowałem elementy dziedziczenia i ogolnie elementów jezyka obiektowego?

Wystawiam kod na krytykę i ewentualne, choć myśle wątpliwe - pochwały :)

Prosze o wyrozumiałość - jak widać poziom szału nie robi

Pozdrawiam!

0

Zanim ktoś Cię zjedzie:
Klasa Listy to kompletne nieporozumienie. Powinieneś stworzyć POJO Uczen zawierając imię, id itp.
Potem wrapper do listy z odpowiednimi metodami do operacji na tej liście.

1

Zanim ktoś Cię zjedzie:

Tak, zdaje sobie sprawe, ze zaraz znajdzie sie kilku takich, co zamiast poradzic co robie zle powiedza mi zebym zabral sie za obieranie ziemniaków, a nie pisanie programow
Jednakze mało z tego wyniose, bo takie gadaniny najczesciej zignoruje i wyciagne z nich tylko informacje ktore sa dla mnie cenne: czyt. moje błędy

Klasa Listy to kompletne nieporozumienie. Powinieneś stworzyć POJO Uczen zawierając imię, id itp.
Potem wrapper do listy z odpowiednimi metodami do operacji na tej liście.

tak wlasnie myslalem. cala koncepcja list wziela sie z tego, ze podobny program robilem w C na strukturach. Tutaj nie mialem takiego czegos, stad wziela sie osobna klasa dla przechowywania tych danych.
Moglbys mi wytlumaczyc co znaczy termin POJO? pierwszy raz sie z nim spotykam a google mało mi mówi, chodzi o prostote pisania?
co oznacza "wrapper"?
Wytlumacz jesli mozesz co proponowalbys zrobic :)

dodam, ze to moj pierwszy program w tym jezyku

0

POJO to klasa reprezentująca obiekt uczeń. Ma zawierać wszelkie pola takie jak sobie wymyślisz i gettery, settery, ewentualnie konstruktory i toString.

1

POJO to klasa reprezentująca obiekt uczeń. Ma zawierać wszelkie pola takie jak sobie wymyślisz i gettery, settery, ewentualnie konstruktory i toString.

Czyli klasa "Listy" ma sie po prostu nazywac POJO i posiadać te same pola co teraz Listy + gettery i settery do tych pól, konstruktor(jesli potrzeba) i toStringa do reprezentowania tej klasy przez napis?

Zawsze myslalem ze to obiekt reprezentuje klase, a nie klasa obiekt.

Dobrze myśle? poza tym co jest jeszcze nie tak? wiem ze kod jest dosc dlugi i pewnie daloby rade napisac to krocej, ale nie wiem jak. Jakies pomysły ?:)
Ogolnie calego kodu nie trzeba czytac, 3 klasy sa podobne tylko operują na roznych danych. Wystarczy przeczytac opis pod kodem i ewentualnie spojrzec do kodu w razie potrzeby.

z gory dzieki za ocene

EDIT
i wtedy tę klasę POJO rozszerzac o inne czy tworzyc jej obiekty w innych klasach?

0

POJO TO NP.

public class User {

	private Long id;
	private String firstName;
	private String lastName;
	private String username;
	private String password;

	public Long getId() {
		return id;
	}

	public void setId( final Long id ) {
		this.id = id;
	}

	public String getFirstName() {
		return firstName;
	}

	public void setFirstName( final String firstName ) {
		this.firstName = firstName;
	}

	public String getLastName() {
		return lastName;
	}

	public void setLastName( final String lastName ) {
		this.lastName = lastName;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername( final String username ) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword( final String password ) {
		this.password = password;
	}
}

}
1

Czyli takim - podobnym POJO miałbym teraz odwołać się do list w klasie Listy? czy stworzyc w tym POJO listy i dodawać je tam przez settery i gettery?
i tworzyc instancje tej klasy (User user = new User(); ) czy rozszerzac jakos?:D

rozumiem ze mam tworzyc klase uwag i ocen tak samo jak w userze? czy raczej nie?

nie do konca rozumiem jak by to mialo wygladac, moze ktos z was chciałby sie szerzej rozpisac jak to stworzone POJO uzywac itd to bym bardzo dziekował ;)

0

Tak jak nozi bez logowania napisał masz teraz tak jakby nowy typ danych User, który potrafi przechowywać imię, nazwisko, login, hasło itp i to wszystko jest powiązane ze sobą. Możesz teraz stworzyć metodę do dawania nowych użytkowników. Stwórz sobie tablicę czy tam listę, w której będziesz trzymał obiekty typu User.

 
User[] listaUczniow = new User[100];
listaUczniow[0].JakasMetoda(); itp

//Teraz dodawaj uczniów do tablicy lub listy jak sobie stworzysz
0

Poświęciłem chwilę, może uda Ci się coś z tego zrozumieć. Można zamiast getterów/setterów dodać konkretne operacje na liscie, np. dodajUwage itd.

Jeśli ktoś ma jakieś konsktruktywne uwagi, proszę o napisanie, niech kolega się uczy.

Klasa 'Uwaga';

package net.programmers.example.domain;

import org.apache.commons.lang.StringUtils;

public class Uwaga {

	private String opis;

	public Uwaga() {
		ustawWartosciPoczatkowe();
	}

	public Uwaga( final String opis ) {
		this.opis = opis;
		
		ustawWartosciPoczatkowe();
	}

	private void ustawWartosciPoczatkowe() {
		if ( StringUtils.isEmpty( getOpis() ) ) {
			setOpis( StringUtils.EMPTY );
		}
	}

	public String getOpis() {
		return opis;
	}

	public void setOpis( final String opis ) {
		this.opis = opis;
	}

}
}

Klasa 'Uczen';

package net.programmers.example.domain;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;

public class Uczen {

	private String imie;
	private String nazwisko;

	private List<Uwaga> listaUwag;

	public Uczen() {
		ustawWartosciPoczatkowe();
	}

	public Uczen( final String imie, final String nazwisko ) {
		this.imie = imie;
		this.nazwisko = nazwisko;

		ustawWartosciPoczatkowe();
	}

	public Uczen( final String imie, final String nazwisko, final List<Uwaga> listaUwag ) {
		this.imie = imie;
		this.nazwisko = nazwisko;
		this.listaUwag = listaUwag;

		ustawWartosciPoczatkowe();
	}

	private void ustawWartosciPoczatkowe() {

		if ( CollectionUtils.isEmpty( listaUwag ) ) {
			setListaUwag( new ArrayList<Uwaga>() );
		}

		if ( StringUtils.isEmpty( getImie() ) ) {
			setImie( StringUtils.EMPTY );
		}

		if ( StringUtils.isEmpty( getNazwisko() ) ) {
			setNazwisko( StringUtils.EMPTY );
		}
	}

	public String getImie() {
		return imie;
	}

	public void setImie( final String imie ) {
		this.imie = imie;
	}

	public String getNazwisko() {
		return nazwisko;
	}

	public void setNazwisko( final String nazwisko ) {
		this.nazwisko = nazwisko;
	}

	public List<Uwaga> getListaUwag() {
		return listaUwag;
	}

	public void setListaUwag( final List<Uwaga> listaUwag ) {
		this.listaUwag = listaUwag;
	}

}

Klasa 'Klasa'

package net.programmers.example.domain;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;

public class Klasa {

	private String nazwaKlasy;

	private List<Uczen> listaUczniow;

	public Klasa() {
		ustawWartosciPoczatkowe();
	}

	public Klasa( final String nazwaKlasy ) {
		this.nazwaKlasy = nazwaKlasy;

		ustawWartosciPoczatkowe();
	}

	public Klasa( final String nazwaKlasy, final List<Uczen> listaUczniow ) {
		this.nazwaKlasy = nazwaKlasy;
		this.listaUczniow = listaUczniow;

		ustawWartosciPoczatkowe();
	}

	private void ustawWartosciPoczatkowe() {

		if ( StringUtils.isEmpty( getNazwaKlasy() ) ) {
			setNazwaKlasy( StringUtils.EMPTY );
		}

		if ( CollectionUtils.isEmpty( getListaUczniow() ) ) {
			setListaUczniow( new ArrayList<Uczen>() );
		}
	}

	public List<Uczen> getListaUczniow() {
		return listaUczniow;
	}

	public void setListaUczniow( final List<Uczen> listaUczniow ) {
		this.listaUczniow = listaUczniow;
	}

	public String getNazwaKlasy() {
		return nazwaKlasy;
	}

	public void setNazwaKlasy( final String nazwaKlasy ) {
		this.nazwaKlasy = nazwaKlasy;
	}

	@Override
	public String toString() {
		final StringBuilder sb = new StringBuilder();

		if ( CollectionUtils.isNotEmpty( getListaUczniow() ) ) {

			sb.append( "Klasa: [" + getNazwaKlasy() + "]" );
			sb.append( " = { " );

			Iterator<Uczen> it = listaUczniow.iterator();

			while ( it.hasNext() ) {

				Uczen uczen = it.next();

				sb.append( "[" );
				sb.append( uczen.getImie() );
				sb.append( " " );
				sb.append( uczen.getNazwisko() );
				sb.append( "]" );

				if ( it.hasNext() )
				    sb.append( "," );
			}

			sb.append( " } " );
		} else {
			sb.append( "Klasa nie posiada uczniów." );
		}

		return sb.toString();
	}
}

Klasa testowa:

package net.programmers.example;

import java.util.List;

import net.programmers.example.domain.Klasa;
import net.programmers.example.domain.Uczen;
import net.programmers.example.domain.Uwaga;

public class SimplePojo {

	public static void main( String[] args ) {
		
		// Tworzymy trzy obiekty klasy 'Uczen'
		Uczen marek = new Uczen("Marek", "Kowalski");
		Uczen lukasz = new Uczen("Łukasz", "Marecki");
		Uczen radek = new Uczen("Radek", "Czarnywojtek");
		
		//pobieramy listę obiektów klasy 'Uwaga' dla obiektu marek klasy 'Uczen'
		List<Uwaga> listaUwagMarka = marek.getListaUwag();
		
		//Dodajemy nową uwagę do obiektu marek klasy 'Uczen'		
		listaUwagMarka.add(  new Uwaga( "Rzucanie w księdza czosnkiem" ) );
		
			
		//Tworzymy obiekt klasy 'Klasa'
		Klasa trzeciaLO1 = new Klasa( "3 LO1" );

		//pobieramy listę obiektów klasy 'Uczen' dla obiektu listaUczniowKlasy3LO1 klasy 'Klasa'
		List<Uczen> listaUczniowKlasy3LO1 = trzeciaLO1.getListaUczniow();				
		
		listaUczniowKlasy3LO1.add( marek );
		listaUczniowKlasy3LO1.add( lukasz );
		listaUczniowKlasy3LO1.add( radek );
		
		//Wyświetlamy wszystkich uczniów w klasie;		
		System.out.println( trzeciaLO1.toString() );
               
                // Wynik: Klasa: [3 LO1] = { [Marek Kowalski],[Łukasz Marecki],[Radek Czarnywojtek] } 


	}
}

1

Odpisuje po dłuższym czasie bo pozwoliłem sobie poświecić go trochę na zrozumienie tego kodu @NoZi ;)

Stąd kieruje kilka pytań:

  1. co to za zaimportowana klasa StringUtils i CollectionUtils? wyczytałem ze to część Spring'a http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/util/package-summary.html

Actually, a POJO is a class that is NOT an entity bean. POJO stands for Plain Old Java Object, which if taken literally, refers to any java class. However, the implied meaning is a java class that does not extend any class.
[..]the class doesnt implement or extend anything. It is therefore a "plain old" java object. Typically in enterprise java development, you would write pojos as helper classes that support your business logic.
Generally, although ther are exceptional cases, a pojo will not extend any other class or implement any interfaces.

To znaczy, że POJO to klasa, która nie bierze udziału w dziedziczeniu, nie implementuje interfejsow nie zawiera obiektów innych klas itp?
Do czego właściwie to POJO i kiedy powinno się tego używać? Dlaczego jest lepsze od innych rozwiązan?

3)Z tego co zrozumiałem z kodu - w jezykach obiektowych (a ze java podobno bardzo obiektowa) powinniśmy wszystko sprowadzać do obiektu, tzn każda rzecz jaka chcemy zaimplementować powinna byc obiektem - w tym wypadku Uczen to obiekt. Zmienna typu "Uczen" jest jakby swoją oddzielna kartka papieru na ktorej mamy wpisane jego imie, nazwisko i uwagi (moglibysmy dopisac też oceny i jego klase?). Takich obiektów tworzymy tyle ile mamy uczniów (co oznacza ze każdy uczen to obiekt).

Klasa "Klasa" tworzy równiez takie "oddzielne kartki papieru" gdzie napisana jest nazwa klasy oraz lista uczniow wpisana do tej klasy.
I znowu - tworzymy obiekt typu "Klasa" ktory ma swoja nazwe - i to jest nasza kartka - jej przyporzadkowujemy nazwe i uczniów.
Równie dobrze moglibyśmy tak robic z klasą - samochód, dom, szablon itd.
Dobrze rozumiem założenia?

4)No i teraz zasadnicze pytanie - bez którego program to lipa - otóz mowie tu o bazie danych. Jesli chciałbym zrobic tak, zeby te obiekty uczniów - czyli ich imiona nazwiska itp. dopisywały się do pliku .txt lub też - w przyszłosci - do jakiejs bazy danych MySQL albo SQLite czy inne - gdzie stworzyc implementacje? W metodzie "dodajUcznia" jesli taka zrobie? a może w konstruktorze klasy Uczen - bo przeciez tworzac instancje: Uczen maciek = new Uczen("Maciek","Kowalski"); tworze jakby nowego ucznia, stąd mogłby on Od razu dodac sie do listy w bazie. Mam racje?

5)Teraz troche filozoficzne pytanie - czy wiedza na temat tego, dlaczego powinienem zrobić tak jak ty, a nie tak jak ja przychodzi z czasem? czy jest jakis magiczny sposób ktorym moglbym w sobie kreować takie "poprawne style kodowania"?
Czytajac poradniki, dokumentacje itp. wszędzie piszą - "Nowy framework/ten sposób implementacji/itd. UŁATWI ci tworzenie [..]".
Mam troche poczucie, że taka ilosc rzeczy o ktorych trzeba pamietac wrecz utrudnia prace, a nie ułatwia. Zapewne sie myle - ale fakt faktem program robiący tylko to co robi mój (nic specjalnego) mozna by zrobic w 1 klasie na kilku metodach, zamiast robijac go po oddzielnych klasach itd. - ale podejście byłoby "nieobiektowe" - stąd dla javy bezużyteczne.

6)Iterator jest po to, zeby "przeleciał" po całej liście (bo zna jej dlugosc itp.) - zebysmy bez sensu nie musieli pobierac dlugosci listy, zapamietywania jej w zmiennej i dopiero teraz "przelatywali" liste. Takie krótsze rozwiazanie tak?
i powstała zmienna "it" typu Iterator - jest obiektem, więc jesli z listy bierzemy liczby "int" nie mozemy porownywać iteratorem znakiem "==" tylko cos.equals(liczba)? tak sprawdzalem w eclipsie i chyba działało poprawnie

Prosze o odp i rady w razie co ;) pozdrawiam

0

Po pierwsze:
Metody ustawWartosciPoczatkowe są niepotrzebne. Konstruktor wywoływany jest tylko raz, przy tworzeniu obiektu - nie musisz sprawdzać, czy kolekcja jest pusta, czy string jest pusty itp.

Zamiast np:

public Uczen() {
	ustawWartosciPoczatkowe();
}

zostaw po prostu:

public Uczen() {

}

Druga rzecz:
Sprawdzanie nulla (metoda StringUtils.isEmpty - zgaduję, że z Apache Commons - bardzo dobry pomysł swoją drogą z użyciem biblioteki pomocniczej, zazwyczaj początkujący javowcy nie korzystają z bibliotek pomocnicznych) to nie do końca dobry pomysł. Uczeń musi mieć imię i nazwisko, więc każdy przypadek ucznia, który takowego nie ma jest sytuacją wyjątkową - i dlatego - jeśli boisz się, że wpadnie jakiś null do konstruktora - to należy po prostu sprawdzać i rzucać wyjątkiem.

Czyli coś np takiego:

public Uczen(String imie, String nazwisko){
        if(StringUtils.isEmpty(imie)){
            throw new NullPointerException("Uczen.imie nie moze byc null");
        }
	...
}

Ba, a nawet lepiej:

public Uczen(String imie, String nazwisko){
        setImie(imie);
}

public void setImie(String imie) {
	if(StringUtils.isEmpty(imie)){
		throw new NullPointerException("Uczen.imie nie moze byc puste");
	}
        
        this.imie = imie;
}

itp.

Teraz głównie punkt 4:

No i teraz zasadnicze pytanie - bez którego program to lipa - otóz mowie tu o bazie danych. Jesli chciałbym zrobic tak, zeby te obiekty uczniów - czyli ich imiona nazwiska itp. dopisywały się do pliku .txt lub też - w przyszłosci - do jakiejs bazy danych MySQL albo SQLite czy inne - gdzie stworzyc implementacje?

Ja bym na twoim miejscu zrobił nową klasę. Jeśli zapisujesz to do jakiejś postaci zserializowanej (tzn do pliku tekstowego w tym przypadku) to np. KlasaSerializer i KlasaDeserializer, w przypadku bazy danych - jakieś DAO: http://en.wikipedia.org/wiki/Data_access_object

5)Teraz troche filozoficzne pytanie - czy wiedza na temat tego, dlaczego powinienem zrobić tak jak ty, a nie tak jak ja przychodzi z czasem? czy jest jakis magiczny sposób ktorym moglbym w sobie kreować takie "poprawne style kodowania"?

Książki i klepanie. Samo z siebie raczej nie przyjdzie, ale takie rozwiązania są po prostu wygodniejsze na dłuższą metę więc, jeśli się koduje dużo i dużo o tym czyta - to nawyki niejako same wskakują na miejsce. Przynajmniej tak było w moim przypadku.

1

(metoda StringUtils.isEmpty - zgaduję, że z Apache Commons - bardzo dobry pomysł swoją drogą z użyciem biblioteki pomocniczej, zazwyczaj początkujący javowcy nie korzystają z bibliotek pomocnicznych)

Czyli rozumiem ze nie jest to część Spring Framework'a? A jak zrobić, zeby te bilbioteki dodatkowe posiadac? ;)
jest jakis spis dodatkowych bibliotek i opisane do czego one służa?

Jeśli zapisujesz to do jakiejś postaci zserializowanej (tzn do pliku tekstowego w tym przypadku) to np. KlasaSerializer i KlasaDeserializer, w przypadku bazy danych - jakieś DAO: http://en.wikipedia.org/wiki/Data_access_object

Serializacja to zamiana obiektu na strumien bajtowy, wiec w notatniku nie bedzie bezposrednio imion, nazwisk itd. tylko kod, tak?
Jak dokonać takiej serializacji i deserializacji?

EDIT
Troche poszukałem i zrobilem male testy. Wyszło mi tak:

 import java.io.Serializable;


public class Klasa implements Serializable
{
	private String nazwa;

	public Klasa()
	{
		nazwa = "";
	}
	
	public Klasa(String nazwa)
	{
		this.nazwa = nazwa;
	}
	
	public String getNazwa() {
		return nazwa;
	}

	public void setNazwa(String nazwa) {
		this.nazwa = nazwa;
	}
	

}
 import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;


public class Test
{
	public static void main(String[] args) throws FileNotFoundException, IOException 
	{

		Klasa kl = new Klasa("JAKASNAZWA");
	
		ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("plik.txt"));
		out.writeObject(kl);
		out.close();
	}

}

I zapisuje sie do pliku "plik.txt" cos takiego:
Image Hosted by ImageShack.us
Dobrze jest? i jak to odczytać? do jakiej zmiennej przyporządkowac itp? ;)

Co do punktu 3 i 6 - czy w 3 mam racje (chce dobrze to zrozumiec ;)) i czy w 6 również mam? to taka droga na skróty troche?

0

a może zmień sposób projektowania na database-first czyli najpierw tworzysz bazę (tablice, widoki, relacje itp), a nastepnie piszesz kod korzystając z jakiejś standardowej biblioteki dostępu do danych. Wg mnie przy małych projektach jest to szybszy sposób tworzenia aplikacji, a poza tym nie trzeba pisać zbyt dużo kodu aby uzyskać działający program.

0

poza tym w komercyjnych projektach korzysta się raczej z gotowych systemów baz danych bo pozwalają na robienie wielu rzeczy z automatu bez pisania dodatkowego kodu np. indeksowanie, triggery, kaskadowe usuwanie rekordów + cały mechanizm korzystania z jednej bazy przez wielu użytkowników równocześnie

0

Serializacja to zamiana obiektu na strumien bajtowy, wiec w notatniku nie bedzie bezposrednio imion, nazwisk itd. tylko kod, tak?
Jak dokonać takiej serializacji i deserializacji?

To nie do końca tak.

Serializacja to rzeczywiścia zamiana obiektu na strumień bajtowy, przy czym jednak ten "strumień bajtowy" - jego forma - jest ściśle uzależniona od jego implementacji (tzn. wykonania owej serializacji). Serializować można obiekty do XML'a lub JSON'a, albo też poprzez standardową implementację JVM. Rodzajów serializacji jest mnóstwo.
Ja na początek bym polecił Tobie coś łatwiejszego - tzn. zapisanie obiektu do pliku tekstowego, oraz odczytywanie go z pliku tekstowego, np. we wspomnianym formacie XML, czyli:

Zakładamy, że masz klasę Dziennik, która ma w sobie listę wpisów dla uczniów, z których każdy posiada: id, imię, nazwisko, listę ocen, listę uwag.
Oceny - zwykłe integery, uwagi - zwykłe stringi.

Czyli w pliku tekstowym to powinno wyglądać już tak:

 
<Dziennik>
	<ListaUczniow>
		<Uczen>
			<Id>1</Id>
			<Imie>Paweł</Imie>
			<Nazwisko>Nibyjaki</Nazwisko>
			<Oceny>
				<Ocena>1</Ocena>
				<Ocena>1</Ocena>
				<Ocena>1</Ocena>
			</Oceny>
			<Uwagi>
				<Uwaga>Trzyma sie za kurtke</Uwaga>
				<Uwaga>Trzyma sie za czapke</Uwaga>
			</Uwagi>
		</Uczen>
	</ListaUczniow>
</Dziennik>

Itp.
Teraz: aby to zapisywać do pliku i odczytywać możesz to zrobić sam, albo skorzystać z jednej z tysiąca i jednej implementacji takiego mechanizmu. Żeby zbyt mocno nie mącić w głowie - na początek sugerowałbym napisać coś takiego samemu. Potem spróbować skorzystać z jakiejś biblioteki do serializacji oraz deserializacji, a na końcu w ogóle to wrzucić do bazy danych SQLite.

Czyli rozumiem ze nie jest to część Spring Framework'a? A jak zrobić, zeby te bilbioteki dodatkowe posiadac?

Być może to jest część Spring Framework'a - w różnych bibliotekach istnieją różne klasy nazwane tak samo - StringUtils. Mi StringUtils kojarzy się z biblioteką ApacheCommons, ale najprawdopodniej się pomyliłem.
"Co zrobić żeby te biblioteki dodatkowe posiadać?" - ciekawe pytanie ;) Generalnie one są dostępne za darmo - w większości - i zazwyczaj wystarczy wpisać w google "[nazwa biblioteki]". Dodatkowo należy je jeszcze dołączyć do projektu - ale to zależy od IDE, którego używasz ALBO od sposobu, w jaki budujesz swój program (ANT czy Maven).
Generalnie na początek musisz się nauczyć dodawać biblioteki do projektu w swoim IDE (Google jest tego pełne dla każdego środowiska).

1

a może zmień sposób projektowania na database-first czyli najpierw tworzysz bazę (tablice, widoki, relacje itp), a nastepnie piszesz kod korzystając z jakiejś standardowej biblioteki dostępu do danych.

Nie do konca rozumiem - to znaczy, ze najpierw tworze baze danych a potem programem tylko z niej czytam? wtedy brak byloby mozliwosci dopisywania nowych uczniów itp.

aby to zapisywać do pliku i odczytywać możesz to zrobić sam, albo skorzystać z jednej z tysiąca i jednej implementacji takiego mechanizmu. Żeby zbyt mocno nie mącić w głowie - na początek sugerowałbym napisać coś takiego samemu.

Fju fju.. :D prawde powiedziawszy nigdy nie miałem stycznosci z XML. Nie bardzo wiem jak się do tego zabrac i jak potem to odczytac z pliku w razie potrzeby.
Plik stworzony przez program ma miec wgl rozszerzenie .xml czy .txt?
A na przyszłosc - moze znasz jakis przykład bilbioteki do serializacji/deserializacji? EDIT znalazłem jakies XMLEncoder w standardowej bibliotece javy, moze o to chodzi? są jakies alternatywne rozwiazania - tzn inne bilbioteki niz ta?:)

Dodatkowo należy je jeszcze dołączyć do projektu - ale to zależy od IDE, którego używasz ALBO od sposobu, w jaki budujesz swój program (ANT czy Maven).

I tu powiem Ci ze zawsze sie zastanawialem - co to kurcze jest ten ANT, co to Maven. Słyszałem ze do organizacji projektu - ze niby bardzo pomaga. Mam gdzies na dysku nawet jakis angielsko-jezyczny tutorial, ale wlasciwie nie wiem jak to działa. Pokazuje jakie są klasy w projekcie, jakie bilbioteki dolaczam itp? Dlaczego wszyscy krzyczą, ze Maven taki swietny :D?
a w ogóle to uzywam eclipse

Co do dodawania:
koło JRE Sysem Library: prawym>build path>configure build path>add jar(musi byc w kat. z projektem) lub add external jar(moze byc gdzie kolwiek)
Dobrze znalazłem :)?

0

Używam ASP.NET więc będę się odnosił do tej technologii. Tak jak pisałem przy małych projektach wg mnie lepszym podejściem jest database-first. Oznacza ono, że najpierw tworzę PUSTĄ bazę danych i definuję w niej potrzebną strukturę tj. tabele, widoki, procedury przechowywane itp., ale bez danych. Za pomocą kreatora w VS tworzę klasy odpowiadające obiektom z bazy danych (w tym miejscu nie piszę żadnego kodu system sam go generuje), a jedyne co muszę zrobić to oprogramować zdarzenia związane z dodawaniem, edycją i wyszukiwaniem rekordów. Np. dodanie rekordu do tabeli przy wykorzystaniu Linq wygląda

DataClassesZgloszeniaDataContext db = new DataClassesZgloszeniaDataContext();
ZgloszeniaLinq rr = new ZgloszeniaLinq();
rr.Opis = "opis zdarzenia";
rr.Priorytet = 1;
db.ZgloszeniaLinqs.InsertOnSubmit(rr);
db.SubmitChanges();

Oczywiście można dyskutować nad oddzieleniem warstwy prezentacji od warstwy bazy danych, wydajnością i jakością kodu generowanego przez kreatory, ale rozumiem, że mówimy o małych projektach gdzie jeden człowiek jest analitykim, programistą i kerownikem projektu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1