Dziedziczenie, ewidencja płac w firmie

0

Witam serdecznie! Jakiś czas temu wstawiłem zdjęcie poleceń dotyczących programu który mam zrobić. Ale mimo wskazówek rozkladam ręce. Wprawdzie zacząłem go robić, ale pewnie dużo rzeczy jest zle i potrzebowałbym wyjaśnienia :)

(POMOCY!) utknąłem nie wiem czy to co mam jest dobrze i jak to zrobić a tego czego nie mam to nie mam pojęcia jak ma to wyglądać :(

http://www.wklejto.pl/548630
http://www.wklejto.pl/548635
http://www.wklejto.pl/548637
http://www.wklejto.pl/548639

0

Czego oczekujesz? Że ktoś weźmie Twój cały kod, przerobi jak należy i jeszcze napisze Ci wypracowanie na ten temat!?

Poza tym przypomnij zdjęcie/wątek z poleceniami. I pytaj o fragmenty kodu, nie wrzucaj całości oczekując zbawienia.

0

Nie nie chodzi mi o gotowy kod czy metody. Tylko o sprawdzenie czy to co zrobiłem ma sens i racje bytu i jak można rozwiązać te brakujące metody i nie nie chodzi o kod tylko nakierowanie.

0
  1. Firma może zatrudniać jednocześnie max 100 pracowników i trzymać ich w jednej tablicy (patrz 2).
    Więc wydaje mi się, że powinieneś zrobić tą tablicę bez typów generycznych. Dodawanie nowego pracownika by zwiększało wartość zmiennej przechowującą ilość elementów tablicy. Analogicznie przy usuwaniu, przyda Ci się odpowiednia funkcja: https://stackoverflow.com/questions/642897/removing-an-element-from-an-array-java?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa
  2. Robisz trzy listy:
        List<Robotnik> robotnicy = new ArrayList<>();
        List<Urzędnik> urzędnicy = new ArrayList<>();
        List<Pracownik> pracownicy = new ArrayList<>();

A co jakby zrobić enuma "typ pracownika"? Robotnik np. by sobie ustawiał w konstruktorze automatycznie typPracownika = TypPracownika.ROBOTNIK;.
Miałbyś wtedy jedną tablicę Pracowników, na której byś wykonywał odpowiednie operacje i wiedziałbyś jaki pracownik się kryje pod danym indeksem tablicy. typPracownika to oczywiście pole klasy Pracownik, żeby dziedziczące klasy je miały.

0

Chciałem w ogole zrobić Enuma z możliwymi etatami ale stwierdziłem że to niej mi tak bliski temat i oprócz zapisania ciała klasy Enum nie za bardzo wiem jak się po nim poruszać :/ Jak to w praktyce wygląda?
Spróbuje tak to zrobić tylko nie za bardzo wiem jak potem sensownie wykorzystać potencjał Enuma na razie umiem go po prostu stworzyć :D
Muszę się jeszcze dużo nauczyć 😃 Widziałem na innych przykładach w temacie dziedziczenia że właśnie tworząc listę zapisuje się jako typ obiektowy właśnie nazwę klasy na której się operuje. Ponadto czytałem i chyba bezmyślnie jak regułke se wbiłem że listy są typami genetycznymi i trzeba podać typ :)

1

Mnie z kolei ciekawi co stoi za taką konwencją:

public class Firma{
    // ...
    static Firma firma = new Firma();
    // ...

No i jeszcze metoda do usuwania pracowników:

public void usuńPracownika(){
    System.out.print("Podaj nazwisko: ");
    nazwisko = scanner.next();
    pracownicy.remove(new Pracownik(nazwisko));
}

Tutaj najpierw tworzysz nowego pracownika i usuwasz tego nowo utworzonego a ten, którego chcesz usunąć pozostaje nietknięty. Bo raczej tak to zadziała.

0

Enum ma Ci tylko służyć do identyfikacji typu pracownika. Obecnie masz zależność binarną, jak pracownik nie jest robotnikiem, to jest urzędnikiem. Więc zamiast enuma można by dać pole boolean isRobotnik. Ale to nie jest rozwiązanie otwarte na ewentualne kolejne typy pracowników.

Mając takie pole, przeszukując listę możesz np. policzyć tylko elementy z polem typPracownika równym TypPracownika.ROBOTNIK. Po prostu sprawdzasz ifem wartość tego pola dla każdego elementu tablicy. I zwiększasz licznik tylko dla elementów spełniających dany warunek. Najlepsze, że możesz napisać jedną metodę zliczającą, która za argument weźmie enuma, zamiast pisać oddzielne metody dla każdego typu. Chcesz policzyć robotników? Piszesz liczPracownikow(TypPracownika.ROBOTNIK);

0
kiyo napisał(a):

Mnie z kolei ciekawi co stoi za taką konwencją:

public class Firma{
    // ...
    static Firma firma = new Firma();
    // ...

No i jeszcze metoda do usuwania pracowników:

public void usuńPracownika(){
    System.out.print("Podaj nazwisko: ");
    nazwisko = scanner.next();
    pracownicy.remove(new Pracownik(nazwisko));
}

Tutaj najpierw tworzysz nowego pracownika i usuwasz tego nowo utworzonego a ten, którego chcesz usunąć pozostaje nietknięty. Bo raczej tak to zadziała.

Zrobiłem tak żeby mieć dostęp do metod jak nie zrobiłem instancji klasy Firma to nie miałem do nich dostępu.
Co do dwa to można usuwać podany jako parametr Obiekt. Widziałem na przykładzie że ktoś właśnie podał remove(new Integer(2)) i usuwało numer 2 a nie numer o indeksie 2. Chciałem to tu wykorzystać (pewnie bezmyślnie) jak mam to zrobić? Bo muszę w remove podać obiekt albo indeks. Jeszcze nigdy nie usuwałem obiektu czy to rządzi się innymi prawami? Porównywać na przykład (pracownicy.nazwisko.equals(wprowadzoneNazwisko))?
P.S Przepraszam Od razu jak zadaje głupie pytania

0

Dzięki wielkie dzisiaj nad tym siądę i to wykorzystam. Muszę się oswoić z enumem bo to świetna sprawa a nadarzyła się odpowiednia okazja :)

0

@Adrian Paź: Z tym static Firm to jest dla mnie tak po prostu nielogiczne. Chcesz mieć firmę (zatrudniać/zwalniać pracowników, itp.) nie zakładając firmy (tworząc obiektu firma).

Co do tego usuwania to masz rację. Przytoczony przez Ciebie przykład jest poprawny. Chodziło mi o to, że u Ciebie to nie działa.

0

Faktycznie to nie ma sensu. Może zrobiłem tak bo coś mi się kompilator burzył że używam czegoś co nie jest statyczne. Sprawdzę. Mógłbyś jeszcze sprawdzić metodę znajdzPracownika? O co chodzi z ta adnotacja bo w sumie mi się dama zrobiła i nie wiem o co chodzi.
„ @SuppressWarnings("unlikely-arg-type") ”

3

Dopiero uczę się Javy, ale wydaje mi się że tworzenie metod z polskich znaków nie jest dobrym pomysłem.

0

@Adrian Paź: dobrze kombinujesz, ale nie w tą stronę.

  • Masz trzy listy, w których trzymasz pracowników w zależności od typu. Tak naprawdę nie potrzebujesz trzech list. Wystarczy jedna.
  • Dodawanie pracownika w zależności od typu całkiem ładne, bo przypadkowo wypracowałeś sobie kod oparty o wzorzec Factory (google - design patterns - factory pattern)
  • Usuwanie pracownika jest do d**y. Usuwasz tylko z jednej listy, ale nie z dwóch.
  • Wyszukiwanie jest bardzo vintage. Lepiej napisać to za pomocą strumienia:
pracownicy.stream().filter(pr-> nazwisko.equals(pr.getNazwisko())).findFirst().getOrElse(????); // co jak nie ma pracownika?
  • Nazewnictwo co do zasady angielskie powinno być, ale nie zaprzątaj sobie tym głowy na razie.
0

nazewnictwo.
w jednych miejscach masz obliczWypłate
w innych miejscach masz obliczPłace
na dodatek gdzieś tam masz zmienną w klasie pensja.

Czy wypłata, płaca i pensja to 3 oddzielne koncepcje? Czym się to różni? Jeśli niczym, to tworzenie synonimów jest bez sensu, sprawia, że kod jest niespójny i tylko to potem myli kogoś, kto czyta taki kod.

Pomijając, że kod jest po polsku (ale jakbyś pisał po angielsku to tak samo mógłbyś wpaść na pomysł, żeby używać jednocześnie na określenie tego samego wage, salary i earnings, co byłoby podobnie mylące.

Poza tym ciekawi mnie czy powtarzanie tego samego kodu konstruktora w każdej klasie jest konieczne:

        public Urzędnik(String nazwisko, double etat)
        {
                super(nazwisko, etat);
        }
        public Urzędnik(String nazwisko)
        {
                super(nazwisko)
        }

Dla mnie takie coś to duplikacja kodu i niepotrzebny kod (po co tworzyć coś, co tylko wywołuje przodka?), ale nie wiem, może to jakieś ograniczenie Javy i tak trzeba? Może ktoś inny się wypowie.

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