[oop] abstracte class, invulling methods

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

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 »

Mendix Consultant / Developer

Dit ga je doen Het in kaart brengen en analyseren van de functionele wensen van de klant rondom Mendix applicaties; Het fungeren als sparringpartner voor de (interne) klanten; Het opstellen van requirements en het vertalen hiervan naar technische mogelijkheden; Het opstellen van user stories; Het bouwen van de Mendix applicaties in samenwerking met jouw team of zelfstandig; Het testen van op te leveren software en het zorg dragen voor de implementatie; Trainen van gebruikers in het gebruik van de applicatie; Werken in een Agile omgeving. Hier ga je werken De organisatie begeeft zich in de retail branche en focust zich

Bekijk vacature »

Senior Cobol Applicatieontwikkelaar

Bedrijfsomschrijving De IV- organisatie van de Belastingdienst is verantwoordelijk voor en verzorgt de ICT- voorzieningen. Het merendeel van de applicaties wordt op dit moment door de IV- organisatie zelf ontwikkeld, onderhouden en beheerd in het eigen data center. Naast de zorg voor continuïteit op de massale heffing- en inningsprocessen die plaatsvinden binnen een degelijke, stabiele omgeving, wordt er tevens volop gewerkt aan modernisering van het IV- landschap. Dit gebeurt deels intern door gebruik te maken van de expertise die intern aanwezig is, maar ook door het aantrekken van (kant-en-klaar) oplossingen en expertise uit de markt. Functieomschrijving In de applicatie ETM

Bekijk vacature »

Mendix Consultant / Developer

Dit ga je doen Het in kaart brengen en analyseren van de functionele wensen van de klant rondom Mendix applicaties; Het fungeren als sparringpartner voor de (interne) klanten; Het opstellen van requirements en het vertalen hiervan naar technische mogelijkheden; Het opstellen van user stories; Het bouwen van de Mendix applicaties in samenwerking met jouw team of zelfstandig; Het testen van op te leveren software en het zorg dragen voor de implementatie; Trainen van gebruikers in het gebruik van de applicatie; Werken in een Agile omgeving. Hier ga je werken De organisatie begeeft zich in de retail branche en focust zich

Bekijk vacature »

Ambitieuze Junior/Medior Low-code Developers gezoc

Bedrijfsomschrijving Transformeer bedrijven met jouw expertise in innovatieve technologie Ben je een bedreven softwareontwikkelaar met ervaring in Low-code platformen, of sta je te popelen om je in deze baanbrekende oplossing te verdiepen? Wij zijn op zoek naar jou! Ons klantenbestand groeit en we willen ons team uitbreiden met deskundige en leergierige Low-code specialisten. Is het jouw passie om organisaties te ondersteunen in hun digitale transformatie en maatwerkoplossingen te bieden met behulp van geavanceerde software? Wij zijn een vooruitstrevend bedrijf dat dagelijks werkt aan het oplossen van complexe vraagstukken om de digitale ambities van onze klanten te realiseren. Functieomschrijving Ontwikkel op

Bekijk vacature »

Als Lead PHP developer bijdragen aan het onderwijs

Functie Als Lead PHP developer zet je samen met het team en de andere lead developers de technische lijnen uit als het gaat om het ontwikkelen van de applicaties en bepaal je samen met de PO waar elke sprint aan gewerkt zal worden. Je kunt op basis van een user story een goede aanpak formuleren en een planning opstellen, en andere hierin meenemen. Wanneer je team code schrijft verwacht je degelijke oplossingen, bij voorkeur gebruik makend van Domain Driven Design. Je ziet toegevoegde waarde in het beoordelen van het werk van collega’s om zo samen te streven naar hoge kwaliteit

Bekijk vacature »

.Net Front-end Ontwikkelaar

Wij zoeken een .Net Front-end Ontwikkelaar! Omschrijving Kun jij snel schakelen en ben je stressbestendig? Dan zoeken wij jou! Als .Net Front-end Ontwikkelaar help je mee aan de webapplicatie die over de hele wereld door allerlei bedrijven wordt gebruikt. Je werkt daarnaast mee aan nieuwe en verbeterde functionaliteiten en helpt met het oplossen van bugs. Over de opdrachtgever Je komt te werken in een ambitieus team dat zich blijft ontwikkelen. Dit is alle informatie die we nu kunnen delen over de werkplek. Als jij de .Net Front-end Ontwikkelaar bent voor deze job, vertellen we je snel nóg meer. Eisen Heb

Bekijk vacature »

Junior PHP Developer

Functieomschrijving Junior PHP Developer gezocht! Voor een opdrachtgever in de regio Gelderland zijn wij op zoek naar een Junior PHP Developer die onderdeel gaat worden van het ontwikkelingsteam van deze organisatie. In deze functie ga jij aan de slag met het schrijven van software voor de aansturing van en het managen van windparken en bijbehorende onderdelen. Hiernaast ga jij je bezighouden met het ontwikkelen, testen en onderhouden van diverse webapplicaties. Het team waarin je komt te werken bestaat uit 3 developers, hierdoor krijg je veel verantwoordelijkheid en de kans om jezelf verder te ontwikkelen. Er wordt echter wel van je

Bekijk vacature »

PHP Developer gezocht!

Functie omschrijving Wij zijn op zoek naar een PHP Developer! Ben jij op zoek naar een nieuwe uitdaging? Lees dan snel verder! Voor een organisatie in de regio Utrecht die zich bezighoud met het verbeteren van de medicatieveiligheid zoeken wij een Software Developer. In deze functie zijn wij op zoek naar een slimme en enthousiaste Developer die interesse heeft in farmacie, logistiek en ICT. Daarnaast beschik je over een goed analytisch vermogen en ben je van nature gestructureerd en resultaatgericht. Je moet in deze functie daadkrachtig, flexibel en communicatief goed zijn. Je verantwoordelijkheden bestaan uit: Object georiënteerd programmeren; Werken in

Bekijk vacature »

.net developer

Hoi! Wij zijn auto.nl en wij verkopen auto's online. je bestelt bij ons een auto net zo makkelijk als een spijkerbroek. En bevalt ie niet? Dan stuur je 'm gewoon weer terug. En dat we dat goed doen bewijst onze hoge klanttevredenheid van een 9,3. Nu maken we de volgende stap bij auto.nl. We starten met fysieke winkels. Online zoeken, offline bekijken. Maar nog altijd, geen gedoe! Gewoon eerlijk, transparant en zonder zorgen een auto kopen.. Maar om dat waar te blijven maken en nóg beter te worden, zoeken we uitbreiding van ons development team. Wat ga je precies doen?

Bekijk vacature »

C#.NET ontwikkelaar

Functieomschrijving Voor een gewaardeerde werkgever in regio Tilburg zijn wij op zoek naar een C#.NET ontwikkelaar. Je bent verantwoordelijk voor het ontwikkelen van dashboards, webapplicaties en apps voor de eigen IOT-oplossingen. Samen met een vooruitstrevend team van ontwikkelaars en engineers krijgen jullie de opdracht om de sensoren in de apparatuur te scannen en vervolgens de data om te zetten in belangrijke inzichten voor de klanten. Taken en verantwoordelijkheden: Heb jij ideeën over nieuwe technieken die jullie kunnen implementeren? Hier wordt echt naar je geluisterd en gekeken of jouw idee daadwerkelijk ingezet kan worden; Je gaat aan de slag met de

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 »

Senior Front-end developer Consultancy

Functie Als front-end developer ga je aan de slag voor verschillende klanten, waarbij veel rekening wordt gehouden met waar je woont (dit is altijd binnen het uur), en word er gezocht naar een organisatie die past bij jou. Zowel qua persoonlijke ambities als de technische aansluiting. De opdrachten duren gemiddeld 1 à 2 jaar maar dit hangt ook af van je wensen. Je werkt in een teamverband voor een klant en zult nauw samenwerken met zowel eigen collega’s als die bij de klant werkzaam zijn. Ze zijn op zoek naar een technische front-end developer die ruime ervaring heeft in één

Bekijk vacature »

Senior developer (PHP en VB.NET)

Functie De development afdeling bestaat uit 2 teams. Het productteam (10 developers) is verantwoordelijk voor verschillende applicaties met als doel om zoveel mogelijk te automatiseren en uit te werken tot standaard software. Met diverse Solutions Architecten en ervaren developers denken ze voortdurend mee met hun klanten en bouwen ze de basis van het uiteindelijke maatwerk dat wordt geleverd. Hiernaast hebben ze een maatwerk/projectteam. Dit team bestaat momenteel uit 8 developers (junior tot senior) en is verantwoordelijk voor het maatwerk in hun klantprojecten. Momenteel zijn ze op zoek naar een senior developer die aan de slag gaat in het productteam. Hierin

Bekijk vacature »

Front-end (Angular) developer - remote werken

Functie Als Front-end (Angular) developer ga je aan de slag met het uitbouwen van hun webapplicatie, als één van de front-end experts ga je samen met collega’s in een devops team werken aan een nieuw front-end voor hun calculatie oplossing. Binnen de calculatiesoftware kunnen meerdere professionals tegelijk samenwerken, 3D calculaties uitvoeren en ook inzien met de benodigde specifieke details. Deze software wordt veel ingezet om projectbeschrijvingen en kosten in kaart te brengen, en tijdens de uitvoering te bewaken. Maar hiernaast liggen er in de toekomst veel meer plannen op het gebied van front-end in de andere applicaties. Genoeg te doen

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/04/2024 02:16:18
 
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.