paginering OOP

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

PHP Developer Ontwikkelaar

Functieomschrijving Ontwikkelaar Developer JSON PHP Laravel 5 Ontwikkelen aan de PHP applicatie (aanpassingen, verbeteringen en uitbreidingen) Mede bepalen van coding principes en standaarden. Beheren van bestaande en nieuw ontwikkelde applicaties Verlenen van support op de applicaties Proactief verbetervoorstellen doen Testen en documenteren van ontwikkelde software Functie-eisen Minimaal HBO diploma Minimaal 2 jaar relevante ervaring Ervaring met Agile, SCRUM Bekendheid met Laravel 5 / JSON / REST API's / Objectorientatie en design patterns / UnitTesting / Mocking / GIT Kennis van Drupal / Symfony / Continuous Delivery / Continuous integration is pré Bedrijfsomschrijving Je gaat als PHP Developer aan de slag

Bekijk vacature »

Gezocht/Looking for: Senior .NET Developer - Rotte

Due to extensive growht of our client we are currently searching for a Senior Dot.Net Software Developer. This is for one of our clients in the digital data transformation domain. Vacature Details/ Vacancy Details Contract type: Fixed term contract Start datum/ Date of Joining: immediate (work from home during Covid-19 period) Werkervaring/experience required: Minimum of 6 years experience in a similar role (must have) Understanding of Azure DevOps (must have) Experienced in Agile/Scrum software development Deep understanding of C#, .NET, .NET Core, REST, Azure services(must have) Experience with Kubernetes or Azure Service Fabric Database knowledge (a.o SQL, CosmosDB) Pluspoints would

Bekijk vacature »

Web Developer

Help jij graag mee met het optimaliseren van ons platform? Solliciteer dan naar de functie Web Developer. Op ons hoofdkantoor in Amsterdam krijg je alle ruimte om je kwaliteiten te tonen. Jouw baan ChipSoft maakt breed gebruik van webtechnologie voor de ondersteuning van administratieve processen. Als ontwikkelaar ben je verantwoordelijk voor het onderhouden en verbeteren van de applicaties op ons platform. Jij richt je met name op het ontwikkelen van nieuwe applicaties en het onderhouden van de gebruikte programmatuur op ons platform. Denk hierbij aan e-learning en projectplanning. Jouw team Je komt op de 25ste verdieping van ons hoofdkantoor in

Bekijk vacature »

Medior Front-end Developer

As a medior Front-End Developer at Coolblue you improve the user-friendliness of our webshop for millions of customers. How do I become a Medior Front-end Developer at Coolblue? As a Medior Front-end Developer you work on the user-friendliness of our webshop for millions of customers. You enjoy working with the UX designer to pick up stories. You get energy from coming up with creative solutions and are happy to present this within the team. You are also proud of your work and welcome all feedback. "Want to become a Medior Front-end Developer at Coolblue? Else de Boer explains how to

Bekijk vacature »

Senior applicatieontwikkelaar

Ben jij een gedreven applicatieontwikkelaar met minimaal drie jaar werkervaring? En wil je een uitdagende baan met impact én jezelf breed ontwikkelen? Bij UPS bouw je mee aan complexe systemen die wereldwijd worden gebruikt en krijg je alle ruimte om nóg beter te worden in je vak. Dit ga je doen In een dynamisch scrumteam werk je aan de hand van processen en technologieën zoals CI/CD en DevOps aan het behalen van jullie doelen. Je bent betrokken bij alle facetten van applicatieontwikkeling: van ontwerpen en bouwen tot testen en implementeren. Je levert ontwerpen die passen bij de onderliggende frameworks en

Bekijk vacature »

Full Stack developer

Op zoek naar leuke collega's waarmee je kunt lachen, gave projecten en een ambitieuze werkgever die heel goed voor je zorgt? Aangenaam: Profit4Cloud! Wij zijn nu met 55 collega's en werken sinds 2015 vanuit 5 vestigingen aan mooie projecten met een fijne groep collega's die allemaal maar één ding willen: mooie en slimme software-oplossingen ontwikkelen met de nieuwste technieken. We zijn goed bezig en zijn daarom op zoek naar versterking: Full Stack developers met een pioniersmentaliteit en ervaring in back-end en front-end software ontwikkeling. Ben jij de Full Stack developer die enthousiast wordt van mooie projecten met high-end technologie? Dan

Bekijk vacature »

Java developer senior

Functie­omschrijving ''Ik werk voor de douane en houd mij bezig met het proces Binnenbrengen, Uitgaan en Provianderen. In de Rotterdamse haven komen de grootste containerschepen binnen en alles op het schip moet aangegeven worden. Als er dan iets fout gaat met de aangiftes ontstaat er een file op de A15 van vrachtwagens die de containers willen ophalen. Je pakketje uit China is dan nóg langer onderweg. Kortom een boeiend proces waarbij heel veel verschillende technieken om de hoek komen kijken.'' Bert Gritter - Senior Java developer. Bij de Belastingdienst ontwikkelen we applicaties die direct van zeer grote invloed zijn op

Bekijk vacature »

Senior Front-end Developer vacature

Currently we are specific looking for professionals who speak fluently Dutch on C1 level. Senior Front-end Developer Jij weet wat er nodig is. Jouw hart gaat sneller kloppen van techniek. Jij wil vooruit. Je bent creatief, thuis in gebruikersinteractie en een Developer in hart en nieren. Daarnaast heb jij een klantgerichte en initiatiefrijke houding. Precies de kwaliteiten die een Front-end Developer nodig heeft. Wat doe jij als developer bij Sogeti? Als Front-end Developer werk je aan de technische realisatie van front-end (web)applicaties in de verschillende opdrachten voor Sogeti’s klanten. Dit kan zowel op klantlocatie, als intern bij Sogeti. Jij houdt

Bekijk vacature »

.NET developer / C# / Azure / Zorg

Functieomschrijving Ben jij een .NET Developer met minimaal 2-3 jaar ervaring en ben je toe aan de volgende stap in je carrière? Wil jij werken op het hoogste niveau en aan de slag gaan bij de .NET ontwikkel organisatie van Brabant? Dan is deze functie perfect voor jou! Als .NET Ontwikkelaar ga je: Programmeren van high-availability en high-security applicaties in C#; Samen met je teamgenoten nieuwe applicaties/diensten ontwikkelen in .NET; Overleggen met de informatie analisten en testers; Ontwikkelen van webservices (WCF); 20% van je tijd besteden aan innovatie; Deelnemen aan projecten om nieuwe ketenpartijen toe te voegen; Bouwen van unit

Bekijk vacature »

Lead Software Developer Datawarehouse

Bouw jij graag mee aan de nieuwe generatie van het datawarehouse-framework voor de zorg? En kent programmeren in C# geen geheimen voor jou? Dan pas jij perfect in ons team in Amsterdam. We bieden jou de kans om complexe uitdagingen op te lossen en te werken met de nieuwste technieken. Jouw baan Zorgprofessionals nemen belangrijke beslissingen op basis van data uit ons datawarehouse. Om dit mogelijk te maken ontwikkelt onze afdeling een set aan softwareapplicaties die optimaal aansluiten bij ons zorginformatiesysteem (ZIS). Als team lead software binnen de afdeling datawarehouse heb je de dagelijkse leiding over een team van 6

Bekijk vacature »

Fullstack PHP developer

Beschik jij over stalen zenuwen en een echte escape room mentaliteit, waarbij je het liefst in een uurtje de code kraakt en de oplossing vindt? Het IT-team van Beekman maakt waar wat we beloven: gemak, snelheid en betrouwbaarheid. We focussen sterk op vindbaarheid en als IT'er ben je verantwoordelijk voor het toegankelijk maken van informatie en het juist presenteren van grote hoeveelheden data. Zo ondersteunen we onze klant om zich volledig te focussen op zijn core business. Wat kun je van ons verwachten? Een warm welkom in een bedrijf met een familiecultuur; schuif aan bij je comfortabele zit-sta werkplek in

Bekijk vacature »

Lead Drupal Ontwikkelaar / Full Digital Agency / U

Functieomschrijving Kent Drupal voor jou geen geheimen en ben jij de Lead Ontwikkelaar die graag meewerkt aan innovatieve software oplossingen voor grote en toonaangevende organisaties? Lees dan snel deze vacature van Lead Drupal Ontwikkelaar! Ontwikkelen van webapplicaties in de nieuwste versies van Drupal; Doorontwikkelen van huidige applicaties; Aansturen van talentvolle ontwikkelaars; Meedenken over architecturen; Sparringspartner van de projectmanager. Functie-eisen Minimaal HBO-werk en denkniveau; Minimaal 5 jaar aantoonbare werkervaring met Drupal; Ervaring in Scrum/Agile omgevingen; Aantoonbare ervaring met het aansturen van developers; Communicatief vaardig. Bedrijfsomschrijving Deze organisatie gelegen in het hartje van Utrecht biedt grote (inter)nationale organisaties maatwerk oplossingen op het

Bekijk vacature »

ASP.NET/Angular Junior Frontend Developer gezocht

Functieomschrijving Je gaat voornamelijk werken met ASP.NET en Angular voor het ontwikkelen van een gelikte Frontend van de applicatie. Je komt terecht in een softwarebedrijf waar momenteel bijna 30 man werken verdeeld over meerdere Scrumteams. Ervaring met ASP.NET en Angular zijn dus het belangrijkste, hier zal de focus op liggen. Ervaring met andere Microsoft frameworks (bijvoorbeeld .NET Core of het Entity Framework) is mooi meegenomen, maar geen harde eis. Wel is het belangrijk dat je goede communicatieve skills hebt zodat je goed samen kunt werken met je collega's. Het teamgevoel is hier namelijk sterk en samenwerken staat hoog in het

Bekijk vacature »

Java developer medior/senior

Op zoek naar leuke collega's waarmee je kunt lachen, gave projecten en een ambitieuze werkgever die heel goed voor je zorgt? Aangenaam: Profit4Cloud! Wij zijn nu met 55 collega's en werken sinds 2015 vanuit 5 vestigingen aan mooie projecten met een fijne groep collega's die allemaal maar één ding willen: mooie en slimme software-oplossingen ontwikkelen met de nieuwste technieken. We zijn goed bezig en zijn daarom op zoek naar versterking: Java Software Engineers met een pioniersmentaliteit en ervaring in back-end en front-end software ontwikkeling. Ben jij de Java Software Engineer die enthousiast wordt van mooie projecten waar binnen jij een

Bekijk vacature »

Back-end PHP Developer / Maatschappelijk betrokken

Functieomschrijving Ben jij een developer die de volgende stap in zijn carrière wilt maken? Wijk jij niet uit voor precisie werk in een open en informele omgeving? Lees dan snel verder en reageer! Her- en uitbouwen van het inhouse softwareplatform dmv PHP; Onderhouden van bovengenoemd platform in PHP; Sparren met het team; Meedenken over nieuwe functionaliteiten, security etc; Jouw input leveren aan het proces door op de hoogte te blijven van nieuwe ontwikkelingen etc. Functie-eisen Afgeronde HBO of WO opleiding, liefst in de richting van Informatica; Je hebt minimaal 3 jaar ervaring als PHP Developer; Je hebt ervaring met object

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/09/2020 06:13:37
 
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.