Tijdens m'n dagelijkste programmeer-werkzaamheden kwam ik op een aardig idee wat je zou kunnen toepassen in OO-talen
. Het heeft te maken met interfaces. Wat dat zijn hoef ik hopelijk niet uit te leggen
.
Mijn idee heeft te maken met het combineren van interfaces. Als je veel met kleine interfaces werkt komt het vaak voor dat je eigenlijk wilt opgeven dat een methode argument aan verschillende interfaces moet voldoen. Op dit moment moet je dat doen door een nieuw type te maken die beide interfaces extend of implementeert. Maar dat is totaal overbodig en kan een explosie aan combinaties veroorzaken.
Even een voorbeeldje
. Stel bijvoorbeeld dat je deze interface hebt:
(ja die kennen we
).
en bijvoorbeeld deze:
Als je nu een methode wilt schrijven die een object vereist die Runnable en Stoppable is, moet je een nieuwe interface maken (sorry voor de onzinnge naam):
Nu kan je dus opgeven dat je een RunnableStoppable wilt hebben.
Goed, dat is dus niet zo'n groot probleem, maar stel nu eens dat we ook nog een interface Suspendable hebben:
en een interface Resumable:
Wel, je ziet de bui waarschijnlijk al hangen! Ga dit maar eens allemaal combineren: RunnableSuspendable, RunnableSuspendableStoppable, RunnableResumable en ga zo nog maar een stuk of 20 keer door
. Vaak zal er in dit geval dus gekozen worden voor ranzige casts of niet atomaire interfaces.
Dit is natuurlijk een zeer extreem en wellicht onzinnig voorbeeld, maar de bedoeling is duidelijk: je moet aan kunnen geven dat een methode aan meerdere interfaces moet voldoen!
Bijvoorbeeld
of
Dit lijkt mij een super toevoeging voor talen als C# en Java en het is vrij logisch in te zien dat hier geen enkel bezwaar tegen is. Grappig om te zien dat ze bij C# aan allerlei suiker hebben gedacht, maar niet hier aan. Het zal waarschijnlijk wel problemen opleveren voor de bytecode, maar desnoods kan er at-compile time een gecombineerde interface worden gegenereerd.
Uiteraard gaat dit in deze talen alleen op voor interfaces, het is onzinnig om implementaties van verschillende klassen te vereisen. Er is immers geen multiple inheritance.
Vinden jullie het ook zo'n stoer idee?
Kent iemand dit uit andere talen? (ik niet namelijk)
Mijn idee heeft te maken met het combineren van interfaces. Als je veel met kleine interfaces werkt komt het vaak voor dat je eigenlijk wilt opgeven dat een methode argument aan verschillende interfaces moet voldoen. Op dit moment moet je dat doen door een nieuw type te maken die beide interfaces extend of implementeert. Maar dat is totaal overbodig en kan een explosie aan combinaties veroorzaken.
Even een voorbeeldje
code:
1
2
3
4
| public interface Runnable
{
public void run();
} |
(ja die kennen we
en bijvoorbeeld deze:
code:
1
2
3
4
| public interface Stoppable
{
public void stop();
} |
Als je nu een methode wilt schrijven die een object vereist die Runnable en Stoppable is, moet je een nieuwe interface maken (sorry voor de onzinnge naam):
code:
1
2
3
| public interface RunnableStoppable extends Runnable, Stoppable
{
} |
Nu kan je dus opgeven dat je een RunnableStoppable wilt hebben.
Goed, dat is dus niet zo'n groot probleem, maar stel nu eens dat we ook nog een interface Suspendable hebben:
code:
1
2
3
4
| public interface Suspendable
{
public void suspend();
} |
en een interface Resumable:
code:
1
2
3
4
| public interface Resumable
{
public void resume();
} |
Wel, je ziet de bui waarschijnlijk al hangen! Ga dit maar eens allemaal combineren: RunnableSuspendable, RunnableSuspendableStoppable, RunnableResumable en ga zo nog maar een stuk of 20 keer door
Dit is natuurlijk een zeer extreem en wellicht onzinnig voorbeeld, maar de bedoeling is duidelijk: je moet aan kunnen geven dat een methode aan meerdere interfaces moet voldoen!
Bijvoorbeeld
code:
1
| public void doSomething(Runnable and Cancelable r); |
of
code:
1
| public void doSomething(Suspendable and Resumable r); |
Dit lijkt mij een super toevoeging voor talen als C# en Java en het is vrij logisch in te zien dat hier geen enkel bezwaar tegen is. Grappig om te zien dat ze bij C# aan allerlei suiker hebben gedacht, maar niet hier aan. Het zal waarschijnlijk wel problemen opleveren voor de bytecode, maar desnoods kan er at-compile time een gecombineerde interface worden gegenereerd.
Uiteraard gaat dit in deze talen alleen op voor interfaces, het is onzinnig om implementaties van verschillende klassen te vereisen. Er is immers geen multiple inheritance.
Vinden jullie het ook zo'n stoer idee?
Kent iemand dit uit andere talen? (ik niet namelijk)
Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment