paginering OOP

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Applicatie ontwikkelaar

Functie omschrijving Zelfstandige applicatie ontwikkelaar gezocht voor familiair bedrijf in omgeving Barendrecht! Ben jij op zoek naar een nieuwe uitdaging en zoek jij een informele werkgever waar je zelfstandig kunt werken binnen een leuk IT team, lees dan snel verder want wie weet zijn wij op zoek naar jou! Binnen deze rol houdt jij je met het volgende bezig: Onderhouden en ontwikkelen van de IT systemen; Opzetten van Azure Cloud systemen, denk aan interfaces, hardware op de Cloud, webportalen of BI functies; Werken aan scripts binnen verschillende software applicaties, denk aan ERP en CAD; Ontwikkelen en implementeren van MS PowerApps

Bekijk vacature »

Software Developer C# .NET

Functie omschrijving Zoek jij een nieuwe uitdaging binnen development waar je komt te werken binnen een flexibel, jong en ondernemend bedrijf? Wij zijn voor deze functie op zoek naar een C# .NET Developer die enthousiast wordt van het aansluiten en begeleiden van (complexe) nieuwe klanten. Verder begeleid je complexe projecten, ben jij iemand die altijd kansen ziet? Dan zoeken wij jou! Verder ga jij je bezighouden met: Het verbeteren van functionaliteiten binnen het dataplatform; Meedenken in oplossingsrichtingen; Werken aan de architectuur; Ontwikkelen van nieuwe technologieën. Bedrijfsprofiel Waar ga je werken? De organisatie waar je voor gaat werken heeft een onafhankelijk

Bekijk vacature »

Senior PHP Developer

As a Senior PHP Developer at Coolblue, you ensure that our webshops work as optimal as possible and you choach other colleagues on the hard and soft skills. How do I become a Senior PHP Developer at Coolblue? As a PHP Developer you work together with other development teams to make our webshop work as optimal as possible and to make our customers happy. Although you are a PHP Developer, you are not averse to a little TypeScript or other technologies that might be used. Would you also like to become a PHP Developer at Coolblue? Read below if the

Bekijk vacature »

.NET Developer

Functie omschrijving In deze functie ga je werken als C# Developer. Jij gaat aan de slag met de volgende taken: Maatwerk software bouwen; Huidige softwareprojecten verder uitbouwen en optimaliseren; Ideeën van de klant omzetten naar handige oplossingen en tools; Bovenstaande doe je middels de Microsoft- stack: C#, ASP.NET en MVC/ Entity Framework. Ben je net afgestudeerd aan een HBO opleiding Informatica, aarzel dan niet om te solliciteren. Dit is namelijk de ideale startersfunctie! Bedrijfsprofiel Deze organisatie is gevestigd in de regio van Boxtel. Het is van oorsprong een familiebedrijf, die gestart zijn met het bouwen van websites. Dit is door

Bekijk vacature »

Back-end Developer

Functieomschrijving Heb jij kort geleden jouw HBO ICT diploma in ontvangst mogen nemen? Of ben je toe aan een nieuwe stap? Voor een softwarebedrijf in regio Oosterhout zijn wij op zoek naar een back-end developer met kennis of ervaring met C# en SQL. Je draagt bij aan de implementatie van aanpassingen, verbeteringen en aanvullingen in de C# based applicaties; Je test de software en ontwikkelt deze door; Je brengt de aanpassingssuggesties van klanten in kaart, om ze vervolgens te analyseren en daarna te concluderen of de aanpassing een verbetering is; Je houdt je bezig met het ontwikkelen van nieuwe functionaliteiten;

Bekijk vacature »

C# .NET Developer

Functie omschrijving Wij zijn op zoek naar een C# .NET Developer voor een bedrijf in de omgeving van Utrecht! Wil jij werken voor een internationaal bedrijf waar je legio mogelijkheden krijgt als Software Ontwikkelaar? Grijp nu je kans! Je kunt een uitdagende rol gaan vervullen als C#.NET Developer binnen een internationaal bedrijf dat gevestigd is in omgeving van Utrecht. Je zult gaan samenwerken met collega's die over de hele wereld verspreid zitten. Dit bedrijf is zeer vooruitstrevend en werkt met de nieuwste technieken. Als C#.NET Developer ga jij je bezig houden met het volgende: Je blijft op de hoogte van

Bekijk vacature »

Back-end Developer

Functieomschrijving Voor een erkende werkgever in de regio van Middelburg zijn wij op zoek naar een enthousiaste PHP / Symfony Developer. Een ambitieus persoon die het gemotiveerde development team komt versterken met het realiseren van nieuwe en complexe projecten. Ben jij op zoek naar een baan met veel uitdaging binnen een snelgroeiend e-commerce bedrijf, waar je de tijd en ruimte krijgt voor professionele groei? Dit ga je doen: Je bent verantwoordelijk voor de beheer en ontwikkeling van de serviceportal in Symfony en de webshops in de tweede versie van Magento; Je houdt je bezig met het ontwikkelen van nieuwe functionaliteiten;

Bekijk vacature »

Java developer (remote)

Functie Wat ga je doen als Java Developer? Jij als Java ontwikkelaar komt te werken in 1 van onze SCRUM teams. Momenteel werken er zo’n 30 ontwikkelaars binnen onze organisatie waarbij jij de brug slaat tussen het bouwen van verschillende functionaliteiten binnen onze applicaties en deze vervolgens te integreren in onze centrale hub. Je start je dag om 9 uur met een stand up en dan pak je jouw taken op voor de dag. Hieronder een aantal taken die jij zal uitvoeren: – Het bedenken en uitbouwen van features binnen de verschillende applicaties – Onderhouden van CI/CD pipelines – Bezighouden

Bekijk vacature »

Junior .NET developer

Functie Als junior .NET developer start jij in een development team met twee ervaren software ontwikkelaars. Jouw persoonlijke ontwikkeling is voor ons erg belangrijk en jij gaat dan ook meelopen met onze Senior .NET ontwikkelaar die jou met zijn kennis en ervaring een goede begeleiding kan aanbieden. Als team zijn jullie verantwoordelijk voor het schrijven van software voor onze toonaangevende Automatiseringssystemen. Jij gaat aan de slag met de onderhoud van de kernsoftware, ondersteund de software van derden door het gebruik van onze webservices en als team zijn jullie verantwoordelijk voor het ontwikkelen van onze backend oplossingen. Wij maken op dit

Bekijk vacature »

Software Developer C++ en Perl

Ben je een slimme en enthousiaste universitair opgeleide bèta die graag bij een relatief klein softwarebedrijf wil werken waar de sfeer goed is en eigen inbreng gewaardeerd wordt? Wij, IntelliMagic in Leiden, ontwikkelen technisch hoogwaardige software op het gebied van IT infrastructuur performance analytics. Het type software zorgt voor intellectueel interessante uitdagingen. We ontwerpen de producten zelf en verkopen deze als off-the-shelf software aan grote bedrijven in Europa en de VS. Wij zoeken een ervaren C++ software engineer met kennis van Perl voor een van onze ontwikkelteams. Werkzaamheden Samen met de andere ontwikkelaars specificeren, ontwerpen en implementeren van nieuwe functionaliteit

Bekijk vacature »

Fullstack Webdeveloper .NET Azure Big Data SaaS

Bedrijfsomschrijving Deze klant van ons is recentelijk onderdeel geworden van een grote moederorganisatie, ze zijn dé partij als het gaat om software maken voor ambitieuze ondernemers, ze maken maatwerk software. Vanuit het fantastisch vormgegeven hightech gebouw te Rotterdam centrum werken ze met zo'n 40 medewerkers aan hoogwaardige software gericht op financiële data, betaalinformatie, maar ook backoffice software. De software wordt webbased, desktop en mobile aangeboden en er worden zeer moderne ontwikkeltechnieken toegepast. Je moet dan denken aan patroonherkenning, Big Data, Machine Learning en OCR. Als Developer, ongeacht je niveau, ga je hier te maken krijgen met de allerleukste kant van

Bekijk vacature »

Backend Developer Integraties API HBO REST

Samengevat: Deze werkgever is een IT-consultancy. Wil jij werken als Backend Developer Integraties? Heb jij kennis van gangbare berichtformaten? Vaste baan: Backend Developer Integraties API HBO €3.100 - €4.400 Zij bieden innovatieve oplossingen die bedrijven efficiënter en wendbaarder maken, waardoor onze klanten zich net zo snel kunnen ontwikkelen als de business van hen vraagt. Bij bij hun werk je aan onze eigen bedrijfsapplicaties. Je ontwikkelt met ons de meest nieuwe software. Wij blinken uit als het gaat om de inzet van technologie. Deze werkgever staat open voor elke nieuwe trend. Onze systemen zijn groot en ingewikkeld. Hou jij van diepgang

Bekijk vacature »

Java developer

Functie Je gaat aan de slag als Tester voor een aantal mooie projecten. Je komt terecht in een DevOps team waar jij aan de slag gaat om de kwaliteit te waarborgen omtrent de maatwerk software voor de klanten. Je draait je hand er niet voor om de adviserende rol te bekleden op het gebied van testautomatisering en het opzetten van testframeworks. Zoals aangegeven ga je daadwerkelijk in het eigen team aan de slag en is het daarnaast ook gebruikelijk bij de klanten op locatie te komen om te werken aan de opdrachten. Je krijgt zodoende echt een mooie kijk in

Bekijk vacature »

Freelance JAVA / C# Developer

Functieomschrijving Ben je een ervaren freelancer of werk je in loondienst en ben je toe aan een nieuwe uitdaging? Lees dan snel verder want wie weet is dit een leuke vacature voor jou! Voor een opdrachtgever in omgeving Delft zijn wij op zoek naar ervaren JAVA of C# Developers die graag op projectbasis willen werken. Je komt terecht bij een informele developers club die mooie projecten uitvoeren voor grote klanten. Het fijne van deze werkgever is dat je zelf mag beslissen hoe je te werk wilt gaan. Wil je als freelancer werken dan is dat OK. Wil je de zekerheid

Bekijk vacature »

Low Code Developer

Functie omschrijving Ben jij toe aan een nieuwe uitdaging en ben jij HBO afgestudeerd in de richting van IT? Heb jij verstand van datamodellering, NO CODE Platformen en kun jij het aan om projecten te leiden? Voor een leuke opdrachtgever in omgeving Capelle aan den IJssel zijn wij op zoek naar een No Code developer die zich bezig gaat houden met het optimaliseren van bedrijfsprocessen bij klanten in heel het land! Wat ga je hier zoal doen? Je gaat geen code kloppen maar bedenken hoe applicaties eruit moet komen te zien. Je gaat werken met een non code platform, je

Bekijk vacature »
Jeroen VD

Jeroen VD

28/05/2012 16:36:30
Quote Anchor link
paginering vind ik lastig. vooral met OOP. eerlijk gezegd snap ik er geen zak van.

er wordt altijd vertelt: laat het paginate-object de paginering afhandelen, om te zorgen voor flexibiliteit. maar paginering kan je toch eigenlijk niet zien als object? voor mij niets tastbaars. en de gegevens die je altijd moet invoeren, daardoor gaat al die flexibiliteit toch helemaal verloren?

als ik die van Roel hier zie, lijkt die me best netjes. maar het database gebeuren zit in die class, alle links, de hele shit. die flexibiliteit is dan toch weg, en is het meer een verzameling functies?

dus, hoe hoort een paginering in OOP eruit te zien?
 
PHP hulp

PHP hulp

29/04/2024 08:06:08
 
Wouter J

Wouter J

28/05/2012 17:52:59
Quote Anchor link
Stel we hebben het over een forum met pagination. Dan hebben we 1 object die we Topic noemen die 1 topic vasthoudt. Vervolgens hebben we een TopicMapper klasse die de afhandeling tussen DB en Topic object regelt.
Dan hebben we nog een Pagination klasse die voor de pagination zorgt.

Dat is in elk geval hoe ik het zou doen. In je Topic klasse kun je alles kwijt van berichten totaan users... Met de DataMapper kun je alles makkelijk ophalen en met de Pagination kun je de pagination afhandelen, hoeveel er op 1 pagina mag enz.
Niet alle klassen die je in scripten gebruikt zijn objecten. Je hebt soms ook klassen nodig om je script mooi en flexibel te maken. Als ik zo'n bericht schrijf probeer ik daar altijd verschil in te maken, let maar eens op. Klassen die een echt tastbaar object zijn noem ik altijd object en andere noem ik gewoon klassen.

Een praktisch voorbeeldje hoe ik dit dan zou maken:
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
<?php

$db
= new PDO(...);
$topicMapper = new TopicMapper($db);

// deze functie geeft een array met Topic objecten terug
$topics = $topicMapper->getAllByCategory('oop');

// Maak een pagination object
$pagination = new Pagination();
// een paar instellingen
$pagination->setPageCount(5);

// krijg de eerste pagina (in dit geval met 5 topics)
echo $pagination->getPage(1);
?>
 
Pim -

Pim -

28/05/2012 18:02:49
Quote Anchor link
Je kan het best mooi modulair maken hoor!

Denk aan:
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
<?php
interface PaginatorItemInterface
{
    pubilc funciton setData(array $data);
    public function render();
}


interface PaginatorBackendInterface
{
    /**
     * @return array[PaginatorItemInterface]
     */

    public function getItems($page);
}


interface PaginatorButtonFormInterface
{
    public function render($page);
}


class Paginator
{
    public function __construct(PaginatorBackendInterface $backend,
                                PaginatorButtonFormInterface $buttonForm)
    {

        $this->backend = $backend;
        $this->buttonForm = $buttonForm;
    }


    public function render($page)
    {

        $items = $this->backend->getItems($page);

        $result = '<div>'; // Hier kan je ook nog wel wat mooiers van maken
        foreach($items as $item) {
            $result .= $item->render();
        }

        $result .= $this->buttonForm->render($page);
        $result .= '</div>';
        return $result;
    }
}


abstract class AbstractPaginatorPDOBackend implements PaginatorBackendInterface
{
    protected $pdo;
    
    public function __construct(PDO $pdo)
    {

        $this->pdo = $pdo;
    }
}


class PaginatorLinkItem implements PaginatorItemInterface
{
    proteced $name, $link;
    
    public function setData(array $data)
    {

        $this->name = $data['name'];
        $this->link = $data['link'];
    }


    public function render()
    {

        return '<a href="'.$this->link.'">'.$this->name.'</a>';
    }
}


class PaginatorPDOLinkBackend extends AbstractPaginatorPDOBackend
{
    public function getItems($page)
    {

        $stmt = $this->pdo->prepare($SQL);
        $stmt->execute(array(':page'=>$page));
        $items = array();
        foreach($stmt->fetch() as $row) {
            $item = new PaginatorLinkItem();
            $item->setData($row);
            $items[] = $item;
        }

        return $items;
    }
}

?>

"Quick'n'Dirty", maar ik hoop dat je het idee een beetje snapt.

Groet,
Pim
 
Jeroen VD

Jeroen VD

28/05/2012 19:43:56
Quote Anchor link
Ok, thanks voor de reacties!

Wouter, ik snap waar je heen wilt, maar method getPage(), zou die een integer met de start terug? En dan gewoon een loopje met $topics[$i]?

Pim: eerlijk gezegd snap ik er niet zo veel van. Wat wordt bedoeld met interface? En implements?
 
Wouter J

Wouter J

28/05/2012 19:58:31
Quote Anchor link
Een interface is een perfect middel om klassen te groeperen. Je kan er ook nog mooi vaststellen welke functies er verplicht in moeten.
Met implements kun je een klasse aan de interface koppelen.

Bijv:
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
<?php
/**
 * Interface om storage klassen te groeperen
 */

interface Storage
{
    /**
     * Functie om een value op te slaan
     *
     * @param string $key De key naar de value
     * @param mixed $value De value
     */

    public function set($key, $value);

    /**
     * Functie om een value te krijgen
     *
     * @param string $key De key naar de value
     *
     * @return mixed The value
     */

    public function get($key);
}


/**
 * Class om session storage af te handelen
 */

class SessionStorage implements Storage
{
    public function __construct()
    {

         session_start();
    }


    /**
     * {@inheritdoc}
     */

    public function set($key, $value)
    {

        $_SESSION[$key] = $value;
    }


    /**
     * {@inheritdoc}
     */

    public function get($key)
    {

        if (!isset($_SESSION[$key])) {
            throw new InvalidArgumentException($key.' does not exists in SessionStorage');
        }

        return $_SESSION[$key];
    }
}


class CookieStorage implements Storage
{
   // ...
}
?>


Meer informatie: http://phptuts.nl/view/45/12/

Pim, mooie code. Een goed voorbeeld van het Strategy pattern!
Gewijzigd op 28/05/2012 20:00:02 door Wouter J
 
Jeroen VD

Jeroen VD

28/05/2012 20:05:29
Quote Anchor link
Aah op die manier. Nu ik die ie lijkt het niet meer een manier van commentaar geven, maar in grotere projecten lijkt het me wel handig ja...

Ik heb even tijd nodig om pims script te analyseren.
 
Wouter J

Wouter J

28/05/2012 20:12:18
Quote Anchor link
Jeroen, het kan ook zonder het commentaar. Het voordeel hiervan is dat je makkelijk iets kunt controleren. Bijv. in mijn storage interface. Ik heb een User klasse en die slaat in de session op of een User ingelogd is dan kun je nu makkelijk controleren:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?php
class User
{
    public function __construct(Storage $storage)
    {

        // het maakt me geen moer uit of dit in een session
        // cookie, db of bestand wordt opgeslagen als ik maar
        // een klasse heb die een set en get method heeft.

        $storage->set('user.loggedin', true);
    }
}

?>
 
Pim -

Pim -

01/06/2012 09:33:50
Quote Anchor link
@Jeroen,
Kom je er een beetje uit?
 
Jeroen VD

Jeroen VD

01/06/2012 11:44:17
Quote Anchor link
ja opzich wel, al ontgaat de logica mij een beetje. regel 74, waar komt $SQL vandaan?
ook uit de render functies kom ik niet zo uit. er zijn er twee, en de tweede returned niets, maar lijkt me van wel?
 
Wouter J

Wouter J

01/06/2012 12:17:49
Quote Anchor link
>> regel 74, waar komt $SQL vandaan?
Pim heeft denk ik dit even snel getypt voor het idee, maar niet om zo te gebruiken. $SQL moet je zelf invullen.
Her en der staan ook wat typos.

Verder zie ik geen 1 render functie die iets niks retourneert?
 
Jeroen VD

Jeroen VD

01/06/2012 14:23:34
Quote Anchor link
sorry, ik bedoelde ook, ik zie twee reder() methods, maar uit elkaar houden lukt me niet.

verder heeft de setData() method geen return
 
Wouter J

Wouter J

01/06/2012 15:42:31
Quote Anchor link
Jeroen, niet elke method moet een return hebben. Een setter (zoals setData) set vaak een value aan een property, deze hoeft -eigenlijk mag- niks te retourneren.

Verder is de opbouw van de logica een beetje als volgt:
Je hebt een PaginatorItemInterface. Deze zorgt ervoor hoe het Item eruit ziet. Dus bijv. of het in een div gaat, of in een lijst.
De method render van deze klasse retourneert 1 enkel item.
Met de method setData vullen we wat gegevens van het item in.

Dan heb je een PaginatorButtonFormInterface. Deze zorgt voor de buttons << < 1 | 2 | 3 | > >> enz. Hoe dat eruit ziet plaats je in de render method van de PaginatorButtonFormInterface.

Vervolgens heb je nog een PaginatorBackendInterface. Deze zorgt voor het ophalen van de gegevens.
De method getItems retourneert een array van PaginatorItemInterfaces met alle items. Deze haalt die bijv. uit de database.

Als laatst heb je een Paginator object die alles bij elkaar voegt en via de render method een mooie code teruggeeft met items en buttons.
 
Niels K

Niels K

01/06/2012 18:37:28
Quote Anchor link
@Pim,

Waarom maak je niet gebruik van het Adapter pattern? Kan je dat toelichten. Wanneer ik een paginator maak, maak ik meestal gebruik van het Adapter pattern vandaar ;-)

Niels
 
Pim -

Pim -

02/06/2012 00:42:24
Quote Anchor link
Dit is toch een adapter?
3 maal zelfs:
Je kan zelf een backend injecteren om de items op te halen, PaginatorPDOLinkBackend is een voorbeeldimplementatie.
De backend kan dan een implementatie van PaginatorItemInterface teruggeven. PaginatorLinkItem is het voorbeeld.
En tot slot kan je zelfs de knopjes zelf aanpassen met PaginatorButtonFormInterface, al had ik geen zin daar een voorbeeld voor te maken/.

Best wel een adapter-pattern toch?

Toevoeging op 02/06/2012 00:42:51:

En @Wouter:
Thanks :)
 
Niels K

Niels K

02/06/2012 20:23:02
Quote Anchor link
Hoi Pim,

Je hebt gelijk, excuses ik las dit:

Quote:
Pim, mooie code. Een goed voorbeeld van het Strategy pattern!


Nu ben ik niet echt een pattern goeroe, maar volgens mij is het Strategy pattern niet helemaal hetzelfde als het Adapter pattern.
 
Jeroen VD

Jeroen VD

02/06/2012 22:18:39
Quote Anchor link
Ja ik begin het te begrijpen, alleen AbstractPaginatorPDOBackend wordt geextend in PaginatorPDOLinkBackend. Waarom? Die kan je toch ook prima samenvoegen?
 
Wouter J

Wouter J

02/06/2012 23:45:15
Quote Anchor link
Niels, nee ik had de code eerst verkeerd begrepen. Ik dacht dat het iets was met BehaviorInterfaces, maar dat was helemaal verkeerd...
 
Pim -

Pim -

03/06/2012 15:18:56
Quote Anchor link
@Jeroen,
Ja, nu natuurlijk wel, maar het is goed mogelijk dat je meerdere backends voor verschillende items wil maken, die alle op PDO gebaseerd zijn en die ook allemaal een aantal dezelfde helper-functies nodig hebben. Dan wordt de AbstractPaginatorPDOBackend opeens nuttig.

Het is natuurlijk helemaal niet noodzakelijk om zó modulair te werken, maar ik heb een beetje overdreven, omdat jij graag flexibiliteit wou zien.
 
Jeroen VD

Jeroen VD

03/06/2012 16:58:54
Quote Anchor link
nou, in ieder geval bedankt voor de hele uitgebreide reacties op dit vraagstuk. het is mij een heel stuk duidelijker, maar zal nog veel moeten oefenen (op heel OO gebied) om dit goed toe te kunnen toepassen.
 



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.