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
© Copyright 2024 ExpyDoc