Permalänk
Medlem

OOP

Hej!
Kan någon lätt och förståligt förklara vad som menas med objektorienterad programmering?

Permalänk
Permalänk

Hmm.

Det är nog ämne nog för en större bok.

Men lite förenklat så kan vi väl säga att det finns tre "nivåer" inom programmering, i de flesta språk.

I det första läget, så skriver du bara all kod i en följd och beräknar ut det du behöver göra osv, och outputtar till skärm, papper, webb, eller vad det nu är. Sådan kod blir snabbt väldigt svår att ta hand om.

Andra steget är att lära dig använda funktioner. Du definierar funktioner som tar en viss input, behandlar denna, och presenterar en viss output. Dessa funktioner kan du sedan kedja ihop med lite if-then-else-logik för att få ihop någon form av program.

Den tredje nivån, som novisen når efter lång mediation i dojon och många sena nattliga lektioner med jolt cola-san, är att progga objektorienterad. Då definierar du olika objekt som interagerar med varandra på olika sätt. Objekten kan ha egenskaper, dom kan ha relationer och ärva ifrån varandra (strikt talat ärver väl iofs klasser, snarare än objekt.. men det är en annan diskussion tror jag). De kan ha metoder, dvs typ funktioner som opererar bara på dom. Osv osv.

När du proggar något större är det en bra sak att ha objekt och en objektorienterad approach. Det blir lättare att modularisera, speca upp koden, återanvända kod, osv osv. Men det är klart mycket svårare att ta till sig för en noobie.

Nån annan här kan säkert fylla i mer i detalj hur OOP funkar.

W

Permalänk
Medlem

I princip kan man säga att i "vanlig" icke-oop (t.ex. som i språket C) så gör man såhär (lite pseudokodsaktigt):

// definiera en "struct", några datatyper som sitter ihop struct point { int x; int y; } // så har du en funktion som kan påverka en point-struct void move(point myPoint, int newX, int newY) { // noterea att den här funktionen, som egentligen inte har nåt att göra med "point", måste känna till hur den är definierad struct.x = newX; struct.y = newY; } // sen har du kanske en mainloop void main() { point cursor_position; while (true) // kör så länge som det går { if (mousePointerHasChangedPosition) { // uppdatera din egen point move(cursor_position, GetCursorPositionFrånOperativSystemetEllerNÅnting().x, GetCursorPositionFrånOperativSystemetEllerNÅnting().y); } } }

I ett objektorienterat språk kan det istället se ut såhär:

// definiera en "class", några datatyper och metoder/funktioner class point { private: // göm dom här för omvärlden, allt omvärlden // behöver kan dom göra genom mina funktioner, i det här fallet "move" int x; int y; public: // här kommer saker som resten av programmet kan se void move(int newX, int newY) // behöver inte ta in en struct { x = newX; // x och y är "mina" intar y = newY; } int getX() { return x; } // användaren behöver inte veta att x-positionen lagras som en int int getY() { return y; } // utan kan bara använda funktionen glatt utan att känna till exakt hur den funkar } // sen har du kanske en mainloop igen void main() { point cursor_position; while (true) // kör så länge som det går { if (mousePointerHasChangedPosition) { // uppdatera din egen point point.move(GetCursorPositionFrånOperativSystemetEllerNÅnting().getX(), GetCursorPositionFrånOperativSystemetEllerNÅnting().getY()); } } }

Så skillnaden i stort är att man opererar på objekt som vet hur dom tar hand om sig själva, istället för att man har en uppsättning data och en uppsättning funktioner som opererar på den datan. Det har en bunt fördelar.

Nu finns det fler sätt att programmera på än dom två jag beskrivit, men antar att det var nåt sånt du ville veta.

Visa signatur

Min hemsida: http://www.srekel.net
Pocket Task Force: http://ptf.srekel.net
Kaka e gott! http://kaka.srekel.net

Permalänk

Enklaste sättet att beskrigva objektorienterad programmering är att det är när man försöker dela in sina problem i objekt.

I spelprogrammering är OO speciellt lämpligt då man kan ha ett objekt för regn, ett för spelare, ett för träd etc.

Det som ofta brukar komplicera det hela är olika språks implementationer av OO.

Som srekel, på kanske ett lite svårtolkat sätt säger. I procedurell programmering skulle man kanske skriva:

while(true): #Klassiska oändliga loopen drawrain(raininfo) drawhouse(houseinfo) moveplayer(playerinfo, movement) drawplayer(playerinfo)

Medans med OO skulle det bli:

while(true): #Klassiska oändliga loopen myrain.draw() myhouse(houseinfo) myplayer.move(movement) myplayer.draw()

En viktig del i OO är att man kan gömma delar som inte bör synas utåt, till exempel behöver ju inte någon annan än husklassen veta exakt hur den målar upp sig, om det är en statisk bild som lagras gömt i house.image eller om det är en funktion som målar upp den med boxar är ju irellevant för andra delar av programmet, bara den ritas upp ordentligt av house.draw()

Det är dock möjligt att koda rätt så objekorienterat även i språk som inte har något inbyggt stöd för det, det blir bara lite krångligare. Jag rekommenderar att lära sig med ett språk som Ruby eller Python först, då de har en väldigt naturlig OO, allt är objekt i de språken.

Visa signatur

Python-IRC på svenska: #python.se

Permalänk
Medlem

Jag har precis börjat med Programmering och jag valde att börja med OOP innan ngt annat (kanske var dumt eller?) så jag är inte alls så insatt i programmering, så jag tyckte att ni förklarade lite för svårt. Men jag har en tjock bok om c++ så jag kommer nog att lära mig OOP med tiden.

Tack för att ni tog er tid att hjälpa mig.

Permalänk
Medlem

Det är rätt svårt o greppa OOP innan man fått lite erfarenhet. Många av mina elever hade svårt med att se nyttan innan de tog ett av deras tidigare lite större projekt och delade upp programmet i klasser istället. Ett bra sätt för att lära ut i början brukar vara att dra paralleller till verkligheten.

Man kan säga att Gud var en programmerare och en jävligt duktig sådan. Om du tänker dig allt i hela universum är programmerat, så är tex människa en klass, medans tex kung Karl Gustav är ett objekt. Gud kodade först en klass för människan, denna klassen bestämmer hur en människa fungerar. Den innehåller all data ( int, string osv ) så som hjärta, hjärna osv. Klassen innehåller även funktioner så som Andas(), Äta( föda p_maten ) osv. Eftersom att Gud gjort en klass så kan han sedan ruggigt enkelt skapa ca 5 miljarder människor med hjälp av tex en array.

Människa JordensMänniskor[5000000000];

Ifall han inte hade använt OOP hade han istället fått skapa variabler lokalt för varje människa och sedan förmodligen fått använda sig av en massa funktioner som skulle varit tvugna och ta väldigt många paramterar. Hjärta i detta exemplet är dessutom i sin tur en klass som gud definerade all funktionalitet för som ett hjärta behöver för att fungera. Sedan om han behöver ett hjärta för en ko eller en människa är endast en mindre skillnad, då kan man använda sig av arv. Lättast är dock om du försöker greppa konceptet innan du gräver djupare.

Permalänk
Glömsk

Objektorientering är enbart ett sätt att abstrahera sitt program. Det är varken bättre eller sämre än andra abstraheringsmetoder. Blir koden lättare att förstå är det bättre, annars inte.

När man börjar skriva väldigt stora program så har man som programmerare ofta mycket att hålla reda på. Man vill ofta abstrahera bort så många detaljer som möjligt. Om man exempelvis skriver ett datorspel och har fixat lite kod för att spela upp ljud så vill man gärna på något vis glömma bort den här koden när man sedan arbetar på grafikkoden. Ljudkoden, som kanske är tusentals rader, gömmer man undan till några funktioner som man förusätter fungerar. Det här är väldigt bra för huvudet och en form av abstrahering, bättre än om man spred ut sin ljudkod mitt i grafikkoden. Det blir lätt en soppa av allt annars.

Objektorientering kan göra det lättare för huvudet om man kodar på något som på en konkret nivå är ett substantiv. Den här tumregeln säger att om man i sitt spel kan välja flera olika vapen (ett substantiv), så kan man skriva objektorienterad kod för vapnen. Objektorienteringen grupperar ihop koncept på en kodnivå precis som människan kan gruppera ihop koncept med varandra på hjärnnivå. Man kan ju exempelvis ladda om ett vapen. Konceptet "ladda om" hör till vapen, inte ljudkoden. Därför är det ju smidigt om man kan associera konceptet "ladda om" och vapnet i koden. Det kan man göra med objektorientering. Vidare. Både en shotgun och en railgun är ju olika typer av vapen, och borde ju alltså teoretiskt kunna dela kod, eller i alla fall för programmeraren fungera på samma vis. Det här kan objektorientering hjälpa till med.

Vad vinner man på detta? Programmeraren kan nu koda med vapen. Det här låter kanske jäkligt konstigt, men om man har lyckats med sin objektorientering så har man förlängt programmeringsspråket man användar på ett sådant vis att man direkt kan översätta hur man abstraherar i huvudet till hur man abstraherar i kod. Med lite övning givetvis.

Dessvärre verkar det finnas någon generellt accepterad åsikt att objektorientering är lösningen på alla jordens programmeringstekniska problem. Det här stämmer givetvis inte, precis lika lite som man kan lösa alla trädgårdstekniska problem med en motorsåg.

Visa signatur

...man is not free unless government is limited. There's a clear cause and effect here that is as neat and predictable as a law of physics: As government expands, liberty contracts.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Superb
Jag har precis börjat med Programmering och jag valde att börja med OOP innan ngt annat (kanske var dumt eller?) så jag är inte alls så insatt i programmering, så jag tyckte att ni förklarade lite för svårt. Men jag har en tjock bok om c++ så jag kommer nog att lära mig OOP med tiden.

Tack för att ni tog er tid att hjälpa mig.

Aha. Ja, om man inte kan nån programmering alls kan jag förstå att mitt exempel var lite jobbigt. Förutsatte att du hade lite kunskap inom t.ex. C eller Java (men inte riktigt förstått poängen med OOP). Nåja, good luck!

Visa signatur

Min hemsida: http://www.srekel.net
Pocket Task Force: http://ptf.srekel.net
Kaka e gott! http://kaka.srekel.net

Permalänk
Medlem

Ok..Jag tror jag börjar fatta lite nu

Men är det värkligen någon idé att Lära sig förstå OOP när man aldrig har hållt på med ngt annat språk? Jag menar är det inte bättre att "bara lära sig" ett språk med OO så lär jag ju mig att förstå OOP automatiskt, jag har ju adrig tänkt på ngt annat sätt när jag programmerat. Det är ju en annan sak om man först har programmerat i ett icke-OOspråk än om man börjar med ett.

Hoppas ni förstår

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Superb
... är det inte bättre att "bara lära sig" ett språk med OO så lär jag ju mig att förstå OOP automatiskt ...

Jo.

Att lära sig objektorienterad programmering är inte speciellt krångligt. Speciellt inte om du tar ett språk som C++ eller nått liknande. Man måste inte vidta några speciella åtgärder för att "fatta" det hela.

Permalänk
Medlem
Permalänk
Hedersmedlem
Citat:

Ursprungligen inskrivet av Superb
Ok..Jag tror jag börjar fatta lite nu

Men är det värkligen någon idé att Lära sig förstå OOP när man aldrig har hållt på med ngt annat språk? Jag menar är det inte bättre att "bara lära sig" ett språk med OO så lär jag ju mig att förstå OOP automatiskt, jag har ju adrig tänkt på ngt annat sätt när jag programmerat. Det är ju en annan sak om man först har programmerat i ett icke-OOspråk än om man börjar med ett.

Hoppas ni förstår

Lite inte helt på mig men man kan ju säga att C++ inte "tvingar" (se det inte som något negativt) på dig OOP. När du börjar programmera så kan du nog göra ganska mycket i C++ eftersom det har mycket gemensamt med C som inte är OO. Om du läser en bok om C++ kommer de givetvis ta upp OO ganska snart.
Så du får det gradvis med dig i C++.

Men ser man till språk som python är OOP mer naturlig där, som någon skrev så är allt objekt. Där får du OO med "modersmjölken" när du lär dig språket.
Python är dock inte ett dåligt språk, tvärt om.

För att i till slut vara en flexibel och bra programmerare är det ju bra att inte bara ha hjärnan instängd i att allt ska lösas med OO. Som Psionicist skrev så är det inte lösningen på alla världens programmeringsteknisk problem.

Jag tror jag inte lyckades svara på vad du ville ha svar på men jag ville skriva lite

Visa signatur

Forumregler | Feedbackforumet | Något som behöver modereras? Tryck på Anmäl inlägget och ge en anledning, någon moderator kommer granska inlägget och göra (egen) bedömning
"Fate. Protects fools, little children and ships named Enterprise." - Riker - ST:TNG

Permalänk
Medlem

Du kommer inte få OOP "på köpet" om du lär dig C++. Jag tror att enda sättet att lära sig OOP är att först lära sig proceduriskt hur man programmerar, sedan gradvis gå över till OOP. Då förstår du varför och vad det är till för. Då kommer du upptäcka att programmera egentligen är lätt, och att det istället är svårt att designa program istället.

Permalänk
Medlem

Ok,
tack så mkt för hjälpen.

Har ni några tips till en nybörjarprogrammerare på hur man kan lära sig på bästa sätt osv?

Permalänk
Medlem

Leta tutorials på nätet och framför allt; skriva program. Få saker beror så mycket på erfarenhet som programmering.

Jag tror faktiskt att det är bäst att börja programmera utan OOP. Det kan man göra i princip alla språk. Har hört att folk som direkt börjar med OOP har svårare att se hur allt verkligen fungerar och får svårigheter när de inte ska programmera objektorienterat. Om du väl kan programmera "vanligt" kommer objektorienteringen inte innebära några konstigheter.

Visa signatur

Real Programmers always confuse Christmas and Halloween because OCT 31 == DEC 25 !

Permalänk
Hedersmedlem

För en som aldrig hållt på med programmering så tycker jag en bok är bättre då den har ett upplägg och tar upp många delar. Inte hop-hafsat tutorial på nätet. Du skrev väl att du redan hade en bok om C++? Börja läs
btw vad heter den och skriven av vem? (så vi kan hylla den eller såga den).

Visa signatur

Forumregler | Feedbackforumet | Något som behöver modereras? Tryck på Anmäl inlägget och ge en anledning, någon moderator kommer granska inlägget och göra (egen) bedömning
"Fate. Protects fools, little children and ships named Enterprise." - Riker - ST:TNG

Permalänk
Medlem

Jag har faktisk redan läst till kapitel 3

Boken heter c++-programmering av stephen prata upplaga 5.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Superb
Jag har faktisk redan läst till kapitel 3

Boken heter c++-programmering av stephen prata upplaga 5.

Den är bra!

Permalänk
Medlem

Ja,jag tycker den värkar vara det. Jag har ju lärt mig lite c++ utan problem men det är bara det att jag inte förstår OOP, vad som är skillnaden eftersom jag aldrig hållt på med ngt annat icke-OOP språk. Men jag förstår vad allt gör och jag vet hur allt fungerar i c++, så jag antar att jag kan OOP utan att veta om det

Permalänk
Hedersmedlem

Den boken brukar rekommenderas. Har den själv fast inte läst i den ännu (kan en del C++ sen tidigare och köpte boken för den var billig då - jag borde nog fan läsa mer programmeringsböcker).

Jag tittade på innehållsförteckningen, det var inte förrens kapitel 10 du börjar programmera OO saker, du kommer ju använda färdiga saker i bibliotek osv som bygger på det tidigare men det "vet" du inte.

Visa signatur

Forumregler | Feedbackforumet | Något som behöver modereras? Tryck på Anmäl inlägget och ge en anledning, någon moderator kommer granska inlägget och göra (egen) bedömning
"Fate. Protects fools, little children and ships named Enterprise." - Riker - ST:TNG

Permalänk
Medlem

Så HTML och CSS kan ses som ett OOspråk? (Förutom att det inte är ett kodspråk, men som liknelse).

Där delar du in en sida i olika klasser (<div>, <p>, <b>) som ges egenskaper av en CSS, alltså får varje klass ett innehåll. Sen kan du skapa, vad kallade ni det? Arv? Om man t ex sätter en class på en div. Då kan den ärva egenskaperna från den förra diven med en viss evolution (förändring). Sen har du ID:n som kan motsvara objekt antar jag?

Försöker bara förstå det i termer som jag kan ta till mig, för det mesta jag läst här är bara godis i klubben för inbördes beundran. No offence

Permalänk
Medlem

Ja darkmoon, det är samma koncept som man använder sig av när man pillar HTML/CSS. Om man ska jämföra med HTML/CSS så är den stora skillnaden att man kan skapa sina egna taggar.

Permalänk

darkmoon: Haha, det var ett nytt sätt att se på HTML + CSS

Visa signatur

Permalänk
Medlem

Jag sa ju förut att jag inte hade programmerat i ngt språk förut men jag har ju faktiskt goda kunskaper i HTML och CSS.