[OOP] Ben ik op de goede weg ?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Willem-Aart

Willem-Aart

29/11/2008 14:52:00
Quote Anchor link
Ik wil graag wat feedback over mijn manier van denken. Ik ben op school nu bezig om a.d.h.v. Java de basisprincipes van het object georiënteerd programmeren aan te leren, en wou nu al het één en ander toepassen in een relatief zinvol PHP script omdat ik van mening ben dat ik daar wel aan toe ben.

Het probleem is dat me eigenlijk nog niet geleerd is hoe ik klassen moet ontwerpen, maar aangezien dit best een simpel voorbeeld is (denk ik..) durf ik me er wel aan te wagen.

Ik hou van het maken van foto's en programmeren. Nu wou ik die twee hobby's combineren dus ik had bedacht om een remote shooting script te schrijven. Nu heb ik onder Linux het programma "gphoto2" geïnstalleerd, dit werkt uitstekend en het stelt me in staat om m'n spiegelreflex op een afstand te besturen.

Nu wil ik zorgen dat ik vanaf een PHP script deze software kan besturen. Nu weet ik wel dat dat met shell_exec() uitstekend gaat en is het me ook al gelukt om een OOP PHP script te schrijven dat prima werkt (zie http://mcdronkz.ath.cx/remotecapture/ password is "fahrftw") maar de klassen steken volgens mij onlogisch in elkaar en daar hoop ik door dit topic wat verandering in te brengen.

Ik wil het vanaf nu wat meer to the point gaan houden want ik begrijp dat bovenstaand stukje misschien een beetje te uitgebreid is beschreven, dus hier komt 'ie.

Eerst even kijken welke objecten ik nodig heb:

Ik heb een programma genaamd gphoto, deze is aan één of meerdere camera's gekoppeld, de geselecteerde camera moet een foto maken nadat iemand het goede wachtwoord heeft ingegeven.

Hier haal ik sowieso de volgende objecten uit: camera, foto, authenticatie.

Laten we beginnen met de makkelijkste, authenticatie:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
/*
Het is niet nodig om hier een instance van te maken, daarom gebruik ik een static class.
*/

static class Authentication () {
    $password = "sdghsd235235uwdhghsdgs32523"; //MD5 string
    
    public static function checkPassword($password) {
        /*
        Deze controleert of md5($password) gelijk is aan $this->password en returned uiteindelijk true of false.
        */

    }
}

?>


Ok, dan hebben we die gehad.

Dan krijgen we de camera. We willen dus één of meerdere camera's kunnen bedienen. Ik denk dat ik daarvoor een handler nodig heb, maar dat is van latere zorg.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php
class Camera () {
    private $model; //Model is het merk en type van de camera, hiermee kun je meerdere camera's onderscheiden.
    
    function __construct($model) {
        setModel($model);
    }

    
    public function setModel($model) {
        $this->model = $model;
    }

    
    public function getModel() {
        return $this->model;
    }

    
    
    public function captureAndDownloadPicture($filename) {
        /*
        Maak een foto en sla deze op de schijf op met de ingegeven bestandsnaam. Maak vervolgens een instance van een picture en return deze.
        */

        $picture = new Picture($filename);
        return $picture; //$picture is van het type picture
    }
    
    public function getAperture() {
    
    }

    
    public function getShuttertime() {
    
    }

    
    public function getISOSpeed() {
    
    }
}

?>


Ik denk dat ik wat betreft de camera zo aardig compleet ben. Nu moet ik nog meerdere camera's kunnen bedienen, en dat wou ik met een cameraHandler object gaan doen. Het is overigens de bedoeling dat het procedurele gedeelte deze klasse rechtstreeks aanroept, en hier een instance van maakt. Dit is wel iets waarvan ik niet helemaal zeker ben, dus input is zeker gewenst hier.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?php
class cameraHandler () {
    private $cameras = array(); //Array waar camera objecten in komen te staan.
        
    function __construct() {
        /*
        Maak instances van de camera objecten en plaats deze in $this->cameras.
        */

    }
    
    public function getCameras() {
        return $this->cameras;
    }

        
    public function getPicture($model) {
        /*
        Vooral over deze functie ben ik onzeker. Het is de bedoeling dat ik straks de foto kan resizen en dergelijke, en
        het lijkt me niet dat cameraHandler deze verantwoordelijkheid krijgt. Daarom ga ik straks een picture klasse en een
        pictureHandler klasse schrijven. De camera maakt een instance van een picture, die ik hier vervolgens met een statische
        pictureHandler object kan bewerken.
        */

        if(in_array($model, $this->cameras)) {
            $filename = "pictures/".time().".jpg";
            
            if(($picture = $this->cameras[$model]->captureAndDownloadPicture($filename)) != false) {
                pictureHandler::setPermissions($picture);
                pictureHandler::resizePicture($picture);
                pictureHandler::putLabelOnPicture($picture);
                
                return $picture;
            }
        }

        /*
        Return false als het niet gelukt is om een foto te maken.
        */

        return false;
    }
}

?>


Dan moeten we dus een picture klasse maken, deze bevat de bestandsnaam van de afbeelding maar kan in de toekomst natuurlijk uitgebreid worden met EXIF informatie return functies en dat soort zaken.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
    class Picture () {
        private $filename;
        
        function
__construct($filename) {
            setFilename($filename);
        }

        
        public function setFilename($filename) {
            $this->filename = $filename;
        }

        
        public function getFilename() {
            return $this->filename;
        }
    }

?>


En dan de pictureHandler:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
    static class pictureHandler() {
        public static function setPermissions() {
        
        }

        
        public static function resizePicture() {
        
        }

        
        public static function putLabelOnPicture() {
        
        }
    }

?>


Dan zou je het volgende stukje procuderele code kunnen gebruiken:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$handler
= new cameraHandler();

if($_SERVER['REQUEST_METHOD'] == "POST") {
    if(Authentication::checkPassword($_POST['password'])) {
        if(($picture = $handler->getPicture($_POST['model']) != false)) {
            echo "Er is een foto gemaakt met de volgende filename: ".$picture->getFilename();
        }
else {
            echo "Er ging iets fout tijdens het maken van de foto.";
        }
    }
else {
        echo "Voer het correcte wachtwoord in.";
    }
}
else {
    /*
    Toon een formulier met de camera's die gekozen kunnen worden en waar het wachtwoord ingevoerd kan worden.
    */

}
?>


Is dit nou de juiste approach ? Ik moet je eerlijk zeggen dat het behoorlijk lang geduurd heeft om deze vraag op te stellen omdat het voor mij nog moeilijk is om de relaties tussen verschillende objecten te zien en te bepalen. De code die ik hier geschreven heb kan ik voor mezelf wel rijmen denk ik, als ik kijk wat het doet is het voor mij vrij logisch.

Toch wou ik graag jullie kijk erop.
Gewijzigd op 01/01/1970 01:00:00 door Willem-Aart
 
PHP hulp

PHP hulp

26/12/2024 01:30:40
 
Onbekend Onbekend

Onbekend Onbekend

29/11/2008 15:51:00
Quote Anchor link
Leuk idee.
Ik krijg net van mijn vader de opdracht om een 'bewakings camera' te bouwen. Ik ga een simpel linux bakkie draaien waar een cam aan hangt, een programmatje gaat alles netjes opnemen en ik stream het vervolgens dmv PHP naar het control panel. Ik wil ook wat shell cmds gaan gebruiken om het programma te bedienen vanuit de interface die ik ga creëren. Dit wil mijn vader voor op vakantie.
 
Willem-Aart

Willem-Aart

29/11/2008 16:11:00
Quote Anchor link
Tommy schreef op 29.11.2008 15:51:
Leuk idee.
Ik krijg net van mijn vader de opdracht om een 'bewakings camera' te bouwen. Ik ga een simpel linux bakkie draaien waar een cam aan hangt, een programmatje gaat alles netjes opnemen en ik stream het vervolgens dmv PHP naar het control panel. Ik wil ook wat shell cmds gaan gebruiken om het programma te bedienen vanuit de interface die ik ga creëren. Dit wil mijn vader voor op vakantie.


Dat is wel even een ander verhaal natuurlijk, waarschijnlijk maak je dan gewoon gebruik van een webcam (voeding is dan wat makkelijker, gewoon via USB). Hierbij werk ik echt met losse bestanden :).

Ik heb m'n camera trouwens weer ingeschakeld voor de geïnteresseerden.
 
--

--

29/11/2008 17:15:00
Quote Anchor link
Afbeelding :-)
 
Ano Niem

Ano Niem

29/11/2008 18:50:00
Quote Anchor link
Willem-aart: Probeer voor jezelf eens een UML diagram te tekenen ( http://www.google.nl/search?rlz=1C1GGLS_nlNL291NL303&sourceid=chrome&ie=UTF-8&q=tutorial+uml+class+diagram )

Als je zo'n diagram kunt geven kunnen andere devvers wat makkelijker zien of je ontwerp klopt.

En als je voordat je gaat proggen zo'n diagram tekent kun je soms al wat ontwerp foutjes opmerken :)

In de meeste PHP OOP tutorials ontbreekt het stukje UML, terwijl dat bij OOP toch eigenlijk ook best belangrijk is bij het ontwerpen. Beetje zonde is dat..
 
Willem-Aart

Willem-Aart

29/11/2008 19:58:00
Quote Anchor link
Goed idee. Ik ga 't eerst maar eens maken op de manier zoals ik het hierboven beschreven heb (leuk tijdverdrijf), en daarna zal ik me eens storten op UML om vervolgens met een fraai diagram te komen. Alleen nog wat software voor OSX zoeken :).
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.