• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Usunąć gettery i settery czy usunąć metody z klasy Tasker - ToDoApp

Object Storage Arubacloud
0 głosów
265 wizyt
pytanie zadane 8 lutego 2018 w Java przez must Bywalec (2,980 p.)
edycja 8 lutego 2018 przez must

Cześć, jestem na końcówce mojego konsolowego programu ToDo.

Moim zamysłem było, by każdy z użytkowników miał swoją uniwersalną listę czynności do zrobienia.

Jak już wspominałem w poprzednim pytaniu, tworzenie i logowanie się jest dla trochę dla picu, ale nie potrafię jeszcze baz danych. 

Stworzyłem klasę User,w której umieściłem dane takie jak login, password, listę czynności, a także klasę Tasker, która odpowiada za dodawanie tychże czynności. I teraz właśnie zrobiłem kółko, bo w Taskerze NIBY mam dodawanie czynności i ich wyświetlanie, a w Userze mam znów settera i gettera. Nie wiem które mam usunąć oraz jak zrobić, żeby za pomocą settera właśnie przejąć tę listę z Taskera, który najpierw doda jakieś tam taski.

Tzn. tak jak zobaczycie w klasie ToDoEngine przejąłem tę Listę z Taskera, ale jest ona pusta i nie wiem jak z tego wybrnąć ani jak zrobić żeby było dobrze.

Troche zawile napisałem, ale mam nadzieje ze zrozumiecie.

dzieki za odpowiedz

User

import java.util.List;

public class User {
    private String login;
    private String password;
    private List<String> tasks;
    private Tasker task;

    public User(String login, String password) {
        this.login = login;
        this.password = password;
    }

    public User() {
        this.task = task;
    }

    public void setTasks(List<String> tasks) {
        this.tasks = tasks;
    }

    List<String> getTasks() {
        return tasks;
    }

    String getPassword() {
        return password;
    }

}

 AccountMaker(odpowiedzialna za tworznie konta)

import java.util.HashMap;
import java.util.Scanner;

public class AccountMaker {

    private HashMap<String, User> loginDetails = new HashMap<>();
    private String login, password;
    private Scanner input = new Scanner(System.in);


    public void inputLoginAndPassword() {
        System.out.println("Input your login");
        login = input.next();

        System.out.println("Input your password");
        password = input.next();
    }

    public void createAccount() throws InterruptedException {
        User newUser = new User(login, password);
        loginDetails.put(login, newUser);
        System.out.println("Account has been created successfully");
        Thread.sleep(2000);
    }

    HashMap<String, User> getLoginDetails() {
        return loginDetails;
    }

}

 AccountLogger (odpowiedzialna za logowanie)

import java.util.Scanner;

public class AccountLogger {

    private AccountMaker accountMaker;
    private Scanner input = new Scanner(System.in);
    private String login, password;


    public AccountLogger(AccountMaker accountMaker) {
        this.accountMaker = accountMaker;
    }


    public void inputLoginAndPassword() {
        System.out.println("Input your login");
        login = input.next();

        System.out.println("Input your password");
        password = input.next();
    }

    public boolean isLoginDataIncorrect() {
        User user = accountMaker.getLoginDetails().get(login);
        try {
            if (user.getPassword().equals(password)) {
                System.out.println("You've logged in.");
                return false;
            } else {
                System.out.println("Bad login or password");
            }
        } catch (NullPointerException e) {
            System.out.println("Bad login or password");
        }
        return true;
    }
}

Tasker


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

public class Tasker {
    private User user;
    public List<String> listOfTasks = new ArrayList<>();

    public Tasker(User user) {
        this.user = user;
    }


    public void createTask(String task) {
        listOfTasks.add("gotowanie");
        listOfTasks.add("pranie");
        listOfTasks.add(task);
    }

    public void showAllTasks() {
        for (int i = 0; i < listOfTasks.size(); i++) {
            System.out.println(listOfTasks.get(i));
        }
    }
}

ToDoEngine (coś jakby silnik całej apki :D, łączy wszystkie klasy w jedno)

import java.util.InputMismatchException;
import java.util.Scanner;

public class ToDoEngine {

    private Scanner input = new Scanner(System.in);
    private AccountMaker accountMaker = new AccountMaker();
    private AccountLogger accountLogger = new AccountLogger(accountMaker);
    private boolean loopIsTrue = true;
    Tasker tasks = new Tasker();
    User user = new User(tasks);

   [...]

    public void userMenu() {
        System.out.println("What do you wanna to do?");
        System.out.println("1. Add Task 2. Show my tasks 3. Exit");
        int option = input.nextInt();
        if (option >= 1 && option <= 2) {
            switch (option) {
                case 1:
                    System.out.println("Write down your task.\nYour list will be refreshed");
                    String z = "test";
                    tasks.createTask(z); //
                    tasks.showAllTasks(); //
                    user.setTasks(tasks.listOfTasks); /// it's usless
                    user.getTasks();  // it's usless

                case 2:
                    System.out.println("Your task list:");
                case 3:
                    break;
            }
        }
    }
}

 

1 odpowiedź

+1 głos
odpowiedź 8 lutego 2018 przez adas94 Nałogowiec (29,200 p.)
wybrane 8 lutego 2018 przez must
 
Najlepsza

Jeżeli User ma pole Tasker (które ma w sobie tasks), to po co Userowi Lista tasków i Tasker? 

public class User {
    private String login;
    private String password;
    private List<String> tasks;
    private Tasker task;
...

I jeżeli każdy User ma swój Tasker, to w Tasker nie musi być pola User, bo wiadomo który Tasker do kogo należy. 

Chcesz dodać Userowi taska? Dobierasz się do Taskera danego usera przy pomocy gettera, a potem operujesz na taskerze. 

Chcesz wyświetlić wszystkie taski Usera? Dobierasz się do Taskera danego usera i z taskera wywołujesz metodę odpowiadającą za wyświetlenie tasków. 

Trochę przekombinowałeś z tym swoim przykładem. 

komentarz 8 lutego 2018 przez must Bywalec (2,980 p.)

To o to chodziło?

public class User {
    private Tasker tasks;
    private String login;
    private String password;

    public User(String login, String password) {
        this.login = login;
        this.password = password;
    }

    public User(Tasker tasks) {
        this.tasks = tasks;
    }

    public Tasker getTasks() {
        return tasks;
    }
    String getPassword() {
        return password;
    }

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

public class Tasker {
    public List<String> listOfTasks = new ArrayList<>();


    public void createTask(String task) {
        listOfTasks.add("gotowanie");
        listOfTasks.add("pranie");
        listOfTasks.add(task);
    }

    public void showAllTasks() {
        for (int i = 0; i < listOfTasks.size(); i++) {
            System.out.println(listOfTasks.get(i));
        }
    }
}

 

komentarz 8 lutego 2018 przez adas94 Nałogowiec (29,200 p.)

Możesz to zrobić na kilka sposobów, np. 

Tasker:

public class Tasker {
    private List<String> tasks;

    public Tasker() {
        this.tasks = new ArrayList<>();
    }

    public void addNewTask(String task) {
        tasks.add(task);
    }

    public void showAllTasks() {
        for (String task : tasks) {
            System.out.println(task);
        }
    }
}

User:

public class User {
    private Tasker tasker;
    private String login;
    private String password;

    public User(String login, String password) {
        this.login = login;
        this.password = password;
    }

    public User(Tasker tasker) {
        this.tasker = tasker;
    }


    public void addNewTask(String task) {
        tasker.addNewTask(task);
    }

    public void showAllTasks() {
        tasker.showAllTasks();
    }
}

Main:

public class Main {

    public static void main(String[] args) {
        User user = new User(new Tasker());
        user.addNewTask("Pranie");
        user.addNewTask("Gotowanie");

        user.showAllTasks();
    }
}

Dzięki temu masz rozgraniczenie i uporządkowany kod. Tasker działa na najniższym poziomie i jest w nim zawarta implementacja dodawania do listy czy też dodawanie nowego taska. W klasie User masz to samo działanie (bo w końcu chcesz żeby to User mógł dodawać taski itd) ale już na wyższym poziomie abstrakcji. User już nie widzi jak są dodawane taski do listy (to masz w Taskerze), a User ma po prostu w sobie Tasker i wie, że Tasker jakoś te taski obsłuży i nie obchodzi go jak. 

komentarz 8 lutego 2018 przez must Bywalec (2,980 p.)

Bardzo fajne rozwiązanie, zmieniłem to żeby było tak samo.

Lecz mam pytanie, czy tak jak ja zrobiłem jest źle? Niby działa, ale czy jest poprawnie obiektowo, przy wywołaniu bym miał takie coś: 

user.getTasks().createTask();

 

1
komentarz 8 lutego 2018 przez adas94 Nałogowiec (29,200 p.)

Mógłbyś tak mieć, natomiast zauważ, że w ten sposób odsłaniasz całe pole. 

user.getTasks(). // tutaj po drugiej kropce masz dostęp do wszystkich metod Taskera

A w programowaniu obiektowym głównie chodzi o zamykanie implementacji w środku a eksponowanie tylko takich elementów jakie chcesz wyeksponować. 

Wyobraź sobie, że prowadzisz samochód i używasz skrzyni biegów. Powinieneś móc tylko zmieniać biegi, a więc :

user.changeGear(3);  - tutaj jest w porządku

Natomiast Ty proponujesz:

user.getGearbox().changeGear(3) - niby robi to samo, ale zauważ że odsłoniłeś całą implementację skrzyni biegów i np można wywołać

user.getGearbox().setNumOfGears(6) - bum, i nagle user który miał tylko jeździć samochodem jest w stanie w locie zmienić sobie liczbę biegów w aucie z 5 na 6 ;D

Mam nadzieję, że ten przykład rozświetlił Ci nieco zasadę ukrywania implementacji w środku klas. 

 

1
komentarz 8 lutego 2018 przez must Bywalec (2,980 p.)
O tak, dzięki wielkie. Wszystko rozumiem! :)

Podobne pytania

0 głosów
1 odpowiedź 593 wizyt
pytanie zadane 30 listopada 2020 w Java przez Kuciniak Użytkownik (920 p.)
0 głosów
1 odpowiedź 479 wizyt
pytanie zadane 30 kwietnia 2018 w Java przez Adrian Paź Obywatel (1,270 p.)
0 głosów
1 odpowiedź 457 wizyt
pytanie zadane 25 listopada 2021 w Python przez doskanoness Obywatel (1,240 p.)

92,573 zapytań

141,423 odpowiedzi

319,645 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...