Eerste eigen applicatie

Status
Niet open voor verdere reacties.

Clemens Schalkw

Gebruiker
Lid geworden
5 dec 2007
Berichten
166
Ik wist geen betere topicnaam, excuus hiervoor.
Ik ben voor mijn opleiding (HBO Software Engineer) bezig met Java.
Opzich lukt het me aardig goed om code te lezen en te begrijpen (voor zover ik nu gezien heb), maar nu moet ik een "echte" applicatie maken.

Ik vraag nadrukkelijk niet of iemand mijn opdracht wil maken, maar graag ontvang ik wat handvatten waar ik iets mee kan.

Kan iemand mij opweg helpen?
De eerste vragen die ik heb:

1. hoe weet ik nou precies welke instance-variabelen je als static declareerd?
2. wat wordt er bedoeld met a onder "De volgende methods komen voor in het programma"?
3. is het handig om een interface te maken of een superclass met daarin (private) de naw-gegevens (deze kunnen namelijk gelden voor klant, kok en bezorger) ?

De rest van de vragen komen vast als ik eenmaal bezig ben.
Alvast bedankt voor de hulp.


Hieronder de gehele opgave:

De opdracht is het opzetten van een proefapplicatie voor een shoarmatent.
De volgende classes komen minimaal voor: Kok, Bezorger, Klant, DamascusShoarma. De laatste class is een demonstratie, met een main method.
Dit zijn niet alle noodzakelijke classes! Er zijn dus nog meer classes nodig. De applicatie dient optimaal gebruik te maken van OO.

De volgende instance-variabelen komen voor in het programma;

1.String naam;
2.String adres;
3.String postcode;
4.String woonplaats;
5.boolean kookboek;
6.int aantalkoks;
7.boolean eigenbrommer;
8.int aantalgezorgers;
9.int sofinummer;
10.double salaris.

De volgende methods komen voor in het programma:

a. no-arg constructors en overloaded constructors voor alle instance variabelen in een class
b. getter en setter methods voor alle non static instance variabelen;
c. tevreden() [klant methode, die een tevreden tekst op het scherm zet];
d. telkoks() [Geeft het totaal aantal koks terug];
e. getaantalbezorgers() [geeft het totaal aantal bezorgers terug];
f. bezorgen(Klant a).

Eisen DamascusShoarma class:

a. bevat twee koks en twee bezorgers, met compleet verzonnen naw-gegevens;
b. bevat een klant met verzonnen naw-gegevens;
c. laat zien dat het aantal bezorgers en koks correct door de applicatie worden geteld, met een print
op het scherm;
d. laat een bezorger een broodje bij de klant bezorgen.
 
Laatst bewerkt:
I
1. hoe weet ik nou precies welke instance-variabelen je als static declareerd?

Je maakt de variabele static als ze over elke instantie dezelfde waarde moeten hebben:).
vb: een klasse product, met membervariabelen naam, gewicht, aantal.
nummer is hier hoeveel stuks er nu nog zijn van dit product.
In de constructor zal je dan ++aantal zetten.
PHP:
product a = new Product( );
a.GetAantal( ) // geeft 1
product b = new Product( );
a.GetAantal( ) // geeft 2

I
2. wat wordt er bedoeld met a onder "De volgende methods komen voor in het programma"?
Code:
De volgende methods komen voor in het programma:

a. no-arg constructors en overloaded constructors voor alle instance variabelen in een class
hier wordt mee bedoeld dat je voor elke klasse een default en een overloaded constructor moet schrijven.
neem weer de product klasse dan moet je bijvoorbeeld dit schrijven:
PHP:
public Product( ) {
 ++aantal;
 // enkele initialisatie opdrachten
}

public Product( String naam, double gewicht ) {
 ++ aantal;
this->naam = naam;
this->gewicht = gewicht;
}
3. is het handig om een interface te maken of een superclass met daarin (private) de naw-gegevens (deze kunnen namelijk gelden voor klant, kok en bezorger) ?

Het lijkt me het beste om een klasse Persoon te maken met
PHP:
1.String naam;
2.String adres;
3.String postcode;
4.String woonplaats;

en hier een kok, bezorger, klant van af te leiden.
Bij OO moet je eigenlijk gewoon kijken naar wat kan samen worden gezien? en hier leidt je de andere klassen dat uit af.
 
Ok, dank je wel.
Dit is redelijk duidelijk.
Alleen dat over static begrijp ik nog niet helemaal.
Je gebruikt static als de waarde van je variabele overal gelijk moet zijn, dat begrijp ik, maar ik zie niet welke instance-variabelen ik in mijn casus static zou moeten maken.
Kun je dat al van te voren bepalen of kom je daar tijdens het programmeren achter?

Ik heb nu onderstaande, ben ik op de goede weg:

Code:
public class Personen {
	String naam;       // moeten deze variabelen niet public of private gedeclareerd worden?
	String adres;
	String postcode;
	String woonplaats;
	int sofinummer;
	double salaris;
}


public class Klant extends personen {
	public Klant() {
		System.out.println("Hello, my name is " + naam + " and I'd like to order a sandwich");
	}
	
	public Klant(String naam, String adres, String postcode, String woonplaats) {
		this.naam = naam;
		this.adres = adres;
		this.poscode = postcode;
		this.woonplaats = woonplaats;
	}
}

import java.util.ArrayList;

public class DamascusShoarma {
	private int aantalkoks;
	private int aantalbezorgers;
	
	public static void main(String[] args) {
		
		Kok Jonny = new Kok();
		Jonny.naam = "Jonny";
		Jonny.adres = "Singel 23";
		Jonny.postcode = "1234AB";
		Jonny.woonplaats = "Heemskerk";
		
		Kok Berend = new Kok();
		Berend.naam = "Berend";
		Berend.adres = "Kleidreef 222";
		Berend.postcode = "4321BA";
		Berend.woonplaats = "Beverwijk";
		
		Bezorger Klaas = new Bezorger();
		Klaas.naam = "Klaas";
		Klaas.adres = "Tulpstraat 45";
		Klaas.postcode = "6446JF";
		Klaas.woonplaats = "Castricum";
		
		Bezorger Jan = new Bezorger();
		Jan.naam = "Jan";
		Jan.adres = "Rozengracht 488";
		Jan.postcode = "1011DS";
		Jan.woonplaats = "Amsterdam";
		
		Klant Amanda = new Klant();
		Amanda.naam = "Amanda";
		Amanda.adres = "Commandeurslaan 44";
		Amanda.postcode = "1962JJ";
		Amanda.woonplaats = "Heemskerk";
	}	
}

Volgens mij kan ik veel beter een ArrayList gebruiken (ik roep de class ook al aan), maar ik weet even niet hoe ik dat dan het beste zou kunnen doen.

Nogmaals erg bedankt voor de hulp.
 
Laatst bewerkt door een moderator:
Code:
String naam; // moeten deze variabelen niet public of private gedeclareerd worden?
String adres;
String postcode;
String woonplaats;
int sofinummer;
double salaris;

Deze kan je public maken als je ze vanuit een andere klasse wil wijzigen.
Als je het alleen binnen dezelfde klasse(dus private) wil doen, dan zal je voor die waarden een get/set moeten maken als je ze nog vanuit een andere klasse aan wil kunnen passen.

Ik ben een voorstander van een get/set, dan heb je een beter overzicht.

Code:
public void setAdres(String nieuwAdres){
adres = nieuwAdres;
}

public String getAdres(){
return adres;
}

P.S.
Graag
Code:
 en
tags om je code zetten.
Maakt het overzichtelijker voor als je een lang stuk code plaatst(krijgen we mooie scrollbalkjes)
 
Laatst bewerkt:
@killermenace

Het is ook voor mij echt niet de bedoeling om mijn opdracht te laten maken, maar zoals ik in mijn topicstart al meldde heb ik het probleem dat ik code vaak wel kan lezen, maar als ik het zelf moet gaan schrijven loop ik vast.
Ik heb dit in het verleden ook gehad met PHP, daar kan ik inmiddels aardig goed mee overweg.

Ik vraag dus nogmaals niet om antwoorden op de casus, maar meer om handvatten voor het hoe en VOORAL waarom.
 
@killermenace
Die code-tags was ik inderdaad vergeten en bij het "aanpassen" lukt het niet meer (of ik moet er overheen kijken).

Ik was al aan het zoeken waar ik die get en set methods moest plaatsen, maar die moeten dus in de superclass "personen".
Ik dacht dat ik die in de class moest zetten waar de main-method in staat.
Maar in die class kan ik dan waarschijnlijk met ArrayList de get en set method van de verschillende classes aanroepen (of gooi ik nu echt alles door elkaar?)
 
Enkele opmerkingen:

PHP:
public class Personen {
String naam; // moeten deze variabelen niet public of private gedeclareerd worden?
String adres;
String postcode;
String woonplaats;
int sofinummer;
double salaris;
}

Hiervan ga je de klasse klant afleiden. Nu ik zie niet echt in waarom je het sofinummer en de salaris van een klant moet weten? ( Ik geef die toch nooit als ik iets bestel... ). Dus ik zou die dingen ofwel in een andere klasse Medewerker steken en hier Kok, bezorger, .. van afleiden ofwel ze rechtstreeks bij kok, bezorger zetten.

PHP:
public class DamascusShoarma

Lijkt me logisch dat hier ook een array komt van Kok's, bezorgers, ... Of een lijst, hangt er wat vanaf hoe groots je het wil zien:).

Op het eerste gezicht zie ik nu niet echt in waar je static variabele zou moeten gaan gebruiken. Je kan zoiets er nog ingooien terwijl je aan het programmeren bent maar euhm. Normaal gezien is het beter is grondig uit te denken en daarna pas te schrijven. Bij ons is het de gewoonte eerst op te schrijven wat hebben we nodig om dit te krijgen. En daarna een UML diagram op te stellen zodat iedereen weet welke functies/variabelen er in welke klassen zitten, zodat de samensmelting van de code wat vlotter verloopt.
 
En idd zoals killermenace het zegt kan je beter alle member variabelen private maken en Get() en Set() functies schrijven. Anders ga je in tegen basisprincipes van OO.
 
Begrijp ik het goed als het dus zo wordt:

Code:
public class Personen {
// declaraties van naw-variabelen
}

public class Medewerkers extends Personen {
// declaraties van specifieke Medewerker-variabelen (sofi en salaris)
// hierin worden de variabelen en get/set methods van Personen ge-extend
}

public class Kok (en Bezorger) extends Medewerkers {
// speciale kok (en bezorger) code
}

public class Klant extends Personen {
// specifieke Klant code
}

De rest van de informatie ga ik nu tijdens een (korte) nacht op me in laten werken om morgen fris mee verder te gaan.
Heel erg bedankt voor jullie uitleg en ik hoop nog veel van jullie te mogen leren.
 
Als je nog bepaalde medewerker specifieke variabelen wil gebruiken die gelijk zijn bij "Kok" en "bezorger" dan kan je de class "medewerker" gebruiken.
Als er eigenlijk geen gelijkenissen zijn tussen "kok"/"bezorger" welke nog niet in "personen" (kan je denk ik beter Persoon noemen, omdat de klasse zelf alleen maar info over 1 persoon bevat) staan, dan kan je "kok" en "bezorger" meteen laten erven van "personen"
 
Laatst bewerkt:
Begrijp ik het goed als het dus zo wordt:

Code:
public class Personen {
// declaraties van naw-variabelen
}

public class Medewerkers extends Personen {
// declaraties van specifieke Medewerker-variabelen (sofi en salaris)
// hierin worden de variabelen en get/set methods van Personen ge-extend
}

public class Kok (en Bezorger) extends Medewerkers {
// speciale kok (en bezorger) code
}

public class Klant extends Personen {
// specifieke Klant code
}

De rest van de informatie ga ik nu tijdens een (korte) nacht op me in laten werken om morgen fris mee verder te gaan.
Heel erg bedankt voor jullie uitleg en ik hoop nog veel van jullie te mogen leren.

lijkt me inderdaad wel goed zo.
 
@killermenace

Kok en bezorger hebben, ten opzichte van klant, twee "extra" variabelen, namelijk salaris en sofinummer.
Vandaar dat ik dus de variabelen die ze allen gebruiken (de naw-gegevens) in de class Personen heb staan en die andere twee in Medewerker.
Als ik dan bijvoorbeeld class kok extends Medewerker doe extend ik toch ook meteen class Personen?
 
Dat klopt ja.

Heb je al een datamodel? Waarin je alle klasses met de mogelijke variabelen hebt staan?
Is handig als je die hebt, dan weet je ook wat voor klasses je moet maken en wat er in moet staan
 
Ik heb niet echt een datamodel.
In de casus (zie eerste post) staat wat de applicatie minimaal moet bevatten.
Ik heb tot nu toe onderstaande classes met code;

Code:
public class Personen {
	private String naam;
	private String adres;
	private String postcode;
	private String woonplaats;
	
	public void setNaam(String nieuweNaam) {
		naam = nieuweNaam;
	}
	public String getNaam() {
		return naam;
	}
	
	public void setAdres(String nieuwAdres) {
		adres = nieuwAdres;
	}
	public String getAdres() {
		return adres;
	}
	
	public void setPostcode(String nieuwePostcode) {
		postcode = nieuwePostcode;
	}
	public String getPostcode() {
		return postcode;
	}
	
	public void setWoonplaats(String nieuweWoonplaats) {
		woonplaats = nieuweWoonplaats;
	}
	public String getWoonplaats() {
		return woonplaats;
	}
}


public class Medewerker extends Personen {
	
	private int sofinummer;
	private double salaris;
	
	public void setSofinummer(int nieuwSofinummer) {
		sofinummer = nieuwSofinummer;
	}
	public int getSofiummer() {
		return sofinummer;
	}
	
	public void setSalaris(double nieuwSalaris) {
		salaris = nieuwSalaris;
	}
	public double getSalaris() {
		return salaris;
	}
}


public class Kok extends Medewerker {
	private boolean kookboek;
}


public class Bezorger extends Medewerker {
	private boolean eigenbrommer;
	
	public Bezorger() {
	}
}


public class Klant extends Personen {
	public Klant() {
		System.out.println("Hello, my name is " + naam + " and I'd like to order a sandwich");
	}
	
	public Klant(String naam, String adres, String postcode, String woonplaats) {
		this.naam = naam;
		this.adres = adres;
		this.poscode = postcode;
		this.woonplaats = woonplaats;
	}
}

import java.util.ArrayList;

public class DamascusShoarma {
	private int aantalkoks;
	private int aantalbezorgers;
	
	public static void main(String[] args) {
		
		Kok Jonny = new Kok();
		Jonny.naam = "Jonny";
		Jonny.adres = "Singel 23";
		Jonny.postcode = "1234AB";
		Jonny.woonplaats = "Heemskerk";
		
		Kok Berend = new Kok();
		Berend.naam = "Berend";
		Berend.adres = "Kleidreef 222";
		Berend.postcode = "4321BA";
		Berend.woonplaats = "Beverwijk";
		
		Bezorger Klaas = new Bezorger();
		Klaas.naam = "Klaas";
		Klaas.adres = "Tulpstraat 45";
		Klaas.postcode = "6446JF";
		Klaas.woonplaats = "Castricum";
		
		Bezorger Jan = new Bezorger();
		Jan.naam = "Jan";
		Jan.adres = "Rozengracht 488";
		Jan.postcode = "1011DS";
		Jan.woonplaats = "Amsterdam";
		
		Klant Amanda = new Klant();
		Amanda.naam = "Amanda";
		Amanda.adres = "Commandeurslaan 44";
		Amanda.postcode = "1962JJ";
		Amanda.woonplaats = "Heemskerk";
	}	
}
 
Laatst bewerkt:
Ziet er goed uit :)

Ik weet dat een datamodel/klassediagram niet verplicht is, maar het kan het maken van klasses vergemakkelijken. Daarnaast heb je ook een goed overzicht van wat je al hebt.
 
Dank je wel, ik ben in ieder geval blij dat ik op de goede weg ben.
Wat betreft dat klassediagram, daar ben ik het helemaal mee eens, echter ik heb nog nooit iets met UML gedaan :confused:

Ik ga weer verder met bedenken hoe ik moet bereiken wat de casus wil, alleen kan ik moeilijk ontdekken wat de casus wil.
Je kan dat natuurlijk invullen zoals je zelf wilt.

a. bevat twee koks en twee bezorgers, met compleet verzonnen naw-gegevens;
die heb ik al in de main-method staan.

b. bevat een klant met verzonnen naw-gegevens;
Kan op dezelfde manier als de koks.

c. laat zien dat het aantal bezorgers en koks correct door de applicatie worden geteld, met een print op het scherm;
Dit kan je gewoon tellen met de telkoks() method.

d. laat een bezorger een broodje bij de klant bezorgen.
Dit kan volgens mij gewoon met een System.out.println();


Of vinden jullie dat ik me er dan te makkelijk vanaf breng?????
 
1, 2 en 3 moeten zo kunnen ja.

Voor de 4e zou je eigenlijk nog 2 (of 3) klasses nodig hebben wil je het echt OO hebben. nl.
| Bestelling |
Vars:
- Klantnummer
- ArrayMetMenus
- PrijsExBTW
- BTW
- TotaalprijsInclBTW

Methode's:
*getKlantnummer
*getArrayMetMenu's
*AddMenu
*getPrijsExBTW
*getBTW
*getPrijsInclBTW

| Menu |
Vars:
- MenuID
- Menunaam
- PrijsExBTW

Methode's:
*getMenuID
*get/set Menunaam
*get/Set prijs


(als je het nog wil doen, Is niet nodig.. Maar die zou je dan voor de klanten uit kunnen printen)
| Menukaart |
Vars:
- 2DemensionaleArray van MenuID, MenuNaam en PrijsInclBTW

Methode's:
*Printfunctie


En zou misschien nog wel wat bij kunnen, maar dat moet je zelf bepalen.
 
Laatst bewerkt:
Ik vind bovenstaande er wel interessant uitzien.
Met PHP zou ik het zo maken, hoewel ik daarmee ook niet veel OO ervaring heb.
Maar met Java denk ik niet dat ik dit ga redden.
Ik probeer toch hieronder te beschrijven wat ik denk dat er moet gebeuren om het te maken:

| Bestelling |
Vars:
- Klantnummer
- ArrayMetMenus
- PrijsExBTW
- BTW
- TotaalprijsInclBTW


Bovenstaande kan natuurlijk zo gemaakt worden, maar omdat er geen set-methods zijn betekend dit dan dat ik meteen een waarde geef aan de variabelen?
Dus:

Code:
public class Bestelling {
    private int Klantnummer = 1234;
    ArrayMetMenus zou ik niet weten te maken (weinig met array's gedaan nog)
    private float PrijsExBTW = 10.00;
    private float BTW = 1.90;
    private float TotaalprijsInclBTW; // deze kan berekend worden

Methode's:
*getKlantnummer
deze wordt dus gewoon uit de instance variabele gehaald

*getArrayMetMenu's
Geen idee hou ik dit zou moeten doen (iets met ArrayList ???)

*AddMenu
list.Add(String menuItem) ???

*getPrijsExBTW
Gewoon de waarde van de gedeclareerde instance variabele

*getBTW
Idem (ik heb nog geen rekenkundige functies gehad)

*getPrijsInclBTW
Dit is uiteraard simpel te berekenen.

| Menu |
Vars:
- MenuID
- Menunaam
- PrijsExBTW


Hierbij zou ik dan hetzelfde doen als bovenstaande class, dus:

Code:
public class Menu {
    private int MenuID = 99;
    private String Menunaam;
    private float PrijsExBTW;

Methode's:
*getMenuID
Haal de waarde uit de instance variabele

*get/set Menunaam
reguliere get en set methode.

*get/Set prijs

Idem

(als je het nog wil doen, Is niet nodig.. Maar die zou je dan voor de klanten uit kunnen printen)
| Menukaart |
Vars:
- 2DemensionaleArray van MenuID, MenuNaam en PrijsInclBTW

Methode's:
*Printfunctie


Ik denk dat deze in het kader van de opleiding nog iets te ver gaat.
Hier heb ik nog niks mee te maken gehad.

Ik heb wel iets gedaan met JOptionPane, dus ik had het leuk gevonden als ik een formulier kon maken waarin een klant zijn naw gegevens zou invullen en zijn bestelling zou doorgeven, maar ik denk dat ook dit iets te ver gaat nu al.
 
een arraylist kan je zo maken:

Code:
private ArrayList<Menu> _menulijst = new ArrayList<Menu>():

Dan kan je gewoon het object menu erin zetten

Adden doe je dan:
Code:
_menulijst.add(object);

Waar een menu dan het object is.

Je kan dus beter een ArrayList gebruiken ipv een gewone array.
Een array maak je zo:
Code:
private int[] _cijferArray = new int[arrayGrootte];
voor arrayGrootte moet je dan een nummer invoeren bijvoorbeeld: 20
Het nadeel dan is, je kan die niet vergroten zonder de array compleet opnieuw aan te maken.
Het is een statische array dus

Een ArrayList is een dynamische array. Die kan dus wel wisselen van grootte.
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan