Wątek przeniesiony 2016-11-16 13:50 z Java przez bogdans.

Obiektowe, wczytywanie danych.

0

Witam.
Piszę łatwy program o treści;

Napisz program, w którym:

zdefiniujesz klasę Uczeń o polach:

  • Imię

  • Nazwisko

  • Pesel
    zdefiniujesz metody:

  • Ustaw_Imię, gdzie użytkownik będzie mógł podać imię

  • Ustaw_nazwisko, gdzie użytkownik będzie mógł podać nazwisko

  • Ustaw_pesel, gdzie użytkownik będzie mógł podać pesel

Zadanie 7: Zmodyfikuj powyższy program. Dodaj klasę UczeńSzkoły, która:

  • dziedziczy z klasy Uczeń
  • zawiera dodatkowe pole: Nazwa_szkoły
  • zawiera dodatkową metodę: Ustaw_szkołę, gdzie użytkownik może wstawić nazwę szkoły
package uczentest;

import java.util.Scanner;

/**
 *
 * @author *****
 */
public class Uczen {

    String imie;
    String nazwisko;
    String pesel;
    private Scanner odczyt;

    public Uczen() {
    }  
    
    public String UstawImie() {
        //obiekt do odebrania danych od użytkownika
        odczyt = new Scanner(System.in);
        System.out.println("Podaj imie: ");
        imie = odczyt.nextLine();
        return imie;
    }

    public String UstawNazwisko() {
        //obiekt do odebrania danych od użytkownika
        odczyt = new Scanner(System.in);
        System.out.println("Podaj nazwisko: ");
        nazwisko = odczyt.nextLine();
        return nazwisko;
    }

    public String UstawPesel() {
        //obiekt do odebrania danych od użytkownika
        odczyt = new Scanner(System.in);
        System.out.println("Podaj pesel: ");
        pesel = odczyt.nextLine();
         while (pesel.length() != 11) {
           pesel = odczyt.nextLine();
        }
        return pesel;
    }
}

Co prawda w kompilatorze nie wyświetla się żaden błąd, ale czy tak można postępować z deklaracją zmienną służącą do pobrania wartości od użytkownika? Czyli ustawienie jako pole danej klasy instrukcji:

private Scanner odczyt;

?

2

Powinieneś rozdzielić model programu(logikę biznesową) od warstwy widoku(w tym konkretnym przypadku strumień wyjścia), tych warstw nie można mieszać, nie możesz uzależnić logiki Twojego programu z warstwą prezentacji, bo co w przypadku jeśli ona się zmieni? Prościej mówiąc - Tworzysz klasę Uczen posiadającą wymagane pola(zwróć uwagę na specyfikatory dostępu, w Twoim przypadku widzę, że są one pakietowe, nie potrzebnie, zrób te pola prywatnymi). Do klasy dodajesz gettery, settery(lecz miej na uwadze, że nie jest dobrą praktyką tworzenia ich zawsze i wszędzie gdzie popadnie). Następnie tworzysz sobie klasę do "wyświetlania" danych i ich wczytywania, tutaj korzystasz z obiektu klasy Scanner oraz obiektów klasy Uczen.

0

1.Czy aby na pewno nie masz zrobić zwykłego settera?

public void ustawPesel(String pesel) {
  this.pesel = pesel;
}

Robienie tego w Twój sposób znacznie zmniejsza przydatność takiej klasy (co jeśli chciałbyś wczytać dane z pliku albo bazy danych?)

2.Dlaczego w metodzie UstawPesel dokonujesz walidacji wprowadzonych danych? Nie należy to do funkcjonalności tej metody (powinieneś weryfikację wydzielić do osobnej metody bool czyPeselPoprawny(String pesel);).

0

Ale jeśli użyje seterów i getterów to wtedy dane bym musiał poddawać jako argument, a jakbym chciał żeby to użytkownik poddał z klawiatury?? Czy może tak się nie powinno robić? A sprawie pesel`a, to samodzielnie chciałem dodać jakieś dodatkowe warunki w oderwaniu od treści zadania, które w necie znalazłem w celu poćwiczenie/utrwalenia wiadomości :-)

1

Nie mieszając, najprościej, bez żadnej walidacji danych wejściowych:

class Student{

    private String name;
    private String superName;
    private String id;
    
    public String getName() {
        return name;
    }

    public String getSuperName() {
        return superName;
    }

    public String getId() {
        return id;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setSuperName(String superName) {
        this.superName = superName;
    }

    public void setId(String id) {
        this.id = id;
    }
}
class Main{

    public static void main(String args[]){

        Scanner scanner = new Scanner(System.in);
        Student student = new Student();
        
        System.out.println("Podaj imie");
        student.setName(scanner.nextLine());

        System.out.println("Podaj nazwisko");
        student.setSuperName(scanner.nextLine());

        System.out.println("Podaj pesel");
        student.setId(scanner.nextLine());
    }
}
0

W ten sposób to należy robić :O Dzięki za pomoc.

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