Code hergebruik

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Lord Gaga

Lord Gaga

24/11/2016 13:18:24
Quote Anchor link
Goedemiddag,

Stel ik heb de volgende pseudo code:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
function intersectsWithObjectOfType(type)
{
    for (var i = 0; i < this.objects.length; i++)
    {
        if (this.objects[i] instanceof type)
        {
            // Return true wanneer er een intersection is
        }
    }
    
    return false;
}


Naast bovenstaande code wil ik bijvoorbeeld ook een functie die kijkt of er een intersection is zonder te controleren wat het type van dit object is. Nu kan dit op twee verschillende manieren:

Dezelfde code, maar zonder if statement
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
function intersectsWithObject()
{
    for (var i = 0; i < this.objects.length; i++)
    {
        // Return true wanneer er een intersection is
    }
    
    return false;
}


Of je roept de bestaande functie aan en geeft de laagst mogelijke inheritance mee als type:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
function intersectsWithObject()
{
    return this.intersectsWithObjectOfType(Object);
}


Wat is hier de meest gebruikelijke manier?

Alvast bedankt!
 
PHP hulp

PHP hulp

18/10/2018 01:54:57
 
Wouter J

Wouter J

27/11/2016 12:31:56
Quote Anchor link
Ik zou het anders aanpakken. Ipv deze methode statefull te laten zijn, zou ik deze stateless maken. Het vinden van een intersection staat los van het selecteren welke objecten gecontroleerd wordt. Door deze lijst als parameter mee te geven is elke vorm van filtering (wat wie zegt dat selecteren op object type het enige is?) los van de uiteindelijke check. In pseudo code:

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
function intersectsWithObject(objects) {
    for (object in objects) {
        if (object intersects) {
            return true;
        }
    }

    return false;
}

function filterByType(type, objects) {
    objectsOfType = [];

    for (object in objects) {
        if (objects is type) {
            push(objectsOfType, object);
        }
    }

    return objectsOfType;
}

// gebruik
intersectsWithObject(objectList);
intersectsWithObject(filterByType(SomeType, objectList));
intersectsWithObject(anotherFilter(..., objectList));
Gewijzigd op 27/11/2016 12:32:39 door Wouter J
 
Lord Gaga

Lord Gaga

27/11/2016 21:01:38
Quote Anchor link
Dat is inderdaad veel makkelijker, bedankt! :P

Daarnaast heb ik nog een nieuwe vraag die misschien niet helemaal met het topic te maken heeft, maar wel met de "intersection" e.d.

Na sommige acties, zoals wanneer een intersection heeft plaatsgevonden, wil ik een soort "callback" aanroepen.
Wanneer er dus een intersection tussen twee objecten plaatsvindt moet het debetreffende object hierover worden geïnformeerd. Zelf dacht ik aan de volgende aanpak:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
for (object in objects)
{
    if (object intersects)
    {
        this.onIntersectionWithObject(object);
    }
}


Is dit een juiste aanpak of bestaan hier bepaalde methoden voor die beter werken?

Naast deze "callback" heb ik bijvoorbeeld ook de volgende situatie:

- Het "Game" object heeft een "GameLoop" object met een verwijzing naar "Game".
- Wanneer het "GameLoop" object "tickt" wordt "onGameLoopTick" aangeroepen in "Game".
- "onGameLoopTick" roept weer "update" en "render" aan.

Dit werkt, maar dit voelt nogal vies. Is het in dit geval niet beter om rechtstreeks vanuit "GameLoop" de "update" en "render" method aan te roepen? Of kan ik misschien beter een callback meegeven via de constructor van de "GameLoop" (zoals in onderstaande pseudo code), of is een soort "Event Listener" systeem hiervoor weer handiger?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
class Game
{
    constructor()
    {
        this._gameLoop = new GameLoop(this.onGameLoopTick);
    }
}
Gewijzigd op 27/11/2016 21:03:13 door Lord Gaga
 



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.