[oop] abstracte class, invulling methods

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Functioneel applicatiebeheerder - SOP-SYS-SAM

TenneT is hard groeiend om de onze ambities waar te kunnen maken. Zo nemen wij een leidende rol in het aanjagen van de energietransitie. Het werven van nieuw talent speelt daarin een cruciale rol. Wij zijn op zoek naar een gedreven Functioneel Applicatiebeheerder voor het financiele domein op onze locatie Arnhem die hieraan wil bijdragen en misschien ben jij dat wel? Jouw bijdrage aan TenneT Je gaat samenwerken in een team van circa 15 functioneel applicatiebeheerders en gaat onderdeel uitmaken van een DevOps team. Met dit team ga je applicaties (laten) ontwikkelen en beheren. Hierbij concentreer je je vooral op

Bekijk vacature »

C# .NET Developer

Dit ga je doen Als developer nieuwe gave features implementeren; Werken met technieken als C# .NET en (REST) API's webservices; Ontwikkelen van koppelingen middels API's; Maken van technische keuzes en beslissingen over de architectuur; Junior collega's coachen; Initiatief nemen voor nieuwe technische mogelijkheden; Je bent een belangrijke schakel - en vindt het leuk - om te schakelen met de business. Hier ga je werken In een klein team van professionals ben je als C# .NET Developer verantwoordelijk voor het ontwikkelen van één van de applicaties voor het grootste inhouse product: een applicatie voor alles omtrent hypotheken. De programmeertaal die je

Bekijk vacature »

Medior PHP developer

Functie Samen met je development team werk je Agile Scrum en met jullie gezamenlijke kennis en ervaring bepalen jullie samen de beste keuze voor techniek en architectuur. Naast het ontwikkelen van software ben je continue bezig om ook jezelf te ontwikkelen. Ze werken met o.a.: PHP, Laravel, Doctrine, PHP Unit, Behat, React, TypeScript, (My)SQL, Postgress, Redis, ElasticSearch, Docker, Nginx, GIT flow, JIRA, AWS. Eisen • HBO werk- en denkniveau • Je hebt goede kennis en ervaring met PHP • Je bent niet bang voor complexe projecten • Je werkt graag zelfstandig aan applicaties • Je bent altijd nieuwsgierig naar nieuwe

Bekijk vacature »

Back-end PHP Software Developer - Juniorfunctie

Functieomschrijving Wij zijn op zoek naar een PHP Software Developer om ons team te versterken en mee te werken aan de ontwikkeling van eigen IOT-oplossingen. In deze functie ben je verantwoordelijk voor het bouwen van webapplicaties, apps en dashboards voor het uitlezen en managen van sensoren in machines. Je werkt nauw samen met een team van ontwikkelaars en engineers om de beste software-oplossingen te creëren. Jouw werkzaamheden zien er als volgt uit: Je bent in deze rol verantwoordelijk voor het ontwerpen, ontwikkelen en onderhouden van webapplicaties en softwaretoepassingen voor in-house ontwikkelde IOT oplossingen. Je werkt aan complexe databases en back-end

Bekijk vacature »

Medior Mobile Developer iOS Amsterdam

Functie What will you be doing as Mobile Developer? As an iOS app developer you will work in a multidisciplinary team of app developers, web developers and designers. You will work on world-class apps that will be used by thousands of people. There is a lot of room for self-development on a technical and personal level. Together with the rest of the team you develop in the newest techniques and you go for the best quality. We work with Kotlin Multiplatform Mobile to develop hybrid apps and we guarantee quality with peer reviews, unit testing and we use a CI/CD.

Bekijk vacature »

Lead developer

Functie Als lead developer wordt jij verantwoordelijk voor een van onze development teams. Samen met de Software Architect bewaak jij de kwaliteit en uitvoering van onze complexe vraagstukken. Daarnaast ben jij verantwoordelijk voor het inschatten, designen en ontwikkelen van middelgrote tot grote veranderingen in de software. Ook coördineer jij het proces rondom complexe technische vraagstukken. Verder bestaat jouw takenpakket uit het volgende: – Het aansturen van jouw development team; – Het begeleiden van Junior Software Engineers; – Het maken van technische analyses m.b.t. nieuwe aanvragen en het tijdsbestek inschatten voor de uitvoering hiervan; – Het uitvoeren van de ontwikkeling van

Bekijk vacature »

Medior PHP Developer

Bij Getnoticed doen wij wat we leuk vinden, websites bouwen en online marketing. Voor veel van onze klanten doen we dan ook allebei. Wel zo fijn om campagnes te draaien voor conversiegerichte website die in eigen beheer zijn. In onze vestiging in Nederweert zitten onze development afdelingen en worden de websites gebouwd. Op dit moment zijn we op zoek naar jou: dé PHP/Back-end developer die net als wij, het hoofd boven het maaiveld durft uit te steken! In het kort Even een paar punten die omschrijven wat deze toffe baan inhoudt: Het bedenken van nieuwe functionaliteiten Het verbeteren van het

Bekijk vacature »

PHP Developer

As a PHP Developer at Coolblue, you ensure that our webshops work as optimal as possible. How do I become a 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 job suits you. You enjoy doing this Writing vanilla PHP code. Working with

Bekijk vacature »

Senior PHP developer met ambities tot Software Arc

Functie Momenteel zijn ze op zoek naar een ervaren PHP developer die zichzelf graag bezighoudt met zaken als architectuur en de algehele verbetering van structuren en standaarden. Het is eigenlijk meer operationeel als uitvoerend omdat je bezig gaat met zaken als het verder uitrollen en verbeteren van testautomatisering, codereviews, tickets en de doorloop hiervan en architectuurkeuzes. Mocht je hiernaast ook wat DevOps kennis meenemen is dit mooi meegenomen! Vanwege het kleine team maar de wereldwijde impact die zij leveren is er veel focus op kwaliteit. In deze functie werk je aan één van hun belangrijkste applicaties. Hierin werk je nauw

Bekijk vacature »

PHP developer - Digital Agency

Functie Het team telt momenteel 20 collega’s, bestaande uit developers (front- en backend) en het operations team, waaronder ook het management en twee scrum masters vallen. Ze zijn op zoek naar een PHP developer die in staat is zelfstandig te werken. Je komt te werken in één van de drie scrumteams en gaat aan de slag met een project voor de klant. Het fijne hieraan is dat je wel afwisseling hebt qua werk, maar tegelijkertijd doorlopend werkt voor bestaande klanten. Hierdoor krijg je ook de kans om echt de diepte in te gaan en innovatieve technische oplossingen neer te zetten.

Bekijk vacature »

Front-end Developer - React - Data Driven

Bedrijfsomschrijving Onze klant is een snelgroeiende organisatie die een data-driven inspectieapp op de markt hebben gebracht die nu al een aantal jaar door verschillende organisaties wereldwijd gebruikt wordt. Er zijn zo'n 6 mensen werkzaam bij dit bedrijf en ze zijn nu vooral op zoek naar een sterke front-end developer die wil gaan werken aan nieuwbouw applicaties en de uitbouw van de huidige applicaties. De reden dat ze zoeken is omdat er veel werk op komst is en ze hier de juiste capaciteit voor willen hebben. Er heerst hier een hele prettige sfeer waarin respect en eerlijke communicatie belangrijk is. Ook

Bekijk vacature »

Robot Programmeur

In het kort Drie redenen waarom deze vacature uniek is! Modern, innovatief en Informeel bedrijf waar veel mogelijk is Werken met diverse robot merken Meehelpen met inbedrijfstellingen bij de klant De organisatie Hier ga je aan de slag Dit groeiende bedrijf van totaaloplossingen in de automatisering van productieprocessen, is hoofdzakelijk actief in de Benelux. Vanuit het kantoor in regio Amersfoort worden veel oplossingen geboden in de vorm van robotica. Geen project is hetzelfde wat garant staat voor bijzonder veel afwisseling. De bedrijfsgrootte is ongeveer 80 man. Van gerobotiseerde machinebeladingen tot aan assemblage automatiseringen wordt vanuit krachtige engineering maatwerk equipment geleverd.

Bekijk vacature »

Front-end Developer Angular

Dit ga je doen Jouw taken als Front End Developer bestaan uit: Het ontwikkelen van maatwerkoplossingen voor klanten; Het meedenken over nieuwe tools en technieken; Het begeleiden van junioren; Het meewerken aan diverse projecten; Het meedenken in UX/UI design. Hier ga je werken Als Front-End Developer ga je in een Scrum team aan de slag met de nieuwste digitale technologieën om klanten en overheden over de hele wereld te ondersteunen met het ondersteunen van hun software, veelal op het gebied van watermanagement en infra. Door middel van real-time data in combinatie met voorspellende analyses, AI, Deep Learning en Machine Learning

Bekijk vacature »

PHP Developer - medior functie

Functieomschrijving Ben jij innovatief en wil jij je kennis graag delen met jouw nieuwe collega's? Lees dan snel verder! Voor een leuke opdrachtgever in de omgeving van Roosendaal zoeken wij een Symfony developer. Of je nou junior, medior of senior bent, je krijgt hier alle vrijheid en verantwoordelijkheid om jouw eigen loopbaan te ontwikkelen. Je gaat je hier bezig houden met en inspelen op de actualiteiten van jouw vakgebied. Techstack: Symfony, PHP, mySQL. Kennis van Svelte is helemaal mooi meegenomen. Bedrijfsprofiel Al sinds '99 is dit webbureau actief. De kernwaarden binnen het bedrijf zijn integer, dienstbaar en deskundig. Je komt

Bekijk vacature »

C# .NET Developer

Functieomschrijving Voor dit leuke softwarre bedrijf in de omgeving Vught zijn we per direct op zoek naar een C#/.NET Developer. Is development jouw passie en doe je dit graag met C#/.NET? Lees dan snel verder! Jou werkzaamheden zullen zijn: Zorgen voor de optimalisatie van de huidige software en het automatiseren van bedrijfsprocessen. Naar aanleiding van de wensen van de klant ga je, met je collega's op zoel naar passende oplossingen en je werkt dit uit tot een mooi eindproduct. Je gaat webshops, websites en webapplicaties ontwikkelen door middel van ASP.NET, C# en MVC Framework. Bedrijfsprofiel Deze opdrachtgever houdt zich bezig

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

25/12/2024 02:00:56
 
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.