Applicatiebouwcollege6

APPLICATIEBOUW
6E COLLEGE: HET ONTWERPEN VAN EEN KLASSE, LEJOS DEEL 3
Onderdeel van SmartProducts
INHOUD COLLEGE 6
 Het ontwerpen van een klasse {6}
 Lijsten met ArrayList {7.3, 7.4}
 LeJOS: Communicatie, SuperPro en
LcdDisplay
 Opdracht 6
Applicatiebouw, Industrieel Ontwerpen
5-6-2014
2
HERKANSERS: INSCHRIJVEN TENTAMEN
 Inschrijven Osiris 28/5 tot 18/6 (sinds vorige week)
 Is dit gelukt? Graag snel proberen!
 Bij problemen kan ik (nu) nog actie ondernemen
1e jaars en ingeschreven voor Module 4?
Dan hoef je je niet in te schrijven voor toets
Oefenen voor toets?
Academicx: toetsen bij boek
Oefentoetsen+antwoorden Applicatiebouw
Applicatiebouw, Industrieel Ontwerpen
5-6-2014
3
BESPREKING OPDRACHT 5
 Gedrag 'FindWay‘… wanneer actief?
 Wordt bepaald door takeControl() methode
 Als de robot niet beweegt: return !pilot.isMoving()
 Doen: om zich heen kijken…
 Pseudo code gegeven!:
Applicatiebouw, Industrieel Ontwerpen
5-6-2014
4
OBJECTEN AANMAKEN EN DOORGEVEN
Object pilot aanmaken
Object s aanmaken
DifferentialPilot pilot = new DifferentialPilot(5.6f, 12.3f,
Motor.A, Motor.C);
// declareer de sensoren die we gaan gebruiken
UltrasonicSensor s = new UltrasonicSensor(SensorPort.S3);
Behavior gedrag3 = new DetectObstacle(pilot, s);
Objecten pilot en s
doorgeven als parameter
aan constructor
'object' en 'variabele' worden vaak door
elkaar gebruikt.
Een object is een instantie van een class.
Een variabele
is een instantie van
een 5
Applicatiebouw, Industrieel Ontwerpen
5-6-2014
basis-type.
BEHAVIOR CLASS
public class DetectObstacle implements Behavior {
Object aangemaakt
in hoofdprogramma,
wordt doorgegeven
aan dit object
UltrasonicSensor u;
DifferentialPilot pilot;
public DetectObstacle(DifferentialPilot p, UltrasonicSensor s) {
u = s;
pilot = p;
}
public boolean takeControl() {
// is de gemeten afstand 'dichtbij'?
return u.getDistance() < 45;
}
public void suppress() {
}
public void action() {
// Wat is de actie als we een obstakel waarnemen? We stoppen.
pilot.stop();
}
}
Applicatiebouw, Industrieel Ontwerpen
5-6-2014
6
HET ONTWERPEN VAN EEN KLASSE
HOOFDSTUK 6 BOEK
 Stappen (College 3):
Vergelijking:
Class = recept voor object
Boek: bouwtekening
1. Object analyseren
2. Klasse ontwerpen (wat is… wat kan… hoe?)
3. Klasse uitwerken (types attributen, parameters &
resultaat methoden)
4. Methoden invullen (body)
wat is ...
wat kan ...
een object
Boek: wat zijn de
verantwoordelijkheden?
en hoe ?
Applicatiebouw, Industrieel Ontwerpen
5-6-2014
7
ONTWERPMETHODEN VOOR SOFTWARE
HST 5, 6 EN 7
 Klasse diagram, mbv UML
 Andere:
 Functie decompositie
 Data flows
 State diagram (toestands
overgang diagram)
 Flow chart (stroomschema) {5}
Applicatiebouw, Industrieel Ontwerpen
5-6-2014
8
UML DIAGRAMMEN
HOOFDSTUK 6.2 BOEK
Datum
- dag:int
- maand:int
- jaar:int
Naam class
 + public
 - private
 Type achter de :
class-variabelen
(eigenschappen)
+ getDag():int
+ getMaand():int
Methoden
+ setDag( dag:int )
Applicatiebouw, Industrieel Ontwerpen
5-6-2014
9
UML: UNIFIED MODELING LANGUAGE
VOORBEELDEN VAN UML DIAGRAMMEN
Applicatiebouw, Industrieel Ontwerpen
5-6-2014
10
OBJECTEN MAKEN: VEEL VERSCHILLENDE BALLEN
BASIS: PARAGRAAF 2.5.3, MEER: 6.6
 Constructor: bepaalt invulling
eigenschappen (class-variabelen)
Bal
Bal
Bal
Bal
b1
b2
b3
b4
=
=
=
=
new
new
new
new
Bal(10, Color.orange, 10, 20 );
Bal(20, Color.blue, 20, 25 );
Bal(8, Color.green, 30, 30 );
Bal(5, Color.red, 5, 30 );
Applicatiebouw, Industrieel Ontwerpen
5-6-2014
11
EEN CONSTRUCTOR
BOEK: BASIS: PARAGRAAF 2.5.3, MEER: 6.6
 Speciale methode die waarden attributen
invult
Bal {
int x, y;
Color kleur;
Bal(int w, int h) { … }
paintComponent();
beweeg();
int getX();
int getY();
}
Class definitie
(recept)
4x
1x
2x
3x
new
Bal {
Balint{ x, y; [20,25]
x, y; [10,20]
kleur; [blue]
Balint{Color
Color
kleur;
Bal(int
w, [orange]
int h) { … }
Bal int
{ x, y; [5, 30]
Bal(int
w,
int
h) { … }
paintComponent();
Color
kleur;
int x,
y; [30,
30] [red]
paintComponent();
beweeg();
Bal(int
w,[green]
int h) { … }
Color
kleur;
beweeg();
int
getX();
paintComponent();
Bal(int
w, int h) { … }
intint
getX();
getY();
beweeg();
paintComponent();
int
getY();
}
int getX();
beweeg();
}getY();
int
int getX();
}
int getY();
}
In geheugen zijn 4 stukken
gereserveerd, waarden class-variabelen
zijn allemaal verschillend
Applicatiebouw, Industrieel Ontwerpen
5-6-2014
12
Opdracht 4b:
stuiterende
ballen
MEERDERE CONSTRUCTORS
BOEK: 6.6.2
 Bal met vaste waarden attributen
 Bal met ingestelde waarden attributen
public class Bal {
int x, y;
Color kleur;
public Bal() { // constructor 1
x = 0; y = 0;
kleur = Color.blue;
}
public Bal(int x, int y, Color kleur) { // constructor 2
this.x = x;
this.y = y;
this.kleur = kleur;
}
}
Aanroep:
Bal b1 = new Bal();
Bal b2 = new Bal(20, 25, Color.blue );
Applicatiebouw, Industrieel Ontwerpen
5-6-2014
13
THEORIE:
VAN DOMEINKLASSE TOT IMPLEMENTATIE
HOOFDSTUK 7 BOEK
 Boek: voorbeelden van ontwerp tot
uiteindelijk resultaat (programma)
 Domeinmodel: relaties tussen set klassen
 Relaties kan je weergeven in UML mbv.
klassendiagram
Applicatiebouw, Industrieel Ontwerpen
5-6-2014
14
LIJSTEN: ARRAY
 Lijst van primitive typen
 Bijv. int, double
 Altijd initialiseren met new
 Class voor het bijhouden van ‘universele’
lijsten: ArrayList
// declaratie lijst van 4 integers:
int[] dout = new int[4];
// eerste element in lijst krijgt een waarde:
dout[0] = 0;
// Test de LED's door ze 1 voor 1 aan te doen:
for (int i = 0; i < 4; i++) {
dout[i] = 1;
superPro.write(dout);
Tools.delay(1_000); // wacht 1 sec.
}
Applicatiebouw, Industrieel Ontwerpen
5-6-2014
15
ARRAYLIST
PARAGRAAF 7.3, 7.4 BOEK
Opdracht 4b:
stuiterende
ballen
 Lijsten van objecten bijhouden
 Opdracht 6: zie Controller
In deze lijst
mogen alleen objecten
van type Bal
 Methoden:
 add(Object)
 get(int)
 size()
// Lijst met alle ballen in het Panel:
ArrayList<Bal> ballen;
// Maak een nieuwe bal:
Bal b = new Bal();
// Voeg de Bal toe aan de lijst met ballen:
ballen.add(b);
// Haal bal nummer 5 uit de lijst:
Bal b = ballen.get(5);
// Hoeveel ballen zitten
er inIndustrieel
de lijst?:
Applicatiebouw,
Ontwerpen
5-6-2014
System.out.println("Aantal ballen: "+ballen.size() );
16
ARRAYLIST
VOORRAADBEHEER: CONTROLLER OPDRACHT 6
ArrayList<Product> producten; // lijst van producten
// voeg nieuw Product toe aan de lijst:
producten.add(new Product(name, prijs));
private boolean controleerBetaling() {
// Haal het product uit de lijst:
Product p = producten.get(gekozenItem);
// Als het saldo hoger of gelijk aan de prijs van het gekozen items is,
// geven we accoord voor de betaling:
if (saldo >= p.getPrijs()) {
return true;
}
gui.displayMessage("Onvoldoende saldo");
In opdracht: check methoden van
return false;
de class Product
om de naam en de prijs van een
product op te vragen
Applicatiebouw, Industrieel Ontwerpen
5-6-2014
17
Opdracht 4b:
stuiterende
ballen
ARRAYLIST
 Lijst doorlopen mbv for-each lus:
public void paintComponent(Graphics g) {
super.paintComponent(g);
// Teken alle ballen door van elke bal
// de paintComponent() aan te roepen:
for (Bal b : ballen) { // for-each
b.paintComponent(g); // teken de bal
}
}
for-each lus: paragraaf 7.3.8 boek
Applicatiebouw, Industrieel Ontwerpen
5-6-2014
18
/** … */
DOCUMENTATIE
PARAGRAAF 7.7 BOEK
 Commentaar
toevoegen
/* … */ of
//
 Javadoc
 Speciale opmaak
commentaar
 Voor documentatie &
publicatie: /** … */
 Block tags: @author,
@param …
/**
* Uitleg over het doel van MijnClass
* @author F. van Slooten
*
*/
public class MijnClass {
/**
* Uitleg over mijnMethode
* @param parameter is een getal voor de methode
*/
public void mijnMethode(int parameter) {
}
}
Erg belangrijk als je met een team software
ontwikkelt! Maar ook voor jezelf (later)
Applicatiebouw, Industrieel Ontwerpen
5-6-2014
19
JAVADOC IN ECLIPSE
Beweeg je muis
boven een methode
 Commentaar toevoegen in Javadoc-formaat:
Javadoc
verschijnt
Type boven methode:
/** [ENTER]
Applicatiebouw, Industrieel Ontwerpen
5-6-2014
20
COMMUNICEREN MET NXT
1 APP: OP LAPTOP, GEBRUIK NXT
 Maak een LeJOS PC
Project
 LeJOS PC Project heeft
‘ingebakken’ communicatie
 Voorbeeld project
LeJOS_PC_ShowColor
 Gaan we gebruiken bij
opdracht 7
Voorwaarde: er moet een
communicatiekanaal zijn
(werkende Bluetooth
verbinding of USB)
// Lees de sensor uit:
int kleur = colorsensor.getColorID();
// Zet kleurnummer om naar een Color:
Color bg = getColorFromIndex(kleur);
// Stel achtergrond van het panel in met de kleur:
if (bg!=null) panel.setBackground(bg);
LeJOS PC Project: programma draait
op PC en bestuurt/gebruikt NXT
LeJOS_PC_ShowColor in ZIP-file
Communicatie.ZIP
(Colleges/voorbeelden)
COMMUNICATIE PROGRAMMA
2 APPS OP LAPTOP <> NXT
 Voorbeelden LeJOS:
PC
LeJOS NXT Project: programma draait
op NXT en communiceert met PC
Java Project: programma draait op PC
en communiceert met NXT
NXT
In ZIP-file Communicatie.ZIP
(Colleges/voorbeelden)
LEJOS: SUPERPRO-BOARD
AANSLUITINGEN
Aansluiting NXT
4x analoge ingang
a0…a3
8x digitale poort
(in/uit) b0…b7
Voedings uitgangen
3, 5, 9V
Applicatiebouw, Industrieel Ontwerpen
5-6-2014
23
SUPERPRO-BOARD
DIGITALE IN/UITGANGEN EN ANALOGE INGANGEN
 HiTechnic SuperPro Experimenters Handbook
 Voorbeelden handbook in Java
 NxtJLibA bibliotheek, API
Deel1: declaratie+instellen
// Declaratie van variabelen en objecten voor het SuperPro-board:
NxtRobot robot = new NxtRobot();
SuperProSensor superPro = new SuperProSensor(ch.aplu.nxt.SensorPort.S1);
// ch.aplu.nxt.SensorPort.S1 is de NxtLib variant van de SensorPort
robot.addPart(superPro);
int[] din = new int[8];
int[] dout = new int[8];
int[] ain = new int[4];
int level;
// stel poort 0-3 in als uitgangen, poort 4-7 ingangen:
int[] ioControl = { out, out, out, out, in, in, in, in };
superPro.setDIO(ioControl);
Meer uitleg in opdracht 6
Applicatiebouw, Industrieel Ontwerpen
5-6-2014
24
SUPERPRO-BOARD
DIGITALE IN/UITGANGEN EN ANALOGE INGANGEN
 Uitvoer: bijv. LEDs aanzetten
 Uitlezen digitale en analoge poorten
Deel2: lezen waarden en aansturen uitgangen
// lees analoge en digitale waarden:
superPro.read(ain, din);
level = ain[0]; // waarde potmeter aangesloten op poort a0
// als knop 4 ingedrukt
if (din[4] == 1) {
if (dout[0] == 0) //
dout[0] = 1;
else
dout[0] = 0;
}
is:
als LED op a0 uit is:
// gaat ie aan
// anders uit
// schrijf waarden naar SuperPro (aansturen uitgangen):
superPro.write(dout);
Opdracht 6: instellen muntgeld
met draaiknop (potmeter):
geld = 0;
if (level<300) {
geld = 10;
} else if (level<600) {
geld = 20;
} else {
geld = 50;
}
Voorbeeld: opdracht 6
Applicatiebouw, Industrieel Ontwerpen
5-6-2014
25
EXTERN LCD DISPLAY
 Class LcdDisplay
 Meegeleverd met opdracht 6
// Initialiseer het externe display aangesloten op
// poort 2 van de NXT :
LcdDisplay externDisplay = new LcdDisplay(lejos.nxt.SensorPort.S2);
// Tekst die we op het externe display gaan laten zien:
String displayText = "Hallo Wereld!";
NxtJLibA bibliotheek heeft ook een
SensorPort class,
dus zo maken we onderscheid
// Stuur de tekst naar regel 1 van het externe display:
externDisplay.sendLine(1, displayText);
// 2e variant van sendLine() methode, met x,y positie van tekst:
externDisplay.sendLine(2, 6, displayText);
Meer weten over methoden?
Gebruik JavaDoc!
Applicatiebouw, Industrieel Ontwerpen
5-6-2014
26
OPDRACHT 6
Prototype gebruikersinterface voor een
frisdrankautomaat bouwen mbv. SuperPro
Applicatiebouw, Industrieel Ontwerpen
5-6-2014
27
MONITOREN VAN DE KNOPPEN
OPDRACHT 6
 Methode maken voor uitlezen knoppen
 Taak voortdurend blijven doen, dus
herhalings-lus
 Als knoppen niet goed reageren: korte
pauze inlassen
while (!Button.ENTER.isDown()) {
// controleren knoppen...
// als knop 4 ingedrukt is:
if (din[4] == 1) {
// ...
}
// Programma 200ms (=0,2 sec) laten wachten:
Delay.msDelay(200);
}
Applicatiebouw, Industrieel Ontwerpen
5-6-2014
28
MODEL, VIEW, CONTROLLER
Model
Controller
Opdracht a/b
Verschillend:
a: Hardware UI
b: Windows/Java UI
Product
Controller
View
SuperPro
Sensor
(ch.aplu.nxt)
Opdracht a/b
hetzelfde
AutomaatUI
LcdDisplay
NXT
Boek: 4.10, 4.11 en 10.9
Applicatiebouw, Industrieel Ontwerpen
5-6-2014
29
OPDRACHT: KLASSE ONTWERPEN
GOED LEZEN!, ZIE OOK PARAGRAAF 7.2.1, TEKST-ANALYSE
Naam van de class
Wat is het type van een naam??
tekst… dus: String
Eigenschap = class variabele
Type van de class variabele
Applicatiebouw, Industrieel Ontwerpen
5-6-2014
30
SOORTEN METHODEN
PARAGRAAF 4.9.4 BOEK
Opdacht: “Voeg methoden toe waarmee de
eigenschappen opgevraagd kunnen
worden”
 Methoden die attributen
afgeven (get) of instellen (set)
 Getter, Setter
 Handig: automatisch maken
 Klik binnen class
 Kies Source > Generate
Getters and Setters
Applicatiebouw, Industrieel Ontwerpen
class variabele
subtotaal
is attribuut
of eigenschap
5-6-2014
31
AAN DE SLAG
OPDRACHT 6
 Opdracht 6 maken
 Ga met projectgroep bij elkaar zitten
 Doe opdracht met 1 of 2 personen
 Doe je geen SmartProducts:
 Maak opdracht 6b
Herkansers: inschrijven toets tot 18/6!
Applicatiebouw, Industrieel Ontwerpen
5-6-2014
32