torsdag 23 april 2009

Klasser och objekt

Vid objektorienterad programmering bygger man upp sina program av ett antal väl avgränsade enheter som kallas objekt. 

Det klassiska bilden av ett datorprogram är en "låda" i vilken man stoppar in indata och får ut udata. Programmets uppgift är alltså att transformera ett dataflöde. Detta treaditionellla sätt att uppfatta datorprogram på brukar kallas det funktionsorienterade synsättet.

Det objektorienterade synsättet är annorlunda. Enligt detta uppfattar man ett datorprogram som en modell av den verklighet programmet skall samverka med. De enskilada e
nheterna i ett program, de s.k objekten, är då modeller av verkligen eller tänkta ting i programmet omgivining och ett datorprogrammes upphoft är att manipulera objektet. I programmets använder man s.ks klasser för att avbilda och beskriva objektens egenskaper. 

Varje objekt har en unik identitet och i programmet kommer man åt objekt via namn, antigen direkt eller via referenser. I java används referenser. Man kan t.ex. konstruera ett objekt blomman som avbildar en verklig blomma eller ett objekt fönstret som beskriver ett fönster på skärmen. Varje objekt har en uppsättning egenskaper vilka bestäms av dess attribut och dess operationer. Attribut används för att hålla reda på objektets tillstånd, eller status.
Varje objekt har en egen, unik uppsättning attribut. Normalt brukar man gömma ett objekts attribut inne i objektets så att det blir oåtkomlig utifrån och bara kan förändras av objektets självt. Detta kallas inkapsling eller information hiding.

Som exempel kan vi studera objektet hissen som beskriver en verklig hiss. Dess tillstånd kan beskrivas med hjälp av de två attributern riktning och våning. Attributen rikting kan ha något värde stilla, uppåt eller neråt och attributet våning kan innehålla ett heltal som anger vilken våning hissen 
är på. 

Olika objektorienterade programmeringsspråk använder olika termer för "attribut". I Java används för det mesta termen "instansvariabel" i C++ används termen "datamedlem" och i Ada "komponent". I fortsättningen kommer vi att använda ordet instansvariabel. Ibland använder vi det enklare ordet variabel när det är uppenbart att det är frågan om en instansvariabel.

Den andra kategorin egenskap för ett objekt är de operationer som man 
kan utföra på objektet. För objektet "hissen" kan det t.ex. finnas metoderna körTill, stanna och vilkenVåning . Metoden "körTill" använder man för att få hissen att köra till en viss våning, "stanna" används för att stoppa hissen f.n. befinner sig. I Java kallas en sådan operation för en "metod". Ibland används vi ordet instansmetod för att betona att en viss metod hanterar enskild instans av en klass.

Ett objekt är alltså en modell av ett verkligt eller tänkt föremål, men hur beskrivs då objekt i ett program? Det är här begreppet klass kommer in. En klass är en mall, eller mönster, som beskriver hur objekt med samma uppbyggnad och egenskaper ser ut.  

En klass är alltså  en beskrivning.

                 
Objekt
Modell av ett verkligt eller tänkt föremål.
Har två slags egenskaper; attribut och operationer.
Kallas instansvariabler resp. metoder i Java.



fredag 17 april 2009

Beräkna volymen och arean av en sfär - java

Ett program som beräknar volymen och arean av en sfär. Som indata, i en diagolnal, ges sfärens radie. Följande formeler är givna:

Sfärens area beräknas med formeln:            A=4\pi \cdot r^{2} 

och det tillhörande klotets volym är :    V=\frac{4\pi r^{3}}{3}            




import static javax.swing.JOptionPane.*;


/*

 * Ett program som beräknar volymen och arean av en sfär.

 * Som en indata, i en diagonalruta, ges sfärens radie. 

 * 

 */

public class VolymenArean {

public static void main(String[] args) {

String txt = showInputDialog("Ange sfärens radie"); // läser in en

// textsträng


double radie = Double.parseDouble(txt); /*

* typomvandlar från sträng till

* decimaltal

*/

double volym, area;

volym = (4 * Math.PI * Math.pow(radie, 3) / 3); // utför beräkning

area = (4 * Math.PI * Math.pow(radie, 2)); // utför beräkning

showMessageDialog(null, "Vid en radie på " + txt + "\n" 

+ "Får man en volym på " + volym + "\n" + "och en area på " + area);

System.exit(0);


}


}

onsdag 15 april 2009

The Cloner

import static javax.swing.JOptionPane.*;

public class hjälp {
public static void main(String[] args) {
for (;;) 

showMessageDialog(null,
"Cloner: The program with a personality" + "\n"
+ "It will get on all your disks" + "\n"
+ "It will infiltrate your chips" + "\n"
+ "Yes, it's Cloner!" + "\n"
+ "It will stick to you like glue" + "\n"
+ "It will modify RAM too" + "\n"
+ "Send in the Cloner!");


}

}

for-satsen

Den enklaste satsen för att göra upprepningar är while-satsen, men det finns en annan sats som också används ofta, nämligen for-satsen. Man brukar använda en for-sats när man har en räknare som skall räknas upp eller ner på varje varv.

exempel while-sats:

int j = 0;
while ( j <>
   System.out.println(j);
j = j + 2;

}

Alltså:

init;
While(uttryck){
  sats;
 ändring;
}


Och ett exempel for-sats kan see ut så här:

int j;
for(j=0;  j <  6; j = j + 2 ) {
   System.out.println(j);
}

Alltså:
for(init;  vilkor;  ändring)
 sats;

While - satsen * java










tisdag 14 april 2009

måndag 13 april 2009

Användining av dialogrutor för att läsa indata - java





De olika stegen vid traditionell kompilering

  1. Med hjälp av en texteditor skapas programtexten (källkoden).
  2. Kompilatorn översätter programtexten till en objektfil.
  3. Länkaren sätter samma flera objektfiler till en exekvebar fil.
  4. Operativsystemt placerar den exekverbara filen i primärminnet och programmet exekveras.

torsdag 9 april 2009

JTextArea och JTextComponent - Java programmering

Klassen JTextField använde man för att ge användaren möjligheten att ge indata på en rad.
Vill man visa en längre text eller gee användaren möjlighet att redigarea mer än en rad kan man använda klassen JTextArea. Denna klass har många likheter med klassen JTextField (De har båda en gemensam superklass JTextComponent). Man kan t.ex. i båda klasserna från programmet avläsa den text användaren skrivit eller den del av texten som användaren markerat. 

(se länk för mer fakta)

När man skapar ett objekt av klassen JTextArea har man flera möjligheter.
 Vill man t.ex. skapa ett objekt av klassen JTextArea med r rader och k kolummer skriver man

      JTextArea a = new JTextArea (r , k);

Om man vill ha skjutreglage runt textarean skall man lägga JTextArean - objektet i ett JScrollPane  objekt:

       JScrollPane sp = new JScrollPane(a);

Användaren kan skriva text i arean och klippa och klistra på normalt sätt, men man kan också från programmet lägga in och ta bort text. Det går även att ange att bara programmet får ändra i textarean. Detta kan vara användarbart om man vill visa en text, t.ex. en hjälptext för användaren.

Antag t.ex. att vi har en String-variabel s och att man vill lägga till den text som finns i s sist i textarean. Då kan man göra anropet.

  a.append(s  +  "/n");    // lägg till s + radframmatning



Vi  skall nu visa ett ganska avancerat program!, en texteditor. Med hjälp de grafiska standarklasserna är det förvånansvärt enkelt att konstruera programmet. När man kör programmet får man upp ett fönster som liknar  något så här:

                                                                                                     
I textarean kan användaren redigera text på vanligt sätt. Vill man öppna och läsa in en befintlig textfil skriver man filens namn i textfältet längst upp till vänster och klickar sedan på knappen Öppna. Då suddas textareans tidigare innehåll ut och den nya filen läses in. Om man klickar på knappen Spara kommer programmet att spara det som visas i textarean i den angivna filen.

Fönstret har delats upp i två delar. Överst finns en panel med fem komponenter: en JLabel, ett JTextField-objekt och tre JButton knappar. Komponenterna på panelen placeras ut med GrindLayout (1 rad och fem kolumner). Under panelen finns ett JTextArea-objekt. Panelen och JTextArea-objektet placeras ut i fönstret med BorderLayout.  ( Vi behöver inte explict ange att borderlayout skall användas, eftersom BorderLayout är deafult för ett fönsters arbetsyta. ).  BorderLayout är ,  när man placerar ut komponenter så anger man i vilket väderstreck de skall placeras. Dessutom kan man ange platsen CENTER. Panelen med knapparna placeras på platsen NORTH. Textarean placeras på platsen CENTER, vilket innebär att den kommer att få allt extra utrymmer om fönstret förstoras. Programmets har utseendet:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;

public class TextEdit extends JFrame implements ActionListener {

JPanel p = new JPanel();
JTextField namn = new JTextField();
JButton öppna = new JButton("Öppna");
JButton spara = new JButton("Spara");
JButton sluta = new JButton("Avsluta");
JTextArea area = new JTextArea(10, 60);
JScrollPane sp = new JScrollPane(area,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

public TextEdit() {
area.setFont(new Font("Monospaced", Font.PLAIN, 12));
// placera ut komponeterna på panelen p
p.setLayout(new GridLayout(1, 5));
p.add(new JLabel("Filnamn: ", JLabel.RIGHT));
p.add(namn);
p.add(öppna);
p.add(spara);
p.add(sluta);
namn.addActionListener(this);
öppna.addActionListener(this);
spara.addActionListener(this);
sluta.addActionListener(this);

// placera ut panelen och textarean
add(p, BorderLayout.NORTH);
add(sp, BorderLayout.CENTER);
pack();
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}

public void actionPerformed(ActionEvent e) {
// undersöker vilken knapp användaren har tryckt på
if (e.getSource() == namn || e.getSource() == öppna)
läsInFil(namn.getText());
else if (e.getSource() == spara)
sparaFil(namn.getText());
else if (e.getSource() == sluta)
System.exit(0);
}

private void läsInFil(String filnamn) {
try {
FileReader r = new FileReader(filnamn);
area.read(r, null);
} catch (IOException e) {
}
}

private void sparaFil(String filnamn) {
try {
FileWriter w = new FileWriter(filnamn);
area.write(w);
} catch (IOException e) {
}
}

public static void main(String[] args) {
TextEdit t = new TextEdit();
}

}

onsdag 8 april 2009

UML - klasser

Klasser är mallar för objekt. Vi säger att ett objekt är en instans av en viss klass. I vissa språk, exempelvis Java, så kan klassen i sig ibland fungera som ett objekt. För varje objekt så sparas endast den data som gör objektet unikt från andra objekt av samma klass. Metoder är gemensamma för alla objekt men då exekveringen av en metod kan bero på ett objekts attribut så kan resultatet av en operation i form av en metod skilja sig mellan olika objekt.

Arv innebär att klasser kan inkludera
gränssnitt från andra klasser i sitt eget gränssnitt.
En subklass är en utökad, specialiserad
version av dess superklass. Subklassen
innehåller samma operationer och attribut
som superklassen och eventuellt fler.
Man kan säga att ett objekt av en subklass
kan tillhöra superklassen.

Polymorfism innebär att man kan se ett
objekt ur olika perspektiv beroende på
sammanhanget.
Ibland kan ett objekt betraktas som en
instans av sin subklass och ibland som en
instans av sin superklass.

Dynamisk bindning innebär att samma
meddelande till olika instanser kan ge
olika svar beroende på vilken klass som
instansen egentligen är av.
Antag två instanser där den ena är en
instans av superklasen och den andra en
instans av en subklass. Om vi genom
polymorfism ser dessa som instanser av
superklassen så kan vi fortfarande få olika
svar på samma meddelande.



UML - unified modeling language

  UML står för "Unified Modeling Language" och är ett objektorienterat språk för modellering av alla typer av system. Som en arketiekt som har metoder för att rita en byggnad så har systemutvecklare, programvarukonstruktörer, testingenjörer UML för att rita upp system, språket användas främst inom programvarukonstruktion men kan användas även till att modellera affärsprocesser. Genom att skapa en modell av systemet som skall konstrueras blir det enklare att förstå och bygga det.

Vad är ett bra system?
• Nyttigt och användbart – mjukvaran måste förenkla eller förbättra tillvaron för användarna på något sätt.
• Pålitligt – få buggar, förväntat beteende.
• Flexibelt – användarens behov förändras med tiden och mjukvaran måste kunna matcha dessa förändringar. Underhåll är det som sker efter att mjukvaran levererats.
• Rymmas i budgeten – användaren måste ha råd att köpa mjukvaran samt att underhålla den.
• Tillgängligt
– Det måste gå att köra systemet på tillgänglig
hårdvara, med tillgängliga operativsystem o.s.v.
– Mjukvaran måste finnas – projekt som utvecklar

Informationsmängd
En människa kan bara förstå en viss mängd
information åt gången. Vi kan hålla 5-7 separata
informationsdelar i tanken samtidigt och förstå
dessa. Fler än så, så börjar vi tappa förståelse.
Detta innebär att vi för stora system måste dela
upp modellen och koden i olika delar där varje
del i sig blir förstålig. De olika delarna av en
modell kan ha olika detaljdjup som gör att vi kan
minska mängden information och få en överblick
som vi kan förstå.

Man utgick tidigt från att om man ändrade en rad
så skulle problem som denna ändring gav
upphov till finnas på rader i närheten. Alltså
behövde man bara förstå den närliggande koden
för att säkerställa att ändringen inte gav upphov
till buggar. Detta antagande var FEL!

”Spaghetti code” var ett uttryck som myntades
på 60-talet för att beskriva system vars kod var
så full i beroenden mellan olika delar att det inte
gick att förstå den.

Så man bör alltså dela upp sin kod i
moduler. Moduler kan vara
– Filer
– Subrutiner
– Biblioteksfunktioner
– Klasser om objektorienterat språk
– Moduler i vissa språk/system
– Oberoende delsystem eller program
Alla moduler är dock inte lämpliga utan
konsten ligger i att se vilka moduler som är
lämpliga.

        Begrepp – beroende
Modul A är beroende av modul B och det är
möjligt att någon ändring i B kan medföra
att det även behövs en ändring i A.
Man kan även säga att A är en klient till B
eller att B är en server till A.
Om två moduler har varandra som klienter
så har man ett cirkulärt beroende.
Cirkulära beroenden bör alltid undvikas.

           Begrepp - coupling
Coupling – koppling är ett begrepp som
används för att beskriva beroenden mellan
moduler.Om ett system har hög koppling (high
coupling) så har systemet många
beroenden. Om ett system har få
beroenden så har systemet låg koppling.
Vi vill sträva efter så låg koppling som
möjligt mellan moduler.

           Begrepp – gränssnitt
Gränssnitt (interfaces) möjliggör att man kan ändra en
moduls interna utseende utan att detta påverkar klienter
till modulen. Gränssnitt kan vara allt från kommentarer till
en fil till Javas interface-kod.

         Gränssnitt kan ge två typer av fel:
– Syntax-fel som uppkommer på grund av att man frångår ett gränssnitt.
– Semantiska fel som uppstår på grund av att man inte använder gränssnittet så som det var avsett.
Gränssnitt har ofta i sig beroenden av andra gränssnitt eller moduler och dessa beroenden bör dokumenteras
på något sätt i gränssnittet. En modul kan ha flera gränssnitt.

           Begrepp - inkapsling
Gränssnitt är ett sätt att kapsla in en modul.
Ett bra system består av inkapslade
moduler.Inkapsling innebär att en klient inte kan
veta mer än vad gränssnittet säger.

            Begrepp - abstraktion
Abstraktion innebär att gränssnittet strävar
efter att ge en bild av modulen som är så
klart som möjligt genom att abstrahera de
delar som är svåra att implementera till
något som är lätt att använda.
Man abstraherar det som det inte är
nödvändigt för klienten att veta.
Abstraktion innebär att en klient inte
behöver veta mer än nödvändigt.

           Begrepp - cohesion
Moduler som abstraherar det som det inte är
nödvändigt för klienten att förstå sägs ha
hög cohesion eller sammanhållning.


                        Objekt
Ett objekt är något som man kan interagera
med genom att sända meddelande till det.
Objekt är en sak. Detta behöver dock inte
vara en fysisk sak utan kan vara ett
konceptuellt begrepp i systemet.

Ett objekt har ett tillstånd som bestäms av
den data som objektet inkapslar – dess
attribut. Vissa attribut kan ändras, andra inte.
I de flesta språk så kan inte antalet attribut
ändras under ett objekts livstid men det
finns undantag.

Ett objekt har ett beteende som bestämmer
hur objektet reagerar på meddelanden.
Hur ett objekt reagerar på ett meddelande
kan bero på dess tillstånd.

Ett objekt har även en identitet. Denna
identitet är inte det samma som ett objekts
namn eller den referensvariabel som
refererar till objektet.
Ett objekt kan ha flera namn men har endast
en identitet.