Oprettet ons. d. 02. februar 2005 kl. 22:16:55

gartzen
gartzen (18.758 point. Point ude: 500)

OOP - Hvorfor?

Hej,

Jeg har nogle spørgsmål angående OOP i PHP. Jeg har aldrig rigtig gjort det, men kender dog syntaxen og måden de bliver behandlet på.

Den måde jeg programmerer på nu er typisk, ved størrer projekter, at jeg laver en fil som hedder functions.php hvori jeg så skriver alle mine funktioner og laver en include "functions.php"; på alle de sider hvor de skal bruges.
Dette syntes jeg er meget effekttivt, overskueligt og nemt at håndtere og gå til.

Men nu er jeg så kommet så langt så jeg vil til at se på noget objekt orrienteret. Hvad kan OOP som min metode med functions.php ikke kan? Hvilke forde er der ved at lave objekter og klasser?

Jeg har læst nogle eksempler med rollespilsfigurer som havde en klasse, rum/baner i spil som havde sin egen klasse osv. Dette ser jo også vældig fint ud, men jeg kan bare ikke se hvorfor det skulle være bedre/nemmere/mere overskueligt at lave det i klasser?

Jeg har læst masser af steder i tutorials/fremlægninger af princippet med klasser/OOP, at "der gøres meget opmærksom på at OOP IKKE ER KLASSER, MEN KLASSER ER EN _DEL_ AF OOP". Hvad er de andre dele så?

Håber nogen vil forklare mig lidt om det..

Mvh. GartZen

Skrevet ons. d. 02. februar 2005 kl. 22:39:34| #1

arne_v
arne_v (1.005.653 point)
Nu er jeg ikke PHP ekspert så følgende bliver baseret på generel OOP.

Fordele ved OOP:

* klasser med både data og funktionalitet afspejler meget godt
  virkeligheden og de fleste programmer skal modellere noget fra
  virkeligheden

* de gængse features i klasser: restriktion af adgang til fields/methods
  med private/protected/public, arv mellem klasser, virtuelle metoder
  og polymorfisme gør det muligt at lave noget meget robust kode og
  noget meget genbrugeligt kode

  [hvad understøtter PHP af dette ??]

* disse ting og diverse andre gør at man normalt antager at OOP sparer
  tid ved større programmer - hvor grænsen går kan diskuteres - jeg vil
  typisk sætte den ved omkring 5000 linier (men det er baseret på C versus C++)

Skrevet ons. d. 02. februar 2005 kl. 22:43:57| #2

arne_v
arne_v (1.005.653 point)
Mange mener at OOP er klasser eller at OOP er arv.

Der skal mere end klasser til for at det er OOP.

Og arv er en meget lille del af OOP som skal anvendes med fornuft.

Nogle alternative definitioner:

OOP er programmering hvor man forsøger at mappe virkelighedens objekt typer
til klasser.

OOP er programmering med brug af konstruktioner som GoF patterns og lignende.

OOP er if og switch fri programmering.

Skrevet ons. d. 02. februar 2005 kl. 22:50:52| #3

gartzen
gartzen (18.758 point)
* nr. 1) Da PHP er et scriptsprog og er bygget op som det er, kan jeg stadig ikke se hvad funktioner i en klasse og variabler i en klasse kan, som alm. funktioner og variabler ikke kan.

* nr. 2) Hvad er fordelene ved restriktion?
hvad "kan" arv?

Så det vil sige at man egentlig sagtens kan klare sig uden at programmere OO? Det er bare en "service" for overskueligheder og tilgangen til funktionerne?

Skrevet ons. d. 02. februar 2005 kl. 22:51:27| #4


Skrevet ons. d. 02. februar 2005 kl. 22:53:07| #5

gartzen
gartzen (18.758 point)
alister_crowley -> Jeg ved godt hvad klasser er og hvordan man tilgår og bruger dem. Jeg er interesseret i at finde ud af hvorfor der er fordel i det :)

Skrevet ons. d. 02. februar 2005 kl. 22:55:25| #6

alister_crowley
alister_crowley (12.780 point)
i PHP er alting public, dog kan man godt lave private methoder, hvis man definere dem inden i en klasse, i så fald skal klasses kaldes før men kan bruge den metode.

Dog er PHP5 på dette punkt langt bedre.
Men hvis grænsen går på 5000 linjer, så skal ens systemer være meget store, før det kan betale sig at kode OOP.

Men at kode overskuelige methoder, og lave klasse til besteme formål er jo smart.

F.eks. lavede jeg til et cs-clan system

bruger.class
nyhed.class
tagwall.class
server.class

Som indenholder alle funktioner, også administrative.
Og så kræver det kun få linjer kode at aktivere dem.

Skrevet ons. d. 02. februar 2005 kl. 22:56:16| #7

arne_v
arne_v (1.005.653 point)
re 1)

Ingenting. Du kan heller ikke noget i PHP som du ikke kan skrive i assembler kode.

Det er bare et spørgsmål om hvad der er den bedste måde at gøre det på -
udviklingsmæssigt og vedligeholdelses mæssigt.

Skrevet ons. d. 02. februar 2005 kl. 23:01:12| #8

arne_v
arne_v (1.005.653 point)
re 2)

Det er en fordel at restricte adgangen fordi det giver en adskillelse mellem
interface og implementation. Hvis du ændrer i interfacet kan du risikere at
skulle skrive en masse kode som bruger din kode om. Hvis du kun ændrer
i implementationen så påvirker du ikke noget. OOP indeholder en lang
række teknikker til at enforce dette d.v.s. at man får fejl hvis man overtræder
spille reglerne. Med procedural kode, så kan man lave konventioner og lave
kode reviews for at checke om konventionerne bliver fulgt. det er ikke nær
så effektivt som et compiler/forolker check.

Arv betyder at en sub klasse arver nogle egenskaber fra en super klasse.

Skrevet ons. d. 02. februar 2005 kl. 23:04:39| #9

alister_crowley
alister_crowley (12.780 point)
For at adskille interface og implementation (sådan som jeg har forstået det fra Java)
så er du i php nød til at f.eks. lave xml output med php, og så parse det til html med xslt, og så blvier OOP en realitet.

En ven af mig, har lavet patch CMS www.patch.dk
og hvis du læser dokumentationen (http://www.patch.dk/ (...)) så vil du måske kunne se nogle formål med OOP :)

Skrevet ons. d. 02. februar 2005 kl. 23:04:49| #10

arne_v
arne_v (1.005.653 point)
Med få linier kode er den væsentligste grund til at bruge OOP at man lærer det.

Hvordan man strukturerer og genbruger kode bliver kritisk ved store kode
mængder. 100000 linier kode. 1 million linier kode. 10 millioner linie kode.
Når man når derop så kan en 20% forskel i antal linier kode nemt komme
til at betyde en million kroner i forskel i årlig vedligeholdelse.

Skrevet ons. d. 02. februar 2005 kl. 23:27:29| #11

gartzen
gartzen (18.758 point)
Jeg har siddet og tænkt lidt over det, men jeg kan stadig ikke se den helt store fordel. Beklager, men i må overbevise noget mere ;o)

Hvis vi nu siger at jeg laver en side som indeholder nogle afstemninger, med klasser. Så bliver det noget lignende:

class Afstemningsmodul {
  function add_new() {
    //...
  }
  function view() {
    //...
  }
  function edit() {
    //...
  }
  function update() {
    //...
  }
}


hvorfor er det så mere smart end at lave det sådan:

function afstemning_add_new() {
  //...
}
function afstemning_view() {
  //...
}
function afstemning_edit() {
  //...
}
function afstemning_update() {
  //...
}

?

I den ene skal man oprette en ny afstemning med
$afstemningsmodul = new Afstemningsmodul;
$afstemningsmodul->add_new();

og i den anden:

afstemning_add_new();

---------------

Ser det ud til at der er noget jeg har misforstået?
Kan en af jer give et eksempel på hvornår classes konkret er være smartere/nemmere end det med alm. functions?

Skrevet ons. d. 02. februar 2005 kl. 23:32:09| #12

arne_v
arne_v (1.005.653 point)
Dit eksempel illusterer hvorfor klasser ikke er nok til at gøre det OOP.

Afstemningsmodul er ikke et objekt i virkeligheden.

Dine klasser vil snarere være:
  Afstemning
  Bruger
  AfstemningsMenu

Skrevet ons. d. 02. februar 2005 kl. 23:37:47| #13

gartzen
gartzen (18.758 point)
Ok... Jeg tror måske lige så stille der begnder at gå lys op for mig :-)

Men:

Men hvis jeg så har klasserne
  Afstemning
  Bruger
  AfstemningsMenu

De har hver især nogle funktioner og variabler. Hvorfor skal de kapsles ind i klasser? Jeg tror jeg bliver nød til at bede dig om at skrive/finde et eksempel hvor det er smartere at bruge klasser end alm. funktioner..

Skrevet ons. d. 02. februar 2005 kl. 23:38:10| #14

arne_v
arne_v (1.005.653 point)
Du kan f.eks. lave en abstrakt klasse Afstemning og nogle konkrete klasser
som arver fra den:
  AfstemningJaNej
  AfstemningMangeTal
  AfstemningMangeTekster
hvor
  * Afstemning indeholder det der er fælles for alle afstemninger f.eks.
    titel og kode til at registere at en bruger har stemt
  * AfstemningJaNej indeholder kode til at generere to radiobuttons
    med ja nej og en boolean result
  ...
  * AfstemningMangeTekster indeholder et array af tekster og kode
    til at vise disse med radiobuttons og en integer til result

Skrevet ons. d. 02. februar 2005 kl. 23:41:29| #15

arne_v
arne_v (1.005.653 point)
Koden der læser Afstemning op fra disk vil man så gøre private sådan
at koden der bruger Afstemninger ikke ved hvordan de er gemt. Så kan man
ændre implemenattionen fra at gemme dem som XML filer til at gemme dem
i databasen og være sikker på at det ikke påvirker anden kode, fordi
den funktionalitet er ikke accessable (synlig) fra kode udenfor
klasserne.

Skrevet ons. d. 02. februar 2005 kl. 23:51:40| #16


Skrevet tor. d. 03. februar 2005 kl. 00:24:10| #17

olebole
olebole (214.028 point)
<ole>

Min egen erfaring er, at OOP begynder at give mening, efterhånden som man arbejder med det - og prøver at vedligeholde OOP'et kode. Det er en anden måde at tænke programmering på - og som Arne påpeger en meget mere virkeligheds baseret måde.

Der er mange fordele ved at indkapsle variabler. Jeg bygger selv en del temmelig store GUI-komponenter i DHTML og der er alene det, at kunne holde variabel-scope'et 'rent' en herlig ting.
Jo flere variabler du skal håndtere, jo mere besynderlige navne får de ofte i alm. procedural programmering - og jo mere uoverskuligt bliver det, hvilke variabler, der hører til, hvor - og skal hvad.
Ved OOP får du flyttet langt de fleste af de globale variabler, du uundgåeligt vil have i procedural kode ind i den kontekst, hvori de hører hjemme.

Når jeg skriver disse komponenter som objekter, kan andre bruge dem og fylde al mulig anden kode ind i samme dokument uden fare for 'interferens'. Objekternes interne struktur - og overordnede relationer - gør det samtidigt let og hurtigt at overskue koden, selvom jeg måske ikke har haft fat i den meget længe.

Selvom JS er prototype baseret og PHP er klasse baseret - og der bl.a. derfor er en del forskelle på den praktiske brug af OOP i de to sprog - er der dog ikke den store forskel, hvad angår de fordele, jeg nævner ovenfor ... eller dem Arne nævner. De er ens for de fleste sprog, der understøtter en form for OOP.

Du er formodentlig allerede vandt til OOP fra alle JavaScript's DOM bindinger. Det er jo ganske praktisk og overskueligt, at image-objektet har en source-property, vi kan læse og sætte. Det gælder også for alle objektets andre metoder.
Metoderne ligger ikke og 'roder rundt' i sproget som løse funktioner, men som metode på objektet, hvor de naturligt hører hjemme.
Det gælder alle HTML-objekterne og prøv f.eks. at forestille dig en r..fuld funktionsnavne, der ville være 'brugt op' allerede.
At dømme udfra JS-kategoriens spørgsmål er der rigeligt med reserverede ord i JS  ;o)

CSS er et eksempel på et formaterings sprog, man i til en vis grad har tillempet OOP-tænkning, hvilket gør det yderst logisk at arbejde med.

OOP er i høj grad en måde at tænke på. Det er min erfaring, at jo mere jeg bruger den, jo mere 'rigtig' føles den  :)

/mvh
</bole>

Skrevet tor. d. 03. februar 2005 kl. 00:34:51| #18

plx
plx (15.831 point)
Et lille eksempel.. du skal udvikle et multiplayer spil. Du laver en SPILLER class, som indeholder alle egenskaber og funktioner som en en spiller kan gøre brug af.

Når en ny bruger joiner spillet, laver du blot en ny instans af klassen, og sætter de egenskaber som kendetegner denne spiller, og så ruller det. Nemt og simpelt.

OOP kan være en rigtig hjælpsom fætter

Skrevet tor. d. 03. februar 2005 kl. 07:30:30| #19

Eller hvor tit har man ikke selv prøvet at skulle bruge en tæller (som regel $i) for blot at opdage at man har brugt den tidligere, og glemt at unsette den.

Jamen så bruge vi da bare $i2, eller $i3, eller .... og til sidst sidder du og bruger timevis på at bugtracke noget der slet ikke ville være et problem med OOP.

Skrevet tor. d. 03. februar 2005 kl. 10:43:24| #20

gartzen
gartzen (18.758 point)
Jeg begynder faktisk at kunne se det smarte i det :) Men som du siger olebole, så føler man det sikkert mere 'rigtigt' jo mere man arbejder med det.. Så det vil jeg da gå i gang med :)

Arne_v -> De links og forklaringer du kom med her til sidtst fik et lys til at gå op for mig ;)

plx -> Yep, det er sådanne eksempler jeg hele tiden har læst. Men jeg har bare stadig lidt svært ved at forestille mig det i PHP.

Men jeg giver det en chance til :) Smid nogle svar.. (Inputs er stadig velkomne..!)

Skrevet fre. d. 04. februar 2005 kl. 00:14:40| #21

alister_crowley
alister_crowley (12.780 point)
intet til mig ihvertfald, samler ikke på points.

OOP i php er også stadig mærkeligt ;)

Skrevet fre. d. 04. februar 2005 kl. 07:14:07| #22


Skrevet fre. d. 04. februar 2005 kl. 22:43:19| #23

olebole
olebole (214.028 point)
Et 'causeri' om personlige OOP-betragtninger under JavaScript, bør vist ikke udløse points her, så jeg springer over  :)

Skriv et indlæg




Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] [img]link til billede[/img]
Web- og emailadresser omdannes automatisk til links

Log ind

   

   

Seneste spørgsmål

Udtræk af enkelte felter fra bestemte kolonner i mysql

Oprettet den 11. februar 2012 kl. 19.27
hrole giver 30 point for svar | Giv et svar »

Procentregning

Oprettet den 11. februar 2012 kl. 11.26
sevinding giver 60 point for svar | Giv et svar »

Ville ikke tildele at upload det til database eller komme...

Oprettet den 10. februar 2012 kl. 21.23
tobrukDk giver 15 point for svar | Giv et svar »

Seneste guides

Installer win 7
Den gode bruger


   




Tips & Tricks fra PC World

Teaser billede

Her er fem sjove danske websider du skal kende

Trænger dine lattermuskler til en omgang fitness på dansk? Vi viser vej til fem websider fyldt med humor og vanvittig satire.


Anmeldelser fra PC World

Teaser billede

Test: Denne super-tablet er iPads hårdeste konkurrent

Eee Pad Transformer Prime er frygtindgydende med sin quadcore processor og evne til at trylle sig om til bærbar. Apple bør kigge i bagspejlet, for Asus' tablet-pc kommer buldrende - og gør det...


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Nu kan du snart hente Windows 8

Den nye offentlige betaversion af Windows 8 er klar i denne måned.


Nyheder fra Computerworld

Teaser billede

Måske snart slut med Androids helt store problem

Android-platformen har længe været plaget af et særligt problem. Men måske er problemet nu ved at være elimineret.


Kurser
Samarbejdspartnere

Udgiver · © 2012 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger