Vakantie

Het is vakantie, wat moet ik daarover nog meer vertellen. Ik ga werken, code schrijven, uren op het internet doorbrengen en veel drinken/uitgaan.

Hopelijk voor jullie hetzelfde!

B33R

Volgens mij heb ik het geneesmiddel gevonden voor alle ziektes: bier! Had twee dagen last van keelpijn en na een nachtje goed drinken, was de pijn weg (maar zat hij ergens anders ^^). Dus als je ziek bent, drinkt een stuk in je kloten (niet op doktersadvies maar op IT advies).

Bier

(Ik weet niet wat er scheelt maar die blonde staat me wel aan ^^)

{Java} Virtuele packages

Naar aanleiding van me recenste concept om methodes toe te voegen aan classes waarvan je de source code niet hebt, heb ik een nieuw concept uitgedacht omdat er een probleem was met packages. Klassen zitten in packages (ook wel namespaces genoemd). De Object class zit in de package java.lang. Wanneer we een methode toevoegen moet deze class ook in de package komen en hier komt het probleem. Als je twee dezelfde klasses in een package stopt, krijg je problemen. Zowel met de compiler als voor de programmeur zelf, hij weet niet meer wat zijn code was en de originele. Daarom introduceer ik het concept virtuele packages. Je maakt een nieuwe package aan met dezelfde naam van het originele package maar je zegt dat het een virtuele package is. Dan weet je dat hierin classes bevinden die jij geschreven hebt die de originele classes uitbreidt (extend).

virtual package java.lang;

class Object extends Object

{

public String toString()

{

return this.getClass().getName();

}

}

Wanneer een child dan import java.lang.*; gebruikt, zal hij eerst de originele classes inladen en dan pas de classes in de virtuele overschrijven met de originele. Zo moet de child geen nieuwe import schrijven en kan met naar hartelust bestaande classes in binaire vorm naar hartelust uitbreiden of verbeteren.

{PHP} function-return-array

Ik heb dit concept al eens gepost op een andere blog maar vind dat deze niet mag ontbreken om mijn blog. Dit concept wordt niet zo goed onthaalt in de PHP wereld en ik weet niet waarom. Het concept gaat als volgt. Je hebt een functie die een array teruggeeft. Om de één of andere redenen willen we maar een bepaalde element van de teruggegeven array opvragen. In PHP moeten we daarvoor twee lijnen schrijven.

<?php

$explode = explode(‘/’ , $_SERVER[‘REQUEST_URI’]);

echo $explode[0]; //output: http

?>

Zo bevat $explode nu een hele rij met elementen die we niet gebruiken, gevolg is dat er data in het geheugen staat dat niet gebruikt wordt. De talen zoals Java, C, Perl, Python, Ruby, Javascript, etc ondersteunen dit wel en dus kan je in die talen ook het volgende gebruiken.

<script>

alert( window.location.href.split(‘/’)[0] ); //output: http

</script>

Dit heeft je nu een lijntje code bespaard en een reeks van geheugen plaatsen. In PHP zou dit dan als volgt eruit zien.

<?php

echo explode(‘/’ , $_SERVER[‘REQUEST_URI’])[0]; //output: http

?>

Waarom de PHP community hierover problemen maakt, versta ik niet. Het zal waarschijnlijk de frustratie zijn dat zijzelf niet op het idee gekomen zijn om dit concept in PHP te maken of omdat ze het niet kunnen implementeren in de Zend engine. Iemand van de PHP wereld zei nog het volgende erover.

I don’t know why it isn’t supported by PHP, but I suspect it is related
to the type-concept.

Die snapt het niet omdat dit niet type afhankelijk is. Hieronder staan nog enkele voorbeeldjes voor de function-return-array concept.

<?php

echo $obj->getObjects()[2]->getName();

echo getPlugins()[‘MediaPlugin’]; //array( ‘MediaPlugin’ => … )

$slice = explode(‘-‘ , $string)[0,2,7];

?>

{Java} methodes toevoegen aan een class

Met deze post probeer ik een nieuw concept toe te voegen aan OOP gerichte talen als Java/C#/C++. Een methode toevoegen aan een bestaande class is niet slim, niet goed voor je classen diagram. Maar als je nu eens een algoritme wilt herschrijven of je wilt gebruik maken van een methode maar wilt hierbij niet alle childs van de class herschrijven, dan zit je vast. Dit concept zou het moeten verhelpen. Hier een voorbeeld van wat ik wil, maar het niet kan bereiken met de huidige OOP concepten.

class MyObject extends Object

{

@override

public String toString()

{

return this.getClass().getName();

}

}

Wanneer ik nu een andere class ga schrijven, moet ik vertellen aan iedere class dat ze moeten erven van MyObject. Dit is geen enkel probleem, is het niet dat je wilt dat iedere child van Object ook erft van je nieuwe Object class. Bijvoorbeeld class Class extends MyObject. Dit gaat niet lukken want ik kan niet aan de broncode van de klasse Class. Het enige wat ik kan doen is de klasse Class herschrijven, maar dit kost tijd, moeite, energie en dan heb je nog maar één klasse herschreven.

Het is de bedoeling dat programmeurs klasses kunnen extenden of methodes kunnen toevoegen, zonder dat men al de childs moet kennen. Mijn concept bestaat uit twee delen, het eerste is methodes toevoegen en het tweede is een class extenden.

class Main

{

public static void main( String[] args )

{

Object o = new Object();

Method newMethod = new Method( Method.PUBLIC , “toString” , hier de methode code );

o.getClass().addMethod( newMethod );

}

}

De tweede methode vind ik iets beter dan die hierboven. Je extend de bestaande klasse met dezelfde naam. In OOP worden dan de methodes, eigenschappen, constantes, etc in de nieuwe klasse gegooid en gelden alle overervingseigenschappen ook.

class Object extends Object

{

public String toString()

{

return this.getClass().getName();

}

}

Zoals je ziet komt mijn nieuwe Object class tussen de twee te staan en kunnen al de childs van de Object class genieten van je snellere/betere algoritme of je kan je nieuwe methodes gebruiken in iedere class. Dit concept kan je maar toepassen op classes waarvan je de broncode niet beschikt (JRE System Library bv.) en dus niet in de class zelf kan schrijven.

Hopelijk boeit dit concept de OOP programmeurs. Vragen en/of opmerkingen gelieve in de reacties te plaatsen.