[oop] abstracte class, invulling methods

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

PHP Developer - Draag bij aan de maatschappij!

Bedrijfsomschrijving Wil jij als applicatieontwikkelaar deel uitmaken van een gedreven ontwikkelteam en werken aan innovatieve producten? Dan hebben wij dé uitdaging voor jou! Wij zijn op zoek naar een enthousiaste collega die samen met ons de technische ondergrond van onze producten verder wil ontwikkelen met behulp van PHP. Met jouw expertise geef je de finishing touch aan onze producten om jezelf steeds opnieuw weer te verrassen. Functieomschrijving Bij ons staan innovatie en creativiteit centraal. Wij zijn op zoek naar een enthousiaste PHP ontwikkelaar die nieuwe ideeën en inzichten kan inbrengen en daarmee zichzelf en het team verder kan laten groeien.

Bekijk vacature »

Ambitieuze medior developer

Wat je gaat doen: Heb jij al een paar jaar ervaring als developer maar wil jij naar the next level? In ons NextLevelDev Programma helpen wij jou om de volgende stap te zetten: een mooi programma aan trainingen op het gebied van Java, hippe frameworks, Agile/Scrum, OCP-certificering en optioneel: andere JVM-talen als Kotlin en Scala; Cloud (AWS, Azure, GCP) Soc Of beter nog, wat wil jij doen? Binnen DPA GEOS zijn we dan ook op zoek naar enthousiaste Java developers om ons development team te versterken. Als Java developer werk je in Agile/Scrum teams bij onze klanten en daarbij kun

Bekijk vacature »

Oracle APEX developer

Wat je gaat doen: Als Oracle APEX ontwikkelaar bij DPA werk je samen met collega’s aan de meest interessante opdrachten. Je zult je ervaring met SQL, PL/SQL, JavaScript, HTML en CSS inzetten om wensen van opdrachtgevers te vertalen naar technische oplossingen. Je werk is heel afwisselend, omdat DPA zich niet beperkt tot een specifieke branche. Zo ben je de ene keer bezig binnen de zorgsector, de andere keer is dit bij de overheid. Wat we vragen: Klinkt goed? Voor deze functie breng je het volgende mee: Je hebt een hbo- of universitaire opleiding afgerond Je hebt 2 tot 5 jaar

Bekijk vacature »

Fullstack Developer TOTO

Do you want to work with the latest technologies on the development of new systems and applications? Get moving and strengthen Nederlandse Loterij as a Fullstack Developer TOTO. Thanks to your efforts, complex business critical applications are always running smoothly. In this way, you directly contribute to a happy, healthy and sporty Netherlands. As a Fullstack Developer you score by: Taking ownership of the development cycle of an application in a large scale, high availability, geo redundant landscape Coaching your peer developers and safeguarding code quality Integrating the application with other components of the system using the available API’s Managing

Bekijk vacature »

NodeJS developer

Functie Als Fullstack developer kom je te werken in het ontwikkelteam. Je bent samen met je collega’s continu bezig om de software uit te breiden, maar hiernaast doe je onderzoek naar de inzet van nieuwe technieken, tools of bijvoorbeeld Machine Learning. Ze willen met hun software echt voorlopen op andere en toegevoegde waarde leveren voor de eindgebruiker. Mede hierom zijn ze erg benieuwd naar iemand zijn persoonlijkheid, of hij graag nieuwe dingen uitzoekt (Google!), en initiatief neemt. Qua technische kennis zoeken ze iemand die goed op de hoogte is van de nieuwste ontwikkelingen, daar zij nu ontwikkelen op NodeJs back-end,

Bekijk vacature »

Front-end Developer

Dit ga je doen Je komt in een DevOps-cultuur te werken waarbij je met je team werkt aan de front-end van diverse brand websites; Het ontwerpen van functionele en grafische ontwerpen die worden geïmplementeerd; Draagt zorg voor het maken van analyses; Je werkt nauw met je collega’s samen en geeft elkaar feedback en suggesties waar nodig; Het uitwerken van vraagstukken die afkomstig zijn van verschillende klanten; Hier ga je werken Deze marktleider op gebied van fietsen en fietservaring is gevestigd in twee provincies, verspreid over meerdere locaties. Jij zult voornamelijk in regio Joure aan de slag gaan. De organisatie doelt

Bekijk vacature »

Senior Front-end Developer

Dit ga je doen Met behulp van diverse programmeertalen ontwikkelen van Front-end software; Het begeleiden van het front-end team; Het oplossen van incidenten; Het bijhouden van een backlog; Je hebt een actieve bijdrage in de wekelijkse overleggen met de omliggende teams; Je houdt trends bij en adviseert het management hierover waar nodig; Helder communiceren met de stakeholders om hen zo mee te nemen in projecten en laten inzien wat de duur en toegevoegde waarde van bepaalde projecten is. Hier ga je werken Deze organisatie heeft circa 40 miljoen bezoekers per maand en heeft innovatie hoog in het vaandel staan. Het

Bekijk vacature »

Software Programmeur PHP - JAVA

Functie Heb jij altijd al willen werken voor een bedrijf, dat veilige netwerkverbindingen levert, door middel van veilige oplossingen, die door middel van de nieuwste technologieën ontwikkelt zijn? Stop dan nu met zoeken! Voor een opdrachtgever in omgeving Moordrecht zijn wij op zoek naar een programmeur. Hoe kan jouw dag er straks uitzien? Je gaat software en webapplicaties ontwikkelen met behulp van de talen C / C++ / PHP. Je gaat technische klussen uitvoeren op locatie bij klanten. Je onderhoudt contact met de projectleider om er zeker van te zijn dat een projecten goed verlopen. Je gaat klanten ondersteunen op

Bekijk vacature »

.NET Developer Azure

Dit ga je doen Het ontwerpen en bouwen van diverse applicaties (C#, ASP.NET, MVC); Het ontwikkelen van Webservices (WCF); Het meewerken aan de transitie naar Azure; Het samenwerken met collega's binnen een Scrumteam en meedenken over de User Stories; Het bouwen van unittesten; Meedenken over nieuwe tooling, ontwikkelingen en technologieën in de markt. Hier ga je werken Je komt te werken bij een organisatie die verantwoordelijk is voor de ontwikkeling van verschillende portalen. Deze portalen worden gebruikt door diverse partijen en jouw taak is om ervoor te zorgen dat deze optimaal functioneren. Je wordt onderdeel van een Scrumteam en werkt

Bekijk vacature »

APEX Ontwikkelaar in een team van Oracle Developer

Bedrijfsomschrijving Wij zijn op zoek naar een APEX Ontwikkelaar om onze opdrachtgever in Den Haag te versterken. In deze rol zul je verantwoordelijk zijn voor het ontwikkelen en onderhouden van de front-end van onze applicaties met behulp van Oracle Application Express (APEX). Je werkt aan zowel inhouse als externe projecten. De sfeer binnen het Oracle team is gemoedelijk en men probeert elkaar te helpen én van elkaar te leren. Zo ontstaat er een prettige en plezierige werksfeer waar ruimte is voor persoonlijke ontwikkeling en groei. Er wordt gewerkt met de meest nieuwe technologieën waardoor je kennis up-to-date blijft. Het bedrijf

Bekijk vacature »

Senior Node.js developer Digital Agency

Functie Door de groei van de organisatie zijn ze op zoek naar een Tech Lead. Als tech lead ben jij verantwoordelijk Als Back end Node.js developer kom je terecht in een van de 8 multidisciplinaire teams in het projectenhuis. Afhankelijk van jouw interesses, wensen en capaciteiten word je bij projecten en onderwerpen naar keuze betrokken. Als ervaren ontwikkelaar zul jij vaak leiding nemen in de projecten en in het team een aanvoerder zijn van technische discussies. Uiteindelijk wil jij natuurlijk de klantwensen zo goed mogelijk vertalen naar robuuste code. De projecten kunnen varieren van langlopende- tot kleinschalige trajecten. Voorheen werkte

Bekijk vacature »

Front-end developer (Angular)

Functie Het team bestaat uit een architect, fullstack developers, app developers, de product owner en projectmanager. Eenieder draagt vanuit zijn discipline bij aan een complete oplossing voor de klant. Uiteraard zul je hierin nauw samenwerken met je collega’s. Jij wordt verantwoordelijk voor de front-end implementatie en fungeert als lead op dit gebied binnen het team. Je kunt helder formuleren, ideeën uitdragen en overbrengen aan je collega’s. Qua technische stack is het vooral van belang dat je ervaren bent met Angular, HTML5, CSS en TypeScript. Verder is ervaring in NgRx, Bootstrap, BEM en Cypress een pré, evenals affiniteit met UX/UI Design!

Bekijk vacature »

Ervaren PHP ontwikkelaar

Functie Jij als PHP ontwikkelaar komt te werken in een team van 4 andere PHP ontwikkelaars. Je zult je voornamelijk bezig houden met: – Het ontwikkelen van nieuwe features – Doorontwikkelen van de API – Nadenken over de technische infrastructuur – Datakwaliteit Samen met het team ben jij verantwoordelijk voor de verdere ontwikkeling van de software en om de positie als marktleider in Europa te behouden. Ze werken volgens SCRUM in 2 wekelijkse sprints, werken met Jira voor alle tickets en communiceren veel via Slack. Eisen • Minimaal 3 jaar ervaring als back end developer • Je hebt affiniteit met

Bekijk vacature »

SQL Database ontwikkelaar

Functie omschrijving Wil jij meewerken aan het creëren van slimme software om magazijnen als een geoliede machine te laten lopen? Wij zoeken een zorgvuldig persoon, iemand die niet snel de hand omdraait voor complexe algoritmes. Denk jij dat jij de SQL ontwikkelaar bent die wij zoeken? Lees snel verder en wie weet zitten we binnenkort samen aan tafel! Jouw werkzaamheden zullen er als volgt uitzien: Je houdt je bezig met het ontwerpen en ontwikkelen van MS SQL server databases, dit doe je met T-SQL als programmeer laag. Je gaat aan high-end software oplossingen werken, dit doe je voor de optimalisatie

Bekijk vacature »

Front end developer React

Functie Wij zijn van origine een wordpress bureau, maar sinds 2006 zijn wij dit wel redelijk ontgroeid. Naar mate de jaren verstreken zijn we gegroeid in omvang, maar ook in de complexiteit van opdrachten waarin wij onze klanten kunnen bedienen. Momenteel bestaat onze organisatie uit 4 front end developers, 12 back end developer 3 projectmanagers en een 2 koppig management. Wij zijn een hele informele, bijna familiaire organisatie. Geen strak pak of overhemd, nee gewoon dragen waar jij je prettig bij voelt. De gemiddelde leeftijd ligt tussen de 25 en 30 en wij doen er veel aan om onze hechte

Bekijk vacature »

Pagina: 1 2 volgende »

Ozzie PHP

Ozzie PHP

19/06/2014 23:42:12
Quote Anchor link
Ola,

Een vraag. Ik heb 3 classes die dezelfde abstracte class extenden.

Nu heb ik een verplcihte method foo(). Bij 2 van deze classes is de invulling van die method foo() precies hetzelfde. Bij de 3e class zit er een verschil in.

Wat is nu gebruikelijker?

optie 1)

We bouwen de overkoepelende foo() method van class 1 en 2 als abstracte method in de abstracte class. Class 1 en 2 gebruiken dus de foo() method uit de abstracte class. Class 3 krijgt z'n eigen foo() method.

optie 2)

In de abstracte class declareren we een lege abstracte foo() method en iedere class vult zelf deze method in. In class 1 en 2 is deze method exact hetzelfde.

Wat is juist?
Gewijzigd op 19/06/2014 23:43:18 door Ozzie PHP
 
PHP hulp

PHP hulp

27/05/2026 05:04:24
 
Reshad F

Reshad F

19/06/2014 23:46:45
Quote Anchor link
je gebruikt die abstractie wanneer je weet dat ELKE klas die het overneemt de zelfde implementatie gebruikt van die methode. wanneer je dit dus verschillend hebt dan kan je het beter leeg laten. Overigens is het beter te programmeren naar een interface dan naar een implementatie.

vb
http://stackoverflow.com/questions/383947/what-does-it-mean-to-program-to-an-interface
 
Ozzie PHP

Ozzie PHP

19/06/2014 23:50:31
Quote Anchor link
Oké, leeglaten dus. Thanks.

>> Overigens is het beter te programmeren naar een interface dan naar een implementatie.

Bedoel je met interface in dit geval een abstracte method, of bedoel je een opzichzelf staande interface (in plaats van een abstracte class)?
 
Reshad F

Reshad F

19/06/2014 23:54:31
Quote Anchor link
Het 2e.
 
Ozzie PHP

Ozzie PHP

19/06/2014 23:58:09
Quote Anchor link
Oké... maar dat ben ik niet helemaal met je eens. Een op zichzelf staande interface (het 2e dus) gebruik je met name om naar bepaald "gedrag" te programmeren. Je kunt er mee aangeven dat een object zich op een bepaalde manier gedraagt (met de daarbij behorende methods). Een abstracte class is óók een interface, maar beschrijft een kant-en-klaar object.
 
Reshad F

Reshad F

20/06/2014 00:09:52
Quote Anchor link
Naar mijn mening zijn abstracte klasses alleen goed wanneer je kan zeggen

een mercedes IS_EEN auto
een volvo IS_EEN auto

voor al het andere raad ik de interface aan. Waarom is de abstracte klasse niet altijd optimaal? Je kan het maar weinig gebruiken ( alleen in een IS_EEN relatie ) en verder is de code al geïmplementeerd waardoor je niet flexibel kan zijn met je implementatie.

p.s. overigens zijn jou voorbeeldjes vaag altijd waardoor je niet echt een tegenargument kan geven want wat is een foo? ^^
Gewijzigd op 20/06/2014 00:10:42 door Reshad F
 
Ozzie PHP

Ozzie PHP

20/06/2014 00:16:17
Quote Anchor link
>> p.s. overigens zijn jou voorbeeldjes vaag altijd waardoor je niet echt een tegenargument kan geven want wat is een foo? ^^

Hehe... lol. Het maakt in dit geval niet uit wat foo is omdat de vraag daar niet over ging :)
In dit geval gaat het inderdaad om een IS_EEN relatie, dus dat klopt. Het ging me alleen dus even om hoe ik moet omgaan met een method die meerdere keren voorkomt maar niet overal. Maar daar had je me al antwoord op gegeven. Ik maak er dus een lege abstracte method van, en dan zal ik dus moeten accepteren dat die method in 2 classes op precies dezelfde manier wordt ingevuld.
 
Wouter J

Wouter J

20/06/2014 00:18:04
Quote Anchor link
Ook interfaces moeten een IS_EEN relatie hebben.

Programmeren naar een interface doelt niet zozeer op het werkelijk gebruiken van een interface. Het doelt er meer op dat je niet moet programmeren naar 1 specifieke implementatie, maar liever het globaler aan moet pakken. Of dat globale nou een andere overkoepelende klasse is, een abstracte klasse of een interface maakt niet zo heel veel uit.

Overigens zou ik deze regel zeker niet altijd aan raden. Heb je bijv. een Factory klasse, dan is het programmeren naar een interface vrij zinloos.

Jouw voorbeeldje met mercedes en volvo zou ik overigens niet met inheritance oplossen (een van de meest misbruikte use cases van inheritance), maar met composition (bijv. het Strategy pattern).

Om op Ozzie's vraag goed te antwoorden hebben we eigenlijk meer context nodig. We zouden in dit geval namelijk voor 3 dingen kunnen kiezen: (1) inheritance, (2) composition of (3) copy/past. Voor alle 3 is wat te zeggen en alle 3 zijn ze juist, in hun eigen context. Welke er hier opgaat is dus volledig afhankelijk van die context.
 
Ozzie PHP

Ozzie PHP

20/06/2014 00:26:12
Quote Anchor link
Wouter, het gaat in dit geval om verschillende autoloaders. Die extenden een abstracte basis-class. Bij sommige autoloaders wil ik bij het toevoegen van de namespace een slash achter de namespace plakken (om ze naderhand op de juiste manier met de fqcn te kunnen vergelijken). Dit is echter niet bij alle autoloader classes nodig. En om die reden verschilt de add_namespace method dus. Bij 2 clases is die hetzelfde, bij 1 class moet die slash worden toegevoegd. Maar wie weet komen er ooit autoloaders bij waarbij ook die slash moet worden toegevoegd. Ik denk dus dat het antwoord van Reshad wel correct is om de invulling per class te regelen.

Toevoeging op 20/06/2014 00:28:09:

P.S.

>> Ook interfaces moeten een IS_EEN relatie hebben.

Als je een "op zichzelf staande" interface bedoelt is dit niet helemaal waar.

Je kunt bijv. een interface Drivable hebben, die geimplementeerd wordt door een Car en een Bike class. Zowel een Car als een Bike !IS_EEN Drivable. Drivable beschrijft GEDRAG wat in de implementerende classes voorkomt.
 
Ward van der Put
Moderator

Ward van der Put

20/06/2014 07:11:43
Quote Anchor link
>> Bij sommige autoloaders wil ik bij het toevoegen van de namespace een slash achter de namespace plakken (om ze naderhand op de juiste manier met de fqcn te kunnen vergelijken).

Een slash achter een namespace?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
namespace DontTryThisAtHomeFolks/;
?>


Of een backslash?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
namespace MoreFooLishNess\;
?>


Die slash of backslash hoort er niet in. Oplossing (4) weg ermee.
 
Ozzie PHP

Ozzie PHP

20/06/2014 09:02:49
Quote Anchor link
Een backslash, maar ik merk dat je niet helemaal begrepen hebt wat ik bedoel ;) Doet voor de vraagstelling overigens niet terzake.
 
Ward van der Put
Moderator

Ward van der Put

20/06/2014 09:55:23
Quote Anchor link
Offtopic:

Het doet in zoverre wel terzake dat je add_namespace() methode iets aan een namespace toevoegt dat niet in een namespace thuishoort. Of je zou de methode anders moeten noemen.


Als het om een kleine aanvulling op de abstracte klasse gaat, kun je de parent-methode aanroepen.

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
<?php
abstract class AbstractAutoloader
{
    protected $Namespaces;

    public function add_namespace($name, $path)
    {

        $this->Namespaces[$name] = $path;
    }
}


class OrdinaryAutoloader extends AbstractAutoloader
{
    // Blanco: implementeert AbstractAutoloader()
}

class SlashingAutoloader extends AbstractAutoloader
{
    public function add_namespace($name, $path)
    {

        // Voeg die backslash toe ...
        $name = rtrim($name, '\\') . '\\';
        // ... en implementeer de rest
        parent::add_namespace($name, $path);
    }
}

?>
 
Ozzie PHP

Ozzie PHP

20/06/2014 10:02:20
Quote Anchor link
"SlashingAutoloader"

Hehe... lol :)

De parent aanroepen zou kunnen, maar in jouw voorbeeld zou ik denk ik gewoon die regel code uit de parent in de method zelf zetten. Scheelt toch weer een method-call.
 
Ward van der Put
Moderator

Ward van der Put

20/06/2014 10:08:24
Quote Anchor link
Dat zou ik niet doen: je wilt de methode in de abstracte klasse kunnen herschrijven of uitbreiden. Dat het nu maar één regel is, wil niet zeggen dat dat in de toekomst ook zo is. In de gekloonde methode wil je daarom liefst alleen de verschillen met het origineel vastleggen.
 
Ozzie PHP

Ozzie PHP

20/06/2014 10:15:56
Quote Anchor link
Mja... dat is een persoonlijke keuze. Je kunt het ook zien dat je nu de taak van 1 method gaat spreiden over 2 methods. Als er daadwerkelijk complexe logica wordt uitgevoerd, dan zou ik het nog een ander verhaal vinden. Maar om enkel iets te setten een andere method aanroepen... hmmm, kweet het niet. Je kunt het ook andersom zien. Je past de parent method aan, en creëert daarmee mogelijk zonder dat je het in de gaten hebt een probleem voor de SlashingAutoloader. Het werkt dus 2 kanten op.
 
Dos Moonen

Dos Moonen

20/06/2014 10:19:43
Quote Anchor link
DRY, look it up
 
Ward van der Put
Moderator

Ward van der Put

20/06/2014 10:40:20
Quote Anchor link
Inderdaad.

Als je dergelijke verschillen met strings voor namen en paden vaker verwacht, zou je ook nog late static bindings 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
20
21
22
23
24
25
26
<?php
abstract class AbstractAutoloader
{
    const NAMESPACE_PREFIX  = '';
    const NAMESPACE_POSTFIX = '';

    protected $Namespaces;

    public function add_namespace($name, $path)
    {

        $name = static::NAMESPACE_PREFIX . $name . static::NAMESPACE_POSTFIX;
        $this->Namespaces[$name] = $path;
    }
}


class OrdinaryAutoloader extends AbstractAutoloader
{
    // Blanco: implementeert AbstractAutoloader() volledig
}

class SlashingAutoloader extends AbstractAutoloader
{
    // Implementeert maar één verschil
    const NAMESPACE_POSTFIX = '\\';
}

?>
 
Ozzie PHP

Ozzie PHP

20/06/2014 11:21:43
Quote Anchor link
@Dos: ik ken DRY.

Ben jij het dan NIET eens met wat Reshad hierboven zegt?

Reshad F op 19/06/2014 23:46:45:
je gebruikt die abstractie wanneer je weet dat ELKE klas die het overneemt de zelfde implementatie gebruikt van die methode. wanneer je dit dus verschillend hebt dan kan je het beter leeg laten. ...


@Ward:

Daar ga ik eens over nadenken. Dat is wellicht een goede optie en wat minder "gevaarlijk" wat betreft het spreiden van code.
 
Ward van der Put
Moderator

Ward van der Put

20/06/2014 11:31:17
Quote Anchor link
Ik ben het wel met Reshad eens: leeg laten is een duidelijke instructie die de verplichting om de methode te implementeren bij afgeleide klassen legt.

Alleen heb je hier een marginaal verschil in slechts één afgeleide klasse. Zoals ik daarom zei: "Als het om een kleine aanvulling op de abstracte klasse gaat ...". Daarom implementeer je uitsluitend die kleine aanvulling in de afgeleide methode en laat je het standaardprototype via parent:: de rest doen.
 
Ozzie PHP

Ozzie PHP

20/06/2014 11:37:22
Quote Anchor link
>> Daarom implementeer je uitsluitend die kleine aanvulling in de afgeleide methode en laat je het standaardprototype via parent:: de rest doen.

Maar is dat niet een "risico" dan? Als ik de method in de parent class invul is het geen abstracte method meer. Dan komt er een dag (enigszins geneuzel dat wel, maar het gaat even om het idee) dat ik besluit om in de parent class een slash toe te voegen aan de namespace. Het gevolg: die afwijkende class krijgt ineens 2 slashes achter een namespace. Dat is (denk ik) toch ook een risico? Is het dan niet veiliger om de method abstract te maken en de invulling aan de childs over te laten, waarbij je moet accepteren dat in 2 methods hetzelfde gebeurt?
 
Ward van der Put
Moderator

Ward van der Put

20/06/2014 11:44:45
Quote Anchor link
Risico is iets dat je incalculeert, kijk maar naar wat ik eerder deed:

$name = rtrim($name, '\\') . '\\';

Risico = kans × effect. Als de abstract class wordt verbeterd en dat niet met copy/paste wordt overgenomen, heeft dat ingrijpendere gevolgen. De kans is klein, maar het effect is groot. Daarom formaliseer je die copy/paste met parent::add_namespace().
 

Pagina: 1 2 volgende »



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.