Problem ze zmiennymi + przegląd kodu

0

Siemanko, zaczynam powoli uczyć się Javy i postanowiłem zrobić prosty programik, który ma być imitacją biblioteki. Mam zamiar go przerabiać wraz z postępami w nauce, więc nie czepiajcie się sporych braków ;p M.in. dodawanie danych książek, wypożyczeń etc. do bazy danych będę dodawał w późniejszym czasie. Nadmienię też od razu, że data ostatniego logowania jest teraz aktualną datą, prawidłowe jej działanie mam zamiar zaimplementować w momencie, kiedy będę się bawił operacjami na plikach. I tak, wiem, że ten kod wygląda jak jedna wielka abstrakcja, ale chcę w nim korzystać ze wszystkiego, czego się da 😂

Na ten moment mam trzy pytania:
1/ Jakaś optymalizacja kodu bądź poprawki? Coś zmienić? Rady dla początkującego zawsze przydatne ;p
2/ W klasie Ksiazki mam zdefiniowane zmienne String oraz int, są one wykorzystywane w metodach dodaj() oraz wyswietlKsiazki(). Tutaj pojawia się już problem, ponieważ po przypisaniu wartości do zmiennych w metodzie dodaj(), nie są one odczytywane w metodzie wyswietlKsiazki(). Jak to naprawić?
3/ Warto definiować tablice takie jak w metodzie wybor()? Zastosowanie pętli for oraz tablicy String wydaje mi się bardziej czytelne w kodzie, lecz jak to wygląda w praktyce? Ma to jakikolwiek sens? :D

Z góry dziękuję za pomoc :D

Oczywiście załączam kod:

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;

class Logowanie {
	private static final String nick = "root", haslo = "root";

	Scanner wejscie = new Scanner(System.in);

	public void dataOstatniegoLogowania() {
		Date data = new Date();
		SimpleDateFormat formatDaty = new SimpleDateFormat("HH:mm:ss dd.MM.yyyy");
		String dataOstatniegoLogowania = formatDaty.format(data);
		System.out.println("Data Twojego ostatniego logowania: " + dataOstatniegoLogowania);
	}

	protected void zaloguj() throws IOException {
		System.out.println("Podaj swoj nick: ");
		String wprowadzonyNick = wejscie.nextLine();
		System.out.println("Podaj swoje haslo: ");
		String wprowadzoneHaslo = wejscie.nextLine();
		if (!Logowanie.nick.equals(wprowadzonyNick) || !Logowanie.haslo.equals(wprowadzoneHaslo)) {
			System.out.println("Bledne dane!");
			System.exit(1);
		} else {
			System.out.println("Logowanie przebieglo pomyslnie!\nWitaj, " + nick);
			Menu menu = new Menu();
			menu.wybor();
		}
	}
}

class Menu {
	public void wybor() throws IOException {

		final String pozycjeMenu[] = { "Biblioteka", "Co chcesz zrobić?", "1) Dodac ksiazke", "2) Dodac klienta",
				"3) Wypozyczyc ksiazke", "4) Wyswietlic wypozyczenia", "5) Wyswietlic ksiazki" };

		for (int i = 0; i < pozycjeMenu.length; i++) {
			System.out.println(pozycjeMenu[i]);
		}

		Scanner wejscie1 = new Scanner(System.in);

		int wybranaPozycja = wejscie1.nextInt();
		System.out.println("Wybor: " + wybranaPozycja);

		switch (wybranaPozycja) {
		case 1:
			Ksiazki dodajKsiazke = new Ksiazki();
			dodajKsiazke.dodaj();
			break;
		case 2:
			DodajKlienta dodajKlienta = new DodajKlienta();

			break;
		case 3:
			Wypozyczenia wypozyczKsiazke = new Wypozyczenia();

			break;
		case 4:
			Wypozyczenia wyswietlWypozyczenia = new Wypozyczenia();

			break;
		case 5:
			Ksiazki wyswietlKsiazki = new Ksiazki();
			wyswietlKsiazki.wyswietlKsiazki();
			break;
		default:
			System.out.println("Wybierz poprawną pozycję z menu!");
			Menu menu = new Menu();
			menu.wybor();
		}
	}
}

class Ksiazki {
	String tytul, autor, isbn;
	int id, liczbaStron;

	public void dodaj() throws IOException {
		Scanner wejscie = new Scanner(System.in);
		System.out.println("-Dodawanie ksiazki-");
		System.out.println("Podaj tytul: ");
		tytul = wejscie.nextLine();
		System.out.println("Podaj autora: ");
		autor = wejscie.nextLine();
		System.out.println("Podaj ISBN: ");
		isbn = wejscie.nextLine();
		System.out.println("Podaj liczbe stron: ");
		liczbaStron = wejscie.nextInt();

		System.out.println("Wcisnij dowolny przycisk, aby wrocic do menu glownego...");
		System.in.read();
		Menu menu = new Menu();
		menu.wybor();

		wejscie.close();
	}

	public void wyswietlKsiazki() throws IOException {
		System.out.println("----------------------------------------");
		System.out.println("Tytul: " + this.tytul);
		System.out.println("Autor: " + this.autor);
		System.out.println("ISBN: " + this.isbn);
		System.out.println("Liczba stron: " + this.liczbaStron);

		System.out.println("Wcisnij dowolny przycisk, aby wrocic do menu glownego...");
		System.in.read();
		Menu menu = new Menu();
		menu.wybor();
	}

}

class DodajKlienta {

}

class Wypozyczenia {

}

public class Biblioteka {

	public static void main(String[] args) throws IOException {

		Logowanie logowanie = new Logowanie();
		logowanie.dataOstatniegoLogowania();
		logowanie.zaloguj();
	}

}

2
  1. Nie nazywaj zmiennych i metod po polsku
  2. Wsadź każdą klasę do osobnego pliku
  3. Tablica żeby trzymać listę elementów w menu jest spoko, ale tylko jeśli mają tam być pozycje 1,2,3. Rzeczy jak tytuł menu ani tooltip "Co chcesz zrobić" już tam nie powinno być.
  4. Czemu nazywasz zmienną z instancją klasy inaczej niż klasę? Ksiazki dodajKsiazke?
  5. Zamiast wypisywać coś na ekran i robić System.exit(1) lepiej rzucić wyjątek i obsłużyć go na samej górze.
0

1/ Wiem, wiem, tutaj tylko tak zrobiłem, w sumie nie wiem po co ;p
2/ Chciałem tak zrobić, niestety Eclipse odmówił mi posłuszeństwa i klasy się nie widziały, dzisiaj może się tym pobawię i postaram ogarnąć.
3/ Spoczko, zastanawiałem się, czy nie jest to jakieś marnowanie pamięci, String jest ciągle trzymany w pamięci, natomiast sysout jest tylko wywoływany, więc nie jest ciągle utrzymywany w komórce RAMu, tak mi się przynajmniej wydaje :D
4/ Racja, nie zwróciłem większej uwagi na to :/
5/ Mógłbyś jakoś to przybliżyć lub podać kod, jak miałoby to wyglądać? Trochę nie ogarniam :/

Ogólnie to dziękuję za odpowiedź :D

1
cyjaneczek napisał(a):

2/ Chciałem tak zrobić, niestety Eclipse odmówił mi posłuszeństwa i klasy się nie widziały, dzisiaj może się tym pobawię i postaram ogarnąć.

Może zrób je public? ;)

cyjaneczek napisał(a):

3/ Spoczko, zastanawiałem się, czy nie jest to jakieś marnowanie pamięci, String jest ciągle trzymany w pamięci, natomiast sysout jest tylko wywoływany, więc nie jest ciągle utrzymywany w komórce RAMu, tak mi się przynajmniej wydaje :D

Nie martw się takimi rzeczami. Po pierwsze stringi w javie są nieedytowalnymi constami więc i tak są w ramie tylko raz. Po drugie to co trzymasz w tej swojej tablicy to referencja, a nie kopia, więc nie będzie reprezentowana dwa razy w ramie. Po trzecie (i najważniejsze) to jest mikrooptymalizacja: Twój czas zmarnowany na myślenie na ten temat jest więcej wart niż kilka bajtów które byś zaoszczędził.

cyjaneczek napisał(a):

5/ Mógłbyś jakoś to przybliżyć lub podać kod, jak miałoby to wyglądać? Trochę nie ogarniam :/

Nie podam kodu. Tutaj link: http://lmgtfy.com/?q=java+exceptions

0

Hmm, może zapomniałem wtedy public, zobaczę jeszcze raz dzisiaj lub jutro i dam znać :D
Dzięki wielkie, ogarnę temacik :D

0

I zapomnij że istnieje coś takiego jak switch.

0

Dlaczego? O.o

0

Jak masz 10 ifów sprawdzających ten sam warunek, to ludzie mówią że to g**no, ale switch z 10cioma case'ami jest już spoko? :D

Takie switche możesz zastąpić jakimiś fajniejszymi konstrukcjami albo polimorfizmem.

0

No w sumie ;p Polimorfizmu jeszcze nie miałem niestety :/ dopiero przede mną takie rzeczy. Podobno switch jest bardziej optymalny przy większej ilości warunków, ale to tam no, internety kłamią 😂 Mógłbyś podać jakąś przykładową konstrukcję? Niezbyt wiem co masz na myśli :/

EDIT: Nadal nie wiem jak ogarnąć problem z punktu drugiego :/ Przerzuciłem już wszystkie klasy do osobnych plików.

0
cyjaneczek napisał(a):

Podobno switch jest bardziej optymalny przy większej ilości warunków, ale to tam no, internety kłamią 😂

Bullshit. I tak trzeba wykonać taką samą ilość porównań.

cyjaneczek napisał(a):

No w sumie ;p Polimorfizmu jeszcze nie miałem niestety :/ dopiero przede mną takie rzeczy. Podobno switch jest bardziej optymalny przy większej ilości warunków, ale to tam no, internety kłamią 😂 Mógłbyś podać jakąś przykładową konstrukcję? Niezbyt wiem co masz na myśli :/

Nie musisz tego teraz robić na siłę.

cyjaneczek napisał(a):

EDIT: Nadal nie wiem jak ogarnąć problem z punktu drugiego :/ Przerzuciłem już wszystkie klasy do osobnych plików.

W drugim punkcie chodziło tylko o to żeby poprzerzucać klasy do osobnych plików. Więc co Ci się nie udało?

0
TomRiddle napisał(a):
cyjaneczek napisał(a):

EDIT: Nadal nie wiem jak ogarnąć problem z punktu drugiego :/ Przerzuciłem już wszystkie klasy do osobnych plików.

W drugim punkcie chodziło tylko o to żeby poprzerzucać klasy do osobnych plików. Więc co Ci się nie udało?

"Tutaj pojawia się już problem, ponieważ po przypisaniu wartości do zmiennych w metodzie dodaj(), nie są one odczytywane w metodzie wyswietlKsiazki(). Jak to naprawić?"
Po dodaniu książki, nie pokazują się żadne jej dane w klasie, która odpowiada za wyświetlenie ich w konsoli, czyli w wyswietlKsiazki() :/

1
cyjaneczek napisał(a):
TomRiddle napisał(a):
cyjaneczek napisał(a):

EDIT: Nadal nie wiem jak ogarnąć problem z punktu drugiego :/ Przerzuciłem już wszystkie klasy do osobnych plików.

W drugim punkcie chodziło tylko o to żeby poprzerzucać klasy do osobnych plików. Więc co Ci się nie udało?

"Tutaj pojawia się już problem, ponieważ po przypisaniu wartości do zmiennych w metodzie dodaj(), nie są one odczytywane w metodzie wyswietlKsiazki(). Jak to naprawić?"
Po dodaniu książki, nie pokazują się żadne jej dane w klasie, która odpowiada za wyświetlenie ich w konsoli, czyli w wyswietlKsiazki() :/

Bo dodaj() i wyswietlKsiazki() wykonujesz na dwóch różnych obiektach. Dodajesz książki do innego obiektu, a próbujesz wyświetlić z innego

0

Czyli dane, które wprowadzam, zapisują się w zadeklarowanych zmiennych w metodzie dodaj(), a nie w całej klasie Ksiazki(), tak? W jaki sposób więc mogę przypisać dane wprowadzane w metodzie do zmiennych klasy?

0

Nie w metodzie. Zapisują się w konkretnym obiekcie klasy Ksiazki - tym na którym wykonujesz tę metodę.

			Ksiazki dodajKsiazke = new Ksiazki();
			dodajKsiazke.dodaj();

Tu dodajesz książki do obiektu dodajKsiążkę klasy Książki.

			Ksiazki wyswietlKsiazki = new Ksiazki();
			wyswietlKsiazki.wyswietlKsiazki();

A wyświetlanie wykonujesz na innej instancji tej klasy - obiekcie wyswietlKsiazki. A powinieneś na tym samym co wcześniej, przy czym tutaj już nawet nie masz do niego dostępu.
Musisz sobie stworzyć jakiś jeden obiekt tej klasy w klasie Menu i z tego samego zawsze korzystać.
Tylko w ogóle masz straszne zamieszanie w tym kodzie... Zanim zabierzesz się za Javę to warto poczytać o obiektowości tak w ogóle (w sumie w tutorialach do Javy to powinno być) i zrozumieć co jest czym. W klasie Ksiazki (w jakiejś jej instancji) zapiszesz tak naprawdę jedną książkę, a dodawanie kolejnej ją nadpisze, nie wiem czy to chciałeś osiągnąć.

0

Aaaa dobra, pomyliłem lekko pojęcia ;p W sumie teraz rozumiem, gdzie popełniłem błąd z tymi zmiennymi. Wiem o tym, że zapiszę tylko jedną książkę, na razie taki jest zamiar ;) Jak wspomniałem w pierwszym poście, w późniejszym czasie chcę dodać obsługę bazy danych i dopiero wtedy program ma obsługiwać ileś tam książek :D Dzięki za uwagi, posiedzę trochę nad tą obiektowością :/

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