Wątek przeniesiony 2016-05-20 11:31 z Java przez ŁF.

tworzenie obiektów i powiązania z klasami

2016-05-18 22:23

Rejestracja: 4 lata temu

Ostatnio: 1 miesiąc temu

0

3 klasy: Kasa, Paragon i Pozycja. oraz główna o nazwie Main

I ogolnie w klasie main tworze obiekt klasy Kasa , i nie wiem jak polaczyc zeby paragony byly tworzone przez klase Kasa?? czyli dodawane do Kasy.

public class Kasa {
    private String nip;
    private String nazwa;
    private String adres;
    private int numerUrzadzenia;

    public Kasa(String nip, String nazwa, String adres, int numerUrzadzenia) {
        this.nip = nip;
        this.nazwa = nazwa;
        this.adres = adres;
        this.numerUrzadzenia = numerUrzadzenia;     //cena pojedynczej sztuki

    } 

    public String getNip() {
        return nip;
    }

    public String getNazwa() {
        return nazwa;
    }

    public String getAdres() {
        return adres;
    }

    public int getNumerUrzadzenia() {
        return numerUrzadzenia;
    }

}
import java.util.Date;

public class Paragon {
    Pozycja [] pozycje;
    int ileDodanych = 0;
    int maksymalnyRozmiar;

    public Paragon() {
        maksymalnyRozmiar = 10;
    }

    public Paragon(int liczbaPozycji) {
        pozycje = new Pozycja[liczbaPozycji];
    }

    void dodajPozycje(Pozycja p) {
        if(ileDodanych < maksymalnyRozmiar) {
            pozycje[ileDodanych] = p;
        }

    }

    double obliczWartosc() {
        double wartosc = 0.0;

        for(int i = 0; i <= maksymalnyRozmiar; i++) {
            wartosc += pozycje[i].obliczWartosc();
        }

        return wartosc;
    }

    public String toString() {
        return ""+new Date();
    }

}

public class Pozycja {
    private String nazwaTowaru;
    private int ileSztuk;
    private double cena;    //cena pojedynczej sztuki

    public Pozycja(String nazwaTowaru, int ileSztuk, double cena) {
        this.nazwaTowaru = nazwaTowaru;
        this.ileSztuk = ileSztuk;
        this.cena = cena;
    }

    public double obliczWartosc() {
        return cena * ileSztuk;
    }

    public String toString() {
        return nazwaTowaru + " " + cena + " " + ileSztuk + " " + obliczWartosc();
    }

}
edytowany 1x, ostatnio: dominikzaq, 2016-05-18 22:24

Pozostało 580 znaków

2016-05-18 22:39

Rejestracja: 4 lata temu

Ostatnio: 1 rok temu

0

Jak mają być tworzone te paragony? Zapewne chcesz stworzyć metodę drukujParagon w kasie i przekazywać do niej listę zakupów, a ma to sens, ponieważ paragon powinien raczej posiadać dane typu nip, adres. A je posiada kasa. Ale nie mam pojęcia co chciałeś powiedzieć przez to:

tworzone przez klase Kasa czyli dodawane do Kasy.

Do obiektu kasy chciałbym dodawać do niego paragony, czyli najlepszym rozwiązaniem byloby stworzenie tablicy w klasie Kasa i wrzucanie do nich obiektow Paragon??? - dominikzaq 2016-05-18 22:45

Pozostało 580 znaków

2016-05-18 22:39

Rejestracja: 11 lat temu

Ostatnio: 1 rok temu

Lokalizacja: Norwegia, Stavanger

1

Chyba najprościej coś takiego:

public class Kasa {
        private String nip;
        private String nazwa;
        private String adres;
        private int numerUrzadzenia;
        private List<Paragon> paragonList;

    public Kasa(String nip, String nazwa, String adres, int numerUrzadzenia) {
            this.nip = nip;
            this.nazwa = nazwa;
            this.adres = adres;
            this.numerUrzadzenia = numerUrzadzenia;     //cena pojedynczej sztuki
            this.paragonList = new ArrayList();
    } 

    public void addParagon(Paragon paragon){
        this.paragonList.add(paragon);
    }
}

Pozostało 580 znaków

2016-05-18 22:46

Rejestracja: 4 lata temu

Ostatnio: 1 rok temu

0

Do obiektu kasy chciałbym dodawać do niego paragony, czyli najlepszym rozwiązaniem byloby stworzenie tablicy w klasie Kasa i wrzucanie do nich obiektow Paragon???

Nie, @shagrin podała Ci najlepsze rozwiązanie.

edytowany 1x, ostatnio: Jaca777, 2016-05-18 22:59
tak podal tylko chcialem jeszcze ci odpisac xD - dominikzaq 2016-05-18 22:49
czy ja wyglądam jak facet na tym zdjęciu? o.O :D - shagrin 2016-05-18 22:56
@shagrin raczej... nie. Przepraszam :D - Jaca777 2016-05-18 22:59
@Jaca777 trochę... tak xD - shagrin 2016-05-18 23:01
a mała literówka shagrin :) przepraszam bardzo - dominikzaq 2016-05-18 23:04
@shagrin Przyjrzałem się, i stwierdziłem, że jednak nie... :v - Jaca777 2016-05-18 23:05

Pozostało 580 znaków

2016-05-19 10:24

Rejestracja: 4 lata temu

Ostatnio: 1 miesiąc temu

0

a jeszcze takie pytanie:
w klasie Paragon dodalem metode:
String [] wypiszTablice() {
String [] pomocniczaTablica = new String[maksymalnyRozmiar];
for(int i = 0; i < maksymalnyRozmiar; i++) {
pomocniczaTablica[i] = pozycje[i].toString();
}
return pomocniczaTablica;
}

i gdy chce odwolac sie do tej metody zamiast wypisywac z klasy pozycja metode toString wypisuje np.

pozycje: [Ljava.lang.String;@1a6d3ca2
pozycje: [Ljava.lang.String;@69d93be
pozycje: [Ljava.lang.String;@534ea256

Pozostało 580 znaków

2016-05-19 10:24

Rejestracja: 12 lat temu

Ostatnio: 4 dni temu

3

@Jaca777, ja bym się nie zgodził ze stwierdzeniem, że to najlepsze rozwiązanie... W praktyce można zrobić kasie dowolną krzywdę np. zmienić już dodany paragon.

public abstract class Kasa {

    private final String nip;
    private final String nazwa;
    private final String adres;
    private final int numerUrzadzenia;
    private final List<Paragon> paragony;

    protected Kasa(String nip, String nazwa, String adres, int numerUrzadzenia) {
        this.nip = nip;
        this.nazwa = nazwa;
        this.adres = adres;
        this.numerUrzadzenia = numerUrzadzenia;
        this.paragony = Lists.newLinkedList();
    }

    private Kasa(Kasa kasa) {
        this.nip = kasa.nip;
        this.nazwa = kasa.nazwa;
        this.adres = kasa.adres;
        this.numerUrzadzenia = kasa.numerUrzadzenia;
        this.paragony = kasa.paragony;
    }

    public final Kasa nowaTransakcja(String nip, String nazwa, String adres, int numerUrzadzenia) {
        return new OtwartaTransakcja(nip, nazwa, adres, numerUrzadzenia);
    }

    public abstract Kasa zakoncz();

    public abstract Kasa dodajPozycję(Pozycja pozycja);

    private class ZakonczonaTransakcja extends Kasa {

        public ZakonczonaTransakcja(OtwartaTransakcja otwartaTransakcja) {
            super(otwartaTransakcja);
        }

        @Override
        public Kasa zakoncz() {
            return this;
        }

        @Override
        public Kasa dodajPozycję(Pozycja pozycja) {
            throw new UnsupportedOperationException("Paragon zamknięty");
        }
    }

    private class OtwartaTransakcja extends Kasa {

        private Paragon otwartyParagon;

        OtwartaTransakcja(Kasa other) {
            super(other);
            otwartyParagon = new Paragon();
        }

        public OtwartaTransakcja(String nip, String nazwa, String adres, int numerUrzadzenia) {
            super(nip, nazwa, adres, numerUrzadzenia);
        }

        @Override
        public Kasa zakoncz() {
            paragony.add(otwartyParagon);
            return new ZakonczonaTransakcja(this);
        }

        @Override
        public Kasa dodajPozycję(Pozycja pozycja) {
            otwartyParagon.dodajPozycje(pozycja);
            return this;
        }
    }

}

Kasa ma stan. Pracuje z jednym paragonem na raz. Paragon jest produktem kasy, a nie jej częścią. Można by jeszcze pobawić się i wyeliminować te Stringi na początku zastępując ValueObjectami by nie można było jako NIPu podać na przykład "Miś Uszatek". To już są jednak szczegóły.

//edit: drobna poprawka w kodzie by tego można było używać.

edytowany 1x, ostatnio: Koziołek, 2016-05-19 10:28
ciekawe rozwiązanie - garai 2016-05-19 11:21
koziołek, OOP to generalnie bulshit (z naciskiem na SHIT) - OtwartaTransakcja rozszerza Kase? serio - maryiusz 2016-05-19 11:26
@maryiusz, nazwij to KasaZOtwartymParagonem i KasaBezAktywnegoParagonu. Masz dwie klasy. Spróbuj teraz na którejś wywołać niepoprawną biznesowo operacje np. skasować towar nie mając otwartego rachunku. - Koziołek 2016-05-19 11:33

Pozostało 580 znaków

2016-05-19 10:45

Rejestracja: 11 lat temu

Ostatnio: 1 rok temu

Lokalizacja: Norwegia, Stavanger

0

Z tego co się orientuje, owszem kasa ma stan, ale jednak trzyma tez wszystkie paragony, nie tak?
Poza tym, jak już mamy wchodzić w szczegóły, wydaje mi się, ze brakuje jeszcze kasjera, który na danej kasie w danej chwili pracuje. Info o kasjerze powinno być tez na paragonie.

Kolejna sprawa, wydaje mi się, ze kolega który zadał pytanie jest początkujący i próbuje ogarnąć podstawy Javy, takim kodem mocno mieszasz.

Moze to kwestia niefortunnego nazewnictwa, ale jak zobaczyłam to:
private class ZakonczonaTransakcja extends Kasa
i to
private class OtwartaTransakcja extends Kasa

to pierwsze co mi przyszło do głowy, to ze przy każdym nowym kliencie użytkownik loguje się do kasy (otwiera kasę), i wylogowuje (zamyka kasę) po skasowaniu wszystkich produktów.


tak dokładnie kasa musi przechowywać wszystkie paragony :) - dominikzaq 2016-05-19 10:50

Pozostało 580 znaków

2016-05-19 10:53

Rejestracja: 12 lat temu

Ostatnio: 4 dni temu

1

private final List<Paragon> paragony; – rolka w kasie.

Kwestia nazewnictwa, OK. Kasjer nie jest tu potrzebny, bo kasa nic nie wie o kasjerze. To jest wiedza "systemowa", czyli poziom wyżej np. StanowiskoKasowe (ciekawy przypadek DDD).

shagrin napisał(a)

Kolejna sprawa, wydaje mi się, ze kolega który zadał pytanie jest początkujący i próbuje ogarnąć podstawy Javy, takim kodem mocno mieszasz.

Serio? Nikt nie powiedział, że programowanie to łatwy kawałek chleba.

shagrin napisał(a)

ze przy każdym nowym kliencie użytkownik loguje się do kasy (otwiera kasę), i wylogowuje (zamyka kasę) po skasowaniu wszystkich produktów.

Też nie, bo masz przepływ otwarta → zamknięta → otwarta → … itd. Całość jest serią kopiowań stanu obiektu. Jednak zgodzę się, że nazewnictwo może tu zamieszać.

Pokaż pozostałe 3 komentarze
Czyli zapewne na świętej nigdy... za długo siedzę w tym biznesie, by uwierzyć, że jakość będzie wzrastać z czasem. - Koziołek 2016-05-19 11:47
Jedyne co mogę to powiedzieć, ze mi przykro ze w "takim" biznesie siedzisz. - shagrin 2016-05-19 11:52
Popracujesz kilka lat w IT to też dojdziesz do tego wniosku. - Koziołek 2016-05-19 11:56
Pracuje kilka lat w IT.. ale patrze ze Koziołku wszystkie środowiska IT obskoczyłeś? - shagrin 2016-05-19 12:01
Poza budową promów kosmicznych i elektrowni atomowych. - Koziołek 2016-05-19 12:05

Pozostało 580 znaków

2016-05-20 09:29

Rejestracja: 4 lata temu

Ostatnio: 1 miesiąc temu

0

teraz wymyśliłem inny problem i nie za bardzo wiem jak połączyć te klasy:
Bankomat, Konto, Karta , (program ogólnie miałby realiować wypłate środków z bankomatu za pomoca kartydebetowej) czyli karta powinna rozszerzać klase Konto, dobrze mowie,bo karta jest można powiedzieć częścią konta a moze byc karta klasa zagniezdzona w klasie konto ?? wlasnie nie mam pomysłu jak podejść do problemu :)


import java.util.ArrayList;
import java.util.Date;

public class Bankomat {
     private static int idBankomatu;
     private static String lokalizacjaBankomatu;
     private static String infoBank;                //okresla bank do ktorego bankomat nalezy 
     private static Konto konto;
     private ArrayList<Karta> karta;

     /*
      * 
      */
     Bankomat(int id ,String b) {
         idBankomatu = id;
         infoBank = b;
         karta = new ArrayList<>();
     }

     public void dodajKarte(Karta karta) {
         this.karta.add(karta);
     }

     /*
      * sprawdz bank jesli jest inny dolicz prowizje od transakcji
      */
     public void sprawdzBank(String nazwaBanku) {
         if(infoBank != nazwaBanku) {

         }
     }

     public void wyplacSrodki(int wyplac) {
        //sprawdzBank(karta.);
        konto.wyplacSrodki(wyplac);
     }

     public void wplacSrodki(int wplac) {
        konto.wplacSrodki(wplac);
     }

     /*
      * wydruk wszystkich transakcji o okreslonej dacie
      */
     public void wydrukujTransaksje(Date date) {

     }

     public void potwierdzenieTransaksji() {

     }

     public  String toString() {
         return "";
     }
}

public class Konto {
    private String rodzajKonta;
    private String daneWlasciciela;
    private int dostepneSrodki = 60;

    public Konto() {

    }

    public void wyplacSrodki(int wyplac) {

        if(wyplac < dostepneSrodki) {
            dostepneSrodki -= wyplac;
            System.out.println("Na koncie pozostalo " + dostepneSrodki + "oraz wyplacono" + wyplac);
        }

        else {
            System.out.println("Posiadasz za malo srodkow na koncie " + dostepneSrodki);
        }
    }

    public void wplacSrodki(int wplac) {
        dostepneSrodki += wplac;
        System.out.println("Na koncie znajduje sie teraz " + dostepneSrodki + " zl");
    }

    public void przelej(int pieniadze, int numerKonta) {
        if(pieniadze < dostepneSrodki) {

        }
    }

    public String stanKonta() {
        return "dane wlasciciela: " + daneWlasciciela + "\n" + 
                "Twoj stan konta wynosi: " + dostepneSrodki +"\n" +
                "rodzaj konta: " + rodzajKonta;
    }

}
public class Karta {
    private long numer;
    private String daneWlasciciela;
    private String waznoscKarty;
    private String infoBankowe;

    public Karta(long numer, String daneWlasciciela, String waznoscKarty, String infoBankowe) {
        this.numer = numer;
        this.daneWlasciciela = daneWlasciciela;
        this.waznoscKarty = waznoscKarty;
        this.infoBankowe = infoBankowe;
    }

    public long getNumer() {
        return numer;
    }

    public String getDaneWlasciciela() {
        return daneWlasciciela;
    }

    public String getWaznoscKarty() {
        return waznoscKarty;
    }

    public String getInformacjBankowe() {
        return infoBankowe;
    }

}
public class Main {
    public static void main(String [] args) {
        Bankomat bankomat1 = new Bankomat(6530355,"ipko");
        Karta k1 = new Karta(963731005,"Marcin Nowak", "16-12-2020","BGZ");
        bankomat1.dodajKarte(k1);
    }

}
edytowany 1x, ostatnio: dominikzaq, 2016-05-20 09:29

Pozostało 580 znaków

2016-05-20 09:35

Rejestracja: 12 lat temu

Ostatnio: 4 dni temu

1

Karta nie jest kontem. Karta powinna być przypisana do konta. I w tym przypadku wydziel klasę InfoBank, bo masz takie pole w kilku miejscach i warto mieć tu coś więcej niż "goły" String

Pozostało 580 znaków

2016-05-20 10:05

Rejestracja: 4 lata temu

Ostatnio: 1 miesiąc temu

0

dobra już zrobilem dodatkowa klase InfoBank(pola w niej przypisałem jako protected oraz metody również) i te 2 klasy dziedziczą po tej klasie i dzięki tobie teraz to lepiej wygląda, a nie za bardzo rozumię tej twojej myśli Karta powinna być przypisana do konta. czyli jak teraz to zrobilem np. mozna przez polimorfizm sie odwolywac

Pozostało 580 znaków

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