paginering OOP

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

ASP.NET Developer Transformatie 35+ vrije dagen

Functieomschrijving Ben jij een ASP.NET Developer en wil jij meer doen dan alleen developen? Ben jij ondernemend ingesteld en denk jij graag mee aan de visie en strategie van een organisatie? Dan is deze baan wat voor jou! Meedenken in de visie en strategie van de organisatie; Concepten ontwikkelen en deze uitdragen binnen de organisatie; Applicaties optimaliseren in ASP.NET; Innovatieve software ontwikkelen met onder andere AngularJS; Functie-eisen HBO werk- en denkniveau; 1 tot 4 jaar ervaring met bijvoorbeeld: ASP.NET, .NET of Java; 1 tot 4 jaar ervaring met: AngularJS of andere JavaScript versies; Bekend met Agile werken; Affiniteit met ondernemen.

Bekijk vacature »

Senior windows system engineer

Are you a driven IT engineer with high initiative who wants to make the difference in a high-tech environment? Do you thrive in an autonomous cross-functional team? Then you may be interested in the position of: Senior windows system engineer for our office in Zoeterwoude About the position: As a Windows DevOps Engineer, you will be joining a dynamic team of ten IT professionals who set out to deliver and operate secure infrastructure for our internal customers. Here’s what to expect: You will work with the Product Owner and Squad members to define the future architecture and strategy of the

Bekijk vacature »

Technisch Ontwerper / Applicatieontwikkelaar max.

Wie zoeken we? Je bent de beste in je vak of hebt de ambitie en de potentie om de beste te worden. Je hebt de passie om nieuwe technologieën te blijven leren en continu jezelf te ontwikkelen. Je hebt de pioniersgeest en drive om nieuwe technologieën, methodieken en concepten toe te passen in projecten en bij klanten. Je vindt het leuk om kennis te delen met collega’s, klanten en vakgenoten. Je bent een ware professional en ambassadeur voor CIMSOLUTIONS. Je voelt je thuis in een informele, collegiale en professionele sfeer waar de aandacht voor de klant en voor de medewerker

Bekijk vacature »

Business Developer / France

Discipline Marketing & Sales Location Utrecht (NL) Hours a week 40 As our Business Developer France You must love sales! Because YOU will make it your goal to successfully promote and expand our B2B drop shipment program. You will make this a success because you are commercially driven and convinced of online B2B sales. We trust you to work independently. You have an enthusiastic international team that can get you up to speed. What you will do Generates new business by attracting new partners to the vidaXL B2B Drop-shipping Platform, focusing on the German speaking markets; Analyzes the market and

Bekijk vacature »

Senior Front-end Developer vacature

Jij weet wat er nodig is. Jouw hart gaat sneller kloppen van techniek. Jij wil vooruit. Ben jij de Front-end Developer die we zoeken? Je bent creatief, thuis in gebruikersinteractie en een gedreven engineer in hart en nieren. Daarnaast heb jij een klantgerichte en proactieve houding. Precies de kwaliteiten die een Front-end Developer nodig heeft. Wat doe je als Developer? Als Front-end Developer werk je aan de technische realisatie van front-end (web)applicaties in de verschillende uitdagende opdrachten voor Sogeti’s klanten. Dit kan zowel op klantlocatie zijn, als binnen het Center of Excellence van Sogeti. Jij houdt van het uitdenken en

Bekijk vacature »

C# developer / Azure Cloud / Fullstack / 5500 euro

Functieomschrijving Developer / Software engineer / Fullstack / Microsoft C# .Net / Azure cloud Bouwen van Windows-, web- en mobile applicaties; Bouwen van nieuwe applicaties en de doorontwikkeling van bestaande applicaties; Uitzetten van de lijnen op architectuur niveau samen met de solution architect; Oplossen van complexe vraagstukken; Coachen en ontwikkelen van de minder ervaren developers binnen het scrumteam; Schakelen met de business. Functie-eisen Afgeronde HBO opleiding richting Informatica of vergelijkbaar; Minimaal 5 jaar ervaring als fullstack developer; Ervaring met Microsoft C# / SQL server; Ervaring met Azure is een pré; Ervaring met Angular is een pré; Je bent enthousiast, communicatief,

Bekijk vacature »

C# Developer /SaaS applicaties/MVC/ SQL/ 4.000 eur

Functieomschrijving Ben jij een .NET (C#) Developer wil werken in een IT-minded organisatie? Heb je kennis van MVC en SQL? Wil jij werken aan in-house ontwikkelde applicaties? Houd jij de nieuwste technieken in de gaten om het ontwikkelproces beter te laten verlopen? Lees dan snel verder! Nieuwbouw, onderhoud en bugfixing van de applicaties; Het produceren van code met een hoge kwaliteit; Hulp bieden aan jouw collega's met verschillende (complexe) technische kwesties; Kwaliteitsmonitoring van het gehele project, incl. de opgeleverde wijzigingen; Het waarnemen van verbetermogelijkheden en deze op de planning zetten. Functie-eisen Uitgebreide werkervaring met C#; Kennis van MVC en SQL;

Bekijk vacature »

Back-end developer (Python/Django)

Organisatie Waar kom je te werken? Je gaat werken bij een informeel bedrijf wat al bijna 20 jaar actief is in de sector transport en logistiek. We hebben een voorliefde voor OpenSource. De klanten bevinden zich voornamelijk in Nederland en België, van klein familiebedrijf tot grote multinational. Je gaat werken met enthousiaste collega’s die passie hebben voor ICT en open staan voor jouw inbreng, kennis en ervaring! Buiten dat we hard werken belangrijk vinden, vinden we humor en een goede werksfeer ook heel belangrijk. We zijn een gezond bedrijf met een interessante toekomstvisie met een no nonsense mentaliteit. Functie Wat

Bekijk vacature »

Software Engineer medior

Over de functie Als Software Engineer ben je met jouw scrumteam van A tot Z betrokken bij het (door)ontwikkelen van de software. Naast het ontwikkelen en testen van de software geef je ook passend advies aan onze klanten. Je maakt daarbij gebruik van de nieuwste technieken waaronder o.a. Azure, Angular,.Net core, MS-SQL server en de elastic search stack. Om je kennis up-to-date te houden verdiep je je regelmatig in nieuwe ontwikkelingen omtrent je vakgebied en probeer je deze effectief te vertalen naar mogelijkheden voor ons bedrijf. Jij als medior bent gedreven om dagelijks de mooiste ontwikkelingen te realiseren en neemt

Bekijk vacature »

PHP ontwikkelaar / Innovatie / Creativiteit

Functieomschrijving Ben jij de ontwikkelaar die op de hoogte is van de laatste ontwikkelingen en sta jij te springen om de nieuwste tools en technieken toe te passen in jouw werk? Trek dan nu aan de bel! Deze organisatie is al meer dan 20 jaar actief in het verzamelen en doorsturen van grote hoeveelheden data. Dit gebeurt doormiddel van hun zelf ontwikkelde platform die verschillende communicatieoplossingen biedt. Met bijna 600 gebruikers kan je jezelf wel inbeelden hoe groot de hoeveelheid data aan tekst, afbeeldingen en voicerecords is. Om er voor te zorgen dat de applicatie up-to-date, innovatief en vernieuwend is,

Bekijk vacature »

Fullstack .Net Developer voor int. marktleider met

Voor een internationale marktleider in metaalbewerking ben ik op zoek naar een junior / midlevel Fullstack .Net developer. Wat je gaat doen: Onze klant maakt gebruik van hun zelf gebouwde logistieke applicatie. Nu willen zij deze sterk uitbreiden. Zo willen ze o.a. een klant portaal maken, een online factuur systeem bouwen en een mobiele applicatie bouwen. Alles om beter zaken te doen met hun klanten. Je werkt hierbij in .Net C# en later ook Azure. Wie jij bent: MBO / HBO afgestudeerd 2 - 6 jaar ervaring met C# en .NET applicaties Design ervaring is een plus Spreekt Nederlands en

Bekijk vacature »

Senior Python Developer vacature

Jij volgt ontwikkelingen op de voet. Sterker nog: je bent er onderdeel van. Jij loopt voorop. Jij denkt met klanten mee en helpt hen innoveren. Zo kun jij een bijdrage leveren aan de Rabobank-app, de beveiliging van treinen voor Pro-rail verbeteren of de website van ING een boost geven. Vergaderen? Liever gewoon zorgen dat het werkt! Hoe omschrijft men een Sogetist? Gedreven, resultaatgericht en niet snel tevreden. Wat niet wil zeggen dat je nooit met hem of haar kunt lachen. Integendeel. Plezier hoort wat ons betreft net zo goed bij werken. Maar we gaan op de eerste plaats voor de

Bekijk vacature »

Java Developer / Java 8 / Angular / Docker / Autom

Functieomschrijving Wil jij als Java Developer aan de slag bij een internationaal bedrijf die cutting edge applicaties ontwikkeld voor de automotive branche? Ga je graag aan de slag met technieken als Java 8, Java EE7, Docker, Angular en wil je graag direct een lease auto krijgen? Lees dan snel verder! Ontwikkelen van cutting edge applicaties met o.a. Java 8, Java EE7, Angular en Docker; Verantwoordelijk vanaf het in kaart brengen van requirements tot de daadwerkelijke technische oplossing; Meedenken over architectuur; Assisteren van technische implementaties bij klanten; Overleggen met analisten, testers, architecten en consultants. Functie-eisen Minstens 2 jaar ervaring als Java

Bekijk vacature »

C# Developer/ SQL Server/ Visual Studio/Javascript

Functieomschrijving Ben jij een gedreven en enthousiaste .NET Developer (C#) met gevoel voor design en usability? Wil jij als C# Ontwikkellaar jouw skills graag inzetten op de development afdeling van een innovatieve, flexibele organisatie met een groot bereik? Lees dan snel verder! Je gaat aan de slag in het websites team of portals team waarin je je bezighoudt met concept & design, implementatie en ook een stukje bugfixing en onderhoud; Je werkt met je team volgens de Scrum werkwijze; Zo adviseer je ook de PO & Scrum Master over de technische architectuur, koppelingen en integratie met externe systemen en API’s;

Bekijk vacature »

Full-stack C++ developer

Accent Pointe BV is looking for a full-stack C++ developer to strengthen our highly professional and experienced team of software engineers. Role Summary: As a software engineer at Accent Pointe you will be developing in-house trading applications. You will be responsible for optimizing applications for efficiency; and be given opportunities to bring ideas and create new applications to assist our daily trading operations. You will join in a small and agile team with the ability to execute on ideas quickly and will be in close contact with traders, risk managers and other stakeholders within the firm. What we offer: -

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

26/01/2020 12:37:27
 
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.