|
| Pattern for interaktion Fra : Esben Mose Hansen |
Dato : 25-05-01 21:15 |
|
Hej gruppe,
jeg har siddet lidt og tænkt over en klasse af problemer, jeg støder ind
i. De er meget ens og jeg vil derfor nøjes med den jeg synes er mest
intuitiv.
Lad os forestille os at vi har et program med en masse tingester, der
flyver rundt og ramler ind i hinanden. Det man er interesseret i er at
simulerer resultatet af disse sammenstød på en realistisk måde. Hvis
hver tingest er repræsenteret af et objekt (af ikke nødvendigvis samme
klasse) ser man straks, at der er brug for n(n-1)/2 forskellige slags
sammenstødsmetoder, hvor n er antallet af forskellige type (klasser) af
tingester. Men hvor skal man gøre af dem? De hører "naturligt" til hos
hvert *par* af objekter/tingester, men dette virker som en lidt
mærkeligt måde at programmere på, især fordi at den giver en del
"par"-klasser selv for små n. F.eks. n=4->6 "par"-klasser.
Nogen der har alternative forslag?
mvh. Esben
| |
Jørn Sibbern Askaa (26-05-2001)
| Kommentar Fra : Jørn Sibbern Askaa |
Dato : 26-05-01 12:20 |
|
Hej Esben
> Hvis
> hver tingest er repræsenteret af et objekt (af ikke nødvendigvis samme
> klasse) ser man straks, at der er brug for n(n-1)/2 forskellige slags
> sammenstødsmetoder, hvor n er antallet af forskellige type (klasser) af
> tingester. Men hvor skal man gøre af dem? De hører "naturligt" til hos
> hvert *par* af objekter/tingester, men dette virker som en lidt
> mærkeligt måde at programmere på, især fordi at den giver en del
> "par"-klasser selv for små n. F.eks. n=4->6 "par"-klasser.
>
> Nogen der har alternative forslag?
-med mindre at objekterne fusionerer når de mødes, så gætter jeg på at du er
interesseret i de to objekters måde at bevæge sig på bagefter. Eventuelle
tilstandsændringer i objektet kan flettes ind her.
alle objekter der er på banen skal have en metode hit(energi og retning),
der returnerer det ramte objektets nye retning og energi. (-og selvfølgelig
bevæger sig i denne retning efterfølgende)
Objekter der bevæger sig skal kunne opdage om de rammer noget.
-hvis problemet er mere genenrelt vil jeg anbefale at du kigger på hvilke
informationer klasserne har behov for at udveksle mellem hinanden.
håber du kan bruge det til noget.
mvh Jørn
| |
Esben Mose Hansen (27-05-2001)
| Kommentar Fra : Esben Mose Hansen |
Dato : 27-05-01 10:27 |
|
Jørn Sibbern Askaa wrote:
> Hej Esben
>
>
>>Hvis
>>hver tingest er repræsenteret af et objekt (af ikke nødvendigvis samme
>>klasse) ser man straks, at der er brug for n(n-1)/2 forskellige slags
>>sammenstødsmetoder, hvor n er antallet af forskellige type (klasser) af
>>tingester. Men hvor skal man gøre af dem? De hører "naturligt" til hos
>>hvert *par* af objekter/tingester, men dette virker som en lidt
>>mærkeligt måde at programmere på, især fordi at den giver en del
>>"par"-klasser selv for små n. F.eks. n=4->6 "par"-klasser.
>>
>>Nogen der har alternative forslag?
>>
>
> -med mindre at objekterne fusionerer når de mødes, så gætter jeg på at du er
> interesseret i de to objekters måde at bevæge sig på bagefter. Eventuelle
> tilstandsændringer i objektet kan flettes ind her.
>
> alle objekter der er på banen skal have en metode hit(energi og retning),
> der returnerer det ramte objektets nye retning og energi. (-og selvfølgelig
> bevæger sig i denne retning efterfølgende)
Problemet er bare, at interaktionen mellem objekterne afhænger af hvilke
objekttyper (klasser) der støder sammen. Hvis objekterne f.eks. er
skumgummibolde og marmorkugler, så vil der være tre slags "hits":
skumgummibold+skumgummibold
marmorkugle+skumgummibold
marmorkugle+marmokugle
For at kunne simulerer et sammenstød skal et objekt altså have
infomation og kendskab til den anden type objekt, der stødes med. Ellers
ville jeg også sige at en hit(masse, hastighedsvektor, position) metode
på hvert objekt må være tilstrækkelig.
> Objekter der bevæger sig skal kunne opdage om de rammer noget.
Ja, dette problem er jo i virkeligheden af samme type. Hvis der både er
kugler og kasser er det jo tre forskellige kollisionsdetektionsrutiner,
der skal bruges.
> -hvis problemet er mere genenrelt vil jeg anbefale at du kigger på hvilke
> informationer klasserne har behov for at udveksle mellem hinanden.
> håber du kan bruge det til noget.
Ja, det er også sådan at jeg har lært det. Problemet er egentligt bare,
at jeg synes det er noget uelegant at skulle ændre på alle allerede
eksisterende objekter hvis jeg vil indføre et nyt. Derfor tænkte jeg på
at lave "par-klasser", der så hver havde en hitmetode og en
kollisionsdetektionsmetode. Men det giver på den anden side set en masse
klasser.
1000 tak for hjælpen,
mvh. Esben
| |
Jørn Sibbern Askaa (28-05-2001)
| Kommentar Fra : Jørn Sibbern Askaa |
Dato : 28-05-01 08:31 |
|
>
> Problemet er bare, at interaktionen mellem objekterne afhænger af hvilke
> objekttyper (klasser) der støder sammen. Hvis objekterne f.eks. er
> skumgummibolde og marmorkugler, så vil der være tre slags "hits":
>
> skumgummibold+skumgummibold
> marmorkugle+skumgummibold
> marmorkugle+marmokugle
>
-for mig at se ligger opgaven stadig ikke i en blanding af objekter, men hos
de individuelle pårørende.
Hvis jeg rammer/bliver ramt af en anden, skal jeg afhængig af hvem den anden
er reagere forskelligt, derfor behøver jeg detaljeret information om hvordan
jeg skal opføre mig.
> For at kunne simulerer et sammenstød skal et objekt altså have
> infomation og kendskab til den anden type objekt, der stødes med. Ellers
> ville jeg også sige at en hit(masse, hastighedsvektor, position) metode
> på hvert objekt må være tilstrækkelig.
>
> > Objekter der bevæger sig skal kunne opdage om de rammer noget.
>
> Ja, dette problem er jo i virkeligheden af samme type. Hvis der både er
> kugler og kasser er det jo tre forskellige kollisionsdetektionsrutiner,
> der skal bruges.
klap hesten...
Bare start med at få en til at opdage hvis to objekter er inde i hinandens
sfære.
Viden er der brug for:
Der skal være en der ved hvor alle er, denne kan oplagt også være
kollisionsdetektor -den ved det hele -forudsat at alle objekter .fortæller
denne hvor de er.
Når man flytter sig, skal man så bare spørge samtidig om der er andre det
sted man er kommet til, hvis det er tilfældet, kan man vel bare få en
reference til den man rammer.
Her vil der givetvis komme nogle samtidighedsproblemer, om at objekterne
nærmest når at flette fuldstændig ind i hinanden, før nogen kan råbe op at
de er stødt sammen.
>
>
> > -hvis problemet er mere genenrelt vil jeg anbefale at du kigger på
hvilke
> > informationer klasserne har behov for at udveksle mellem hinanden.
> > håber du kan bruge det til noget.
>
> Ja, det er også sådan at jeg har lært det. Problemet er egentligt bare,
> at jeg synes det er noget uelegant at skulle ændre på alle allerede
> eksisterende objekter hvis jeg vil indføre et nyt. Derfor tænkte jeg på
> at lave "par-klasser", der så hver havde en hitmetode og en
> kollisionsdetektionsmetode. Men det giver på den anden side set en masse
> klasser.
jeg er stærkt imod ideen om at have en klasse der er en sammensmeltning af
flere klasser. Objektorienteringen ryger af h...... til hvis ikke alle
klasser er veldefineret. Et sammenstød der involverer mere en et objekt kan
vel godt resultere i metodekald i flere klasser.
Hvis du ikke vil ødelægge nogle fine klasser så lav nogle
interfaces/abstrakte superklasser, der implementerer kollisions-rutiner, og
flytte-rutiner
>
> 1000 tak for hjælpen,
selv tak
mvh Jørn
| |
Esben Mose Hansen (28-05-2001)
| Kommentar Fra : Esben Mose Hansen |
Dato : 28-05-01 20:26 |
|
Jørn Sibbern Askaa wrote:
>>Problemet er bare, at interaktionen mellem objekterne afhænger af hvilke
>>objekttyper (klasser) der støder sammen. Hvis objekterne f.eks. er
>>skumgummibolde og marmorkugler, så vil der være tre slags "hits":
>>
>>skumgummibold+skumgummibold
>>marmorkugle+skumgummibold
>>marmorkugle+marmokugle
>>
> -for mig at se ligger opgaven stadig ikke i en blanding af objekter, men hos
> de individuelle pårørende.
> Hvis jeg rammer/bliver ramt af en anden, skal jeg afhængig af hvem den anden
> er reagere forskelligt, derfor behøver jeg detaljeret information om hvordan
> jeg skal opføre mig.
Så du foreslår noget i stil med
class SteelBall {
hit(SteelBall objekt) {}
hit(RubberBall objekt) {}
hit(Bomb objekt) {}
hit(SquishyGoo objekt) {}
[...]
addVelocityVector(Vektor v) {}
explode() { }
}
og tilsvarende for andre klasser? Jeg synes problemet med denne
angrebsvinkel er trefoldig:
(1) Antallet af metoder i hver klasse kan blive meget stor, hvilket
bryder med tommelfingerreglen om 3-7 metoder pr. klasse
(2) Alle klasser skal modificeres hver gang
(3) Alle klasser er stærkt koblet med alle andre klasser
Mens fordelene er :
(1) Ingen ekstra klasser. (og det er en stor fordel)
(2) Ingen par-klasser med meget få metoder (bryder med 3-7 metodereglen
hvis værd klasse blot har en hit-metode)
>>For at kunne simulerer et sammenstød skal et objekt altså have
>>infomation og kendskab til den anden type objekt, der stødes med. Ellers
>>ville jeg også sige at en hit(masse, hastighedsvektor, position) metode
>>på hvert objekt må være tilstrækkelig.
>>
>>
>>>Objekter der bevæger sig skal kunne opdage om de rammer noget.
>>>
>>Ja, dette problem er jo i virkeligheden af samme type. Hvis der både er
>>kugler og kasser er det jo tre forskellige kollisionsdetektionsrutiner,
>>der skal bruges.
>>
>
> klap hesten...
Klappe, klappe. Good boy
> Bare start med at få en til at opdage hvis to objekter er inde i hinandens
> sfære.
> Viden er der brug for:
> Der skal være en der ved hvor alle er, denne kan oplagt også være
> kollisionsdetektor -den ved det hele -forudsat at alle objekter .fortæller
> denne hvor de er.
Jeg havde nu mere forestillet mig at traversere lister, og så kalde hver
klasse med en detectCollision(Iterator detectFor) eller noget i den
stil. Så kan hver klasse se om den støder ind i nogen objekter. Jeg kan
ikke lide ideen om en klasser, der kender egenskaber for *alle*
objekter, men det er måske bare mig? Ville den klasse ikke blive hård at
vedligeholde?
> Når man flytter sig, skal man så bare spørge samtidig om der er andre det
> sted man er kommet til, hvis det er tilfældet, kan man vel bare få en
> reference til den man rammer.
>
> Her vil der givetvis komme nogle samtidighedsproblemer, om at objekterne
> nærmest når at flette fuldstændig ind i hinanden, før nogen kan råbe op at
> de er stødt sammen.
Plus at en sådan kollisionrutine vil håndtere tynde stænger meget
dårligt, da de kan risikere at nå forbi hinanden. Jeg ar bange for at
jeg blive nødt til at gå den hårde vej, men meget af matematikken er på
plads, og desuden er det min forte. Generelt vil jeg lave en rutine, der
givet en hastigheds og rotationsvektor og en Shape for to objekter kan
beregne når og hvis de støder sammen. Af performancehensyn skal alle
objekter nok have boundingboxes (eller måske bounding circles, det må
jeg tænke over)
[...]
>>Problemet er egentligt bare,
>>at jeg synes det er noget uelegant at skulle ændre på alle allerede
>>eksisterende objekter hvis jeg vil indføre et nyt. Derfor tænkte jeg på
>>at lave "par-klasser", der så hver havde en hitmetode og en
>>kollisionsdetektionsmetode. Men det giver på den anden side set en masse
>>klasser.
>>
> jeg er stærkt imod ideen om at have en klasse der er en sammensmeltning af
> flere klasser. Objektorienteringen ryger af h...... til hvis ikke alle
> klasser er veldefineret. Et sammenstød der involverer mere en et objekt kan
> vel godt resultere i metodekald i flere klasser.
> Hvis du ikke vil ødelægge nogle fine klasser så lav nogle
> interfaces/abstrakte superklasser, der implementerer kollisions-rutiner, og
> flytte-rutiner
Hmmm. Jeg har svært ved at følge dig her. En par-klasse (eller her, i
det konkrete tilfælde, interaktionsklasser) er da ganske veldefinerede.
Og jeg kan ikke se hvordan en abstrakt superklasse kan implementerer
meget mere end de mest grunlæggende rutiner, som f.eks. boundingbox-checket.
>>1000 tak for hjælpen,
>>
> selv tak
Det er skam meget værdsat
mvh. Esben
| |
Jørn Sibbern Askaa (28-05-2001)
| Kommentar Fra : Jørn Sibbern Askaa |
Dato : 28-05-01 21:37 |
|
>
> Så du foreslår noget i stil med
> class SteelBall {
> hit(SteelBall objekt) {}
> hit(RubberBall objekt) {}
> hit(Bomb objekt) {}
> hit(SquishyGoo objekt) {}
> [...]
> addVelocityVector(Vektor v) {}
> explode() { }
> }
tja i det store hele, hvis nu alle disse objekter, havde en fælles super,
ville metode signaturen være forenklet til
hit(Dims objekt){}
her kan man så definere en default interaktion, der gør det lettere
implementere andre dimser senere. de specifikke metoder kunne være
hjælpemetoder, der ville gøre den centrale del af koden pæn
>
> og tilsvarende for andre klasser? Jeg synes problemet med denne
> angrebsvinkel er trefoldig:
> (1) Antallet af metoder i hver klasse kan blive meget stor, hvilket
> bryder med tommelfingerreglen om 3-7 metoder pr. klasse
Kan man ikke have nogle metoder explode(), bounce(), melt() mv. og så lade
sammenstødene resultere i en bestemt kombination af metoder?
> (2) Alle klasser skal modificeres hver gang
-derfor kunne en abstrakt superklasse sikre at alle dimser implementerede de
samme metoder
>
> (3) Alle klasser er stærkt koblet med alle andre klasser
ja, min svaghed, jeg understøtter ikke andet end hård aggregeringer.
>
> Mens fordelene er :
> (1) Ingen ekstra klasser. (og det er en stor fordel)
netop ahhhh
> (2) Ingen par-klasser med meget få metoder (bryder med 3-7 metodereglen
> hvis værd klasse blot har en hit-metode)
>
>
> >
> > klap hesten...
>
>
> Klappe, klappe. Good boy
*vrinsk*
>
>
> > Bare start med at få en til at opdage hvis to objekter er inde i
hinandens
> > sfære.
> > Viden er der brug for:
> > Der skal være en der ved hvor alle er, denne kan oplagt også være
> > kollisionsdetektor -den ved det hele -forudsat at alle objekter
..fortæller
> > denne hvor de er.
>
>
> Jeg havde nu mere forestillet mig at traversere lister, og så kalde hver
> klasse med en detectCollision(Iterator detectFor) eller noget i den
> stil. Så kan hver klasse se om den støder ind i nogen objekter. Jeg kan
> ikke lide ideen om en klasser, der kender egenskaber for *alle*
> objekter, men det er måske bare mig? Ville den klasse ikke blive hård at
> vedligeholde?
det er der sikkert, med tingene sat på spidsen, så kender den klasse der har
listen alle dimser i dit system. Jeg ser dimserne som selvstændige tråde der
bare bevæger sig i en retning, og i hvert "time step" fortæller big brother
om der er nogen på det felt hvor en dims er kommet til. hvis der er, kan
dimsen få en "offer" reference, og de kan lege sammen.
hvis den skal vide noget, så må det være hvor alle er, og hvis den skal vide
meget, skal den også vide hvor dimser er på vej hen.
>
>
> > Når man flytter sig, skal man så bare spørge samtidig om der er andre
det
> > sted man er kommet til, hvis det er tilfældet, kan man vel bare få en
> > reference til den man rammer.
> >
> > Her vil der givetvis komme nogle samtidighedsproblemer, om at objekterne
> > nærmest når at flette fuldstændig ind i hinanden, før nogen kan råbe op
at
> > de er stødt sammen.
>
>
> Plus at en sådan kollisionrutine vil håndtere tynde stænger meget
> dårligt, da de kan risikere at nå forbi hinanden.
hvis nu stregen havde en buffer, kunne big brother bare gøre opmærksom på at
man er tæt på
>Jeg er bange for at
> jeg blive nødt til at gå den hårde vej, men meget af matematikken er på
> plads, og desuden er det min forte. Generelt vil jeg lave en rutine, der
> givet en hastigheds og rotationsvektor og en Shape for to objekter kan
> beregne når og hvis de støder sammen. Af performancehensyn skal alle
> objekter nok have boundingboxes (eller måske bounding circles, det må
> jeg tænke over)
box/polygon finten er vel også det der ses i nymodens skydespil, hvor man
under ugunstige forhold kan stå inde i hinanden.
>
> [...]
>
> >>Problemet er egentligt bare,
> >>at jeg synes det er noget uelegant at skulle ændre på alle allerede
> >>eksisterende objekter hvis jeg vil indføre et nyt. Derfor tænkte jeg på
> >>at lave "par-klasser", der så hver havde en hitmetode og en
> >>kollisionsdetektionsmetode. Men det giver på den anden side set en masse
> >>klasser.
> >>
> > jeg er stærkt imod ideen om at have en klasse der er en sammensmeltning
af
> > flere klasser. Objektorienteringen ryger af h...... til hvis ikke alle
> > klasser er veldefineret. Et sammenstød der involverer mere en et objekt
kan
> > vel godt resultere i metodekald i flere klasser.
> > Hvis du ikke vil ødelægge nogle fine klasser så lav nogle
> > interfaces/abstrakte superklasser, der implementerer kollisions-rutiner,
og
> > flytte-rutiner
>
>
> Hmmm. Jeg har svært ved at følge dig her. En par-klasse (eller her, i
> det konkrete tilfælde, interaktionsklasser) er da ganske veldefinerede.
> Og jeg kan ikke se hvordan en abstrakt superklasse kan implementerer
> meget mere end de mest grunlæggende rutiner, som f.eks.
boundingbox-checket.
I min simple, men rare objektorienterede verden, kan jeg ikke lide tanken om
at man skal bruge hjælpe objekter til at udtrykke et givent fællesskab
mellem to klasser (jeg ville foretrække en højere kobling, hvis de da har
noget til fælles). Det kan godt være at jeg enten er for traditionel, eller
for moderne.
>
>
> >>1000 tak for hjælpen,
> >>
> > selv tak
>
> Det er skam meget værdsat
>
Det er det jo nok,
det er jo ren underholdning det her, man forestiller sig hvad det kunne føre
til med et rigtigt whiteboard og en stribe flasker med dug på siden...
god arbejdslyst
hilsen Jørn
| |
Esben Mose Hansen (30-05-2001)
| Kommentar Fra : Esben Mose Hansen |
Dato : 30-05-01 18:53 |
|
Jørn Sibbern Askaa wrote:
>>Så du foreslår noget i stil med
>>class SteelBall {
>> hit(SteelBall objekt) {}
>> hit(RubberBall objekt) {}
>> hit(Bomb objekt) {}
>> hit(SquishyGoo objekt) {}
>> [...]
>> addVelocityVector(Vektor v) {}
>> explode() { }
>>}
>>
>
> tja i det store hele, hvis nu alle disse objekter, havde en fælles super,
> ville metode signaturen være forenklet til
>
> hit(Dims objekt){}
>
> her kan man så definere en default interaktion, der gør det lettere
> implementere andre dimser senere. de specifikke metoder kunne være
> hjælpemetoder, der ville gøre den centrale del af koden pæn
>
Ikke forstået :-/ Hvis vi nu bare siger at vi siger at Dims er
superklasse til alle mine objekter, og min SteelBall (som selvfølgeligt
nedarver fra Dims) bliver kaldt med hit(Dime objekt), så må SteelBall
skulle opfører sig forskelligt afhængigt af hvilken udnerklasse af Dims
den er blevet kaldt med. Men medmindre man bruge instaceof() eller
lignende (som jeg har ladet mig fortælle man skal undgå), hvordan skal
hit() så kunne vide hvad den skal gøre?
>>og tilsvarende for andre klasser? Jeg synes problemet med denne
>>angrebsvinkel er trefoldig:
>>(1) Antallet af metoder i hver klasse kan blive meget stor, hvilket
>>bryder med tommelfingerreglen om 3-7 metoder pr. klasse
>>
> Kan man ikke have nogle metoder explode(), bounce(), melt() mv. og så lade
> sammenstødene resultere i en bestemt kombination af metoder?
Jo, men det ændrer ikke ved at der er mange metoder, ejheller ved at
hvis jeg tilføjer en ny Dims, så skal alle andre Dims-objekter rettes.
>
>>(2) Alle klasser skal modificeres hver gang
>>
> -derfor kunne en abstrakt superklasse sikre at alle dimser implementerede de
> samme metoder
Ja, det er så dette jeg ikke forstår. Se ovenfor.
[...]
>>
>>Jeg havde nu mere forestillet mig at traversere lister, og så kalde hver
>>klasse med en detectCollision(Iterator detectFor) eller noget i den
>>stil. Så kan hver klasse se om den støder ind i nogen objekter. Jeg kan
>>ikke lide ideen om en klasser, der kender egenskaber for *alle*
>>objekter, men det er måske bare mig? Ville den klasse ikke blive hård at
>>vedligeholde?
>>
>
> det er der sikkert, med tingene sat på spidsen, så kender den klasse der har
> listen alle dimser i dit system. Jeg ser dimserne som selvstændige tråde der
> bare bevæger sig i en retning, og i hvert "time step" fortæller big brother
> om der er nogen på det felt hvor en dims er kommet til. hvis der er, kan
> dimsen få en "offer" reference, og de kan lege sammen.
Mens det er sandt at listen kender alle objekter, så kender den kun
objekterne på et meget højt plan. Mere specielt kun til deres eksistens
indenfor listens område (Sidstnævnte af performancehensyn). Mere konkret
kender listen kun til Dimser, men ikke noget til deres interne tilstande
(position, fart, bane e.t.c.) "Listen" kan så konceptuelt kalde hvert
par af Dimser med isHit(Dims dims). Men igen, måske hører det mere
hjemmme er par-klasser?
> hvis den skal vide noget, så må det være hvor alle er, og hvis den skal vide
> meget, skal den også vide hvor dimser er på vej hen.
Det mener jeg ikke er nødvendigt, endsige ønskværdigt.
[...]
>>Jeg er bange for at
>>jeg blive nødt til at gå den hårde vej, men meget af matematikken er på
>>plads, og desuden er det min forte. Generelt vil jeg lave en rutine, der
>>givet en hastigheds og rotationsvektor og en Shape for to objekter kan
>>beregne når og hvis de støder sammen. Af performancehensyn skal alle
>>objekter nok have boundingboxes (eller måske bounding circles, det må
>>jeg tænke over)
>>
> box/polygon finten er vel også det der ses i nymodens skydespil, hvor man
> under ugunstige forhold kan stå inde i hinanden.
De spil opererer på meget anderledes præmisser; jeg tror ikke det i mit
tilfælde ville være væsentligt hurtigere. Jeg har ikke tænkt mig at
opererer med >1000 objekter, mens disse spil jo ofte arbejder med mere
end 1000 trekanter.
[...]
>>Hmmm. Jeg har svært ved at følge dig her. En par-klasse (eller her, i
>>det konkrete tilfælde, interaktionsklasser) er da ganske veldefinerede.
>> Og jeg kan ikke se hvordan en abstrakt superklasse kan implementerer
>>meget mere end de mest grunlæggende rutiner, som f.eks.
>>
> boundingbox-checket.
>
> I min simple, men rare objektorienterede verden, kan jeg ikke lide tanken om
> at man skal bruge hjælpe objekter til at udtrykke et givent fællesskab
> mellem to klasser (jeg ville foretrække en højere kobling, hvis de da har
> noget til fælles). Det kan godt være at jeg enten er for traditionel, eller
> for moderne.
Jeg synes nu at have lært at man altid skal bruge sådanne objekter hvor
man har en "mange til mange" korrespodance. Det er måske egentligt det
der er tilfældet her.
Der er jo kommet en hel lang debat ud af det her. En skam at der ikke er
flere :)
mvh. Esben
P.S: Selv om jeg kom til at cutte det tror jeg også dette kunne være
sjovt at være nogen stykker om. Men det sker jo sjældent i det private :-/
| |
Jørn Sibbern Askaa (03-06-2001)
| Kommentar Fra : Jørn Sibbern Askaa |
Dato : 03-06-01 10:38 |
|
hej igen, undskyld svartiden.
> > tja i det store hele, hvis nu alle disse objekter, havde en fælles
super,
> > ville metode signaturen være forenklet til
> >
> > hit(Dims objekt){}
> >
> > her kan man så definere en default interaktion, der gør det lettere
> > implementere andre dimser senere. de specifikke metoder kunne være
> > hjælpemetoder, der ville gøre den centrale del af koden pæn
> >
>
>
> Ikke forstået :-/ Hvis vi nu bare siger at vi siger at Dims er
> superklasse til alle mine objekter, og min SteelBall (som selvfølgeligt
> nedarver fra Dims) bliver kaldt med hit(Dime objekt), så må SteelBall
> skulle opfører sig forskelligt afhængigt af hvilken udnerklasse af Dims
> den er blevet kaldt med. Men medmindre man bruge instaceof() eller
> lignende (som jeg har ladet mig fortælle man skal undgå), hvordan skal
> hit() så kunne vide hvad den skal gøre?
>
ja, alle subklasser af Dims, skal implementere metoden hit(Dims d){...}
-og dermed overskrive en eventuel default metode i superklassen.
abstract class Dims
{
public abstract String getType();
public void hit(Dims d)
{
if (dims.getType().equals(SteelBall))
{
...hvad nu end der ville være interessant
}
else if(hoppebold)
else
{
default metode, evt fuldstændig elastisk. eller lign
-sikrer at nye objekter har en adfærd til at starte med
}
}//end hit
}//end class
hvis alle obj implementerer denne klasse ligger hele systemets adfærd ved
kollision i en klasse, som alle skal nedarve fra for at være med i legen.
eventuel reaktion i den klasse der kalder hit(), kan gives med returtypen.
(som simpel type, der signalerer hvad gerningsmanden gør efterfølgende eller
et obj der pakker alle bevægelses attributter ind.)
Jeg kan heller ikke lide instanceof(), men det er mest fordi at det
medfølgende objekt kan være alt fra en JTable til et Class objekt. Med
klassen Dims, sikrer man sig at der ikke kan komme "Fremmede" objekter til.
Så kan jeg klare min egen getType(), der viser mig hvad der er med som
parameter.
>
>
> Mens det er sandt at listen kender alle objekter, så kender den kun
> objekterne på et meget højt plan. Mere specielt kun til deres eksistens
> indenfor listens område (Sidstnævnte af performancehensyn). Mere konkret
> kender listen kun til Dimser, men ikke noget til deres interne tilstande
> (position, fart, bane e.t.c.) "Listen" kan så konceptuelt kalde hvert
> par af Dimser med isHit(Dims dims). Men igen, måske hører det mere
> hjemmme er par-klasser?
Med denne meget lave kobling kommer der bare et meget stort antal metodekald
i hele systemet, hvor en stor del af kaldene ef overføldige. Om dette er en
stor ulempe ved jeg ikke. Det lyder til at virke.
> Jeg synes nu at have lært at man altid skal bruge sådanne objekter hvor
> man har en "mange til mange" korrespodance. Det er måske egentligt det
> der er tilfældet her.
Det har jeg ikke lært, men dermed ikke sagt at det er forkert, men jeg har
lavet relationsklasser en gang, og det faldt ikke udpræget i min lærers
smag, nærmest tværtimod...
(Ivar Jacobson inspireret lærer)
>
> Der er jo kommet en hel lang debat ud af det her. En skam at der ikke er
> flere :)
ja
Kom an skabs-systemudviklere, vi ved i er der!!!!
> P.S: Selv om jeg kom til at cutte det tror jeg også dette kunne være
> sjovt at være nogen stykker om. Men det sker jo sjældent i det private :-/
måske en slags sommerseminar for systemudviklere, eller hvordan?
Hav det pænt, og god fornøjelse.
hilsen Jørn
| |
Esben Mose Hansen (04-06-2001)
| Kommentar Fra : Esben Mose Hansen |
Dato : 04-06-01 09:32 |
|
Jørn Sibbern Askaa wrote:
> hej igen, undskyld svartiden.
>
>
[...]
>>Ikke forstået :-/ Hvis vi nu bare siger at vi siger at Dims er
>>superklasse til alle mine objekter, og min SteelBall (som selvfølgeligt
>>nedarver fra Dims) bliver kaldt med hit(Dime objekt), så må SteelBall
>>skulle opfører sig forskelligt afhængigt af hvilken udnerklasse af Dims
>>den er blevet kaldt med. Men medmindre man bruge instaceof() eller
>>lignende (som jeg har ladet mig fortælle man skal undgå), hvordan skal
>>hit() så kunne vide hvad den skal gøre?
>>
>>
>
> ja, alle subklasser af Dims, skal implementere metoden hit(Dims d){...}
> -og dermed overskrive en eventuel default metode i superklassen.
>
> abstract class Dims
> {
>
> public abstract String getType();
>
> public void hit(Dims d)
> {
> if (dims.getType().equals(SteelBall))
> {
> ...hvad nu end der ville være interessant
> }
>
> else if(hoppebold)
>
> else
> {
> default metode, evt fuldstændig elastisk. eller lign
> -sikrer at nye objekter har en adfærd til at starte med
> }
> }//end hit
>
>
> }//end class
>
> hvis alle obj implementerer denne klasse ligger hele systemets adfærd ved
> kollision i en klasse, som alle skal nedarve fra for at være med i legen.
> eventuel reaktion i den klasse der kalder hit(), kan gives med returtypen.
> (som simpel type, der signalerer hvad gerningsmanden gør efterfølgende eller
> et obj der pakker alle bevægelses attributter ind.)
Det er faktisk en god ide. Jeg kan godt lide ideen med getType(). På den
måde kan man have en switch (getType()) {...}, hvilket ville være
hurtigt og effektivt. Lad mig straks starte forte :) Jeg kan endda
defaulte til et fuldstændigt elastisk stød (f.eks.)
> Jeg kan heller ikke lide instanceof(), men det er mest fordi at det
> medfølgende objekt kan være alt fra en JTable til et Class objekt. Med
> klassen Dims, sikrer man sig at der ikke kan komme "Fremmede" objekter til.
> Så kan jeg klare min egen getType(), der viser mig hvad der er med som
> parameter.
Ja, det er en god ide.
>>Mens det er sandt at listen kender alle objekter, så kender den kun
>>objekterne på et meget højt plan. Mere specielt kun til deres eksistens
>>indenfor listens område (Sidstnævnte af performancehensyn). Mere konkret
>>kender listen kun til Dimser, men ikke noget til deres interne tilstande
>>(position, fart, bane e.t.c.) "Listen" kan så konceptuelt kalde hvert
>>par af Dimser med isHit(Dims dims). Men igen, måske hører det mere
>>hjemmme er par-klasser?
>>
>
> Med denne meget lave kobling kommer der bare et meget stort antal metodekald
> i hele systemet, hvor en stor del af kaldene ef overføldige. Om dette er en
> stor ulempe ved jeg ikke. Det lyder til at virke.
Antallet af metodekald er egentligt ikke større. Hvis vi nu for
simpelthedens skyld siger at listen inkluderer alle n objekter ville det
medfører (n-1)*n/2 kald. Hvis vi har et stort objekt der kender alle
objekterne skal den udfører lige så mange tests. Det kan man så forbedre
ved at dele listen op i flere områder.
!-----+-----!
! a ! b !
!-----+-----!
! c ! d !
!-----+-----!
Der er så lidt fnadder med objekter der lapper ind i flere lister, men
jeg tror det lettest løses ved at sætte objekterne i begge lister. I så
fald bliver antallet af test (best case)
((n-1)*n/2)/4+4.
idet hvert objekt kun skal testes med en 1/4 del af objekterne. Til
gengæld er der fire ekstra tests (mod indelingen. I virkeligheden
overdriver jeg lidt her, men skidt nu med det.) Worst case er
selvfølgeligt at alle ligge i krydset, hvorved vi får alt for mange
tests. Jeg vil se på hvor tit det sker før jeg gør noget ved det :)
>>Jeg synes nu at have lært at man altid skal bruge sådanne objekter hvor
>>man har en "mange til mange" korrespodance. Det er måske egentligt det
>>der er tilfældet her.
>>
> Det har jeg ikke lært, men dermed ikke sagt at det er forkert, men jeg har
> lavet relationsklasser en gang, og det faldt ikke udpræget i min lærers
> smag, nærmest tværtimod...
> (Ivar Jacobson inspireret lærer)
Tjah. Det kommer nok an på situationen. Men mon dog man ønsker en
situation, hvor objekter fra to klasser alle skal holde på en liste af
objekter fra en den anden klasse? Der vil en relationsklasse nok være at
foiretrække... (jeg kan ikke huske hvad vores instruktør hed (det var et
kursus). Jeg er matematiker og ikke datalog, så jeg har først lært teori
efter studiet.)
> måske en slags sommerseminar for systemudviklere, eller hvordan?
> Hav det pænt, og god fornøjelse.
tak og i lige måde.
| |
Jonas Kongslund (27-05-2001)
| Kommentar Fra : Jonas Kongslund |
Dato : 27-05-01 18:04 |
|
Esben Mose Hansen wrote:
> Lad os forestille os at vi har et program med en masse tingester, der
> flyver rundt og ramler ind i hinanden. Det man er interesseret i er at
> simulerer resultatet af disse sammenstød på en realistisk måde.
Hvad skal der ske hvis to objekter støder sammen?
--
Jonas Kongslund, http://kongslund.dk
| |
Esben Mose Hansen (27-05-2001)
| Kommentar Fra : Esben Mose Hansen |
Dato : 27-05-01 19:00 |
|
Jonas Kongslund wrote:
> Esben Mose Hansen wrote:
>
>>Lad os forestille os at vi har et program med en masse tingester, der
>>flyver rundt og ramler ind i hinanden. Det man er interesseret i er at
>>simulerer resultatet af disse sammenstød på en realistisk måde.
>>
>
> Hvad skal der ske hvis to objekter støder sammen?
>
Der er mange muligheder, men man kunne forestille sig flere ting:
*fuldstændig elastisk stød* --- begge objekter får tilført en
hastighedsvektor vinkelret på sammenstødspunktet-
*fuldstændig uelastisk stød* --- objekterne hænger sammen, fortsætter
med samme hastighed
*eksplosion* --- det ene eller begge objeter splittes i flere dele, hvis
nye hastighed bliver fundet på en mere eller mindre tilfældig måde.
Find selv på flere Det er jeg prøver at illustrere er mere et
"pattern" end en konkret problemstilling. Selvom jeg idag bare er
interesseret i fuldstændig elastiske stød, kunne jeg godt tænke mig i
fremtiden at uvide det med en eller flere af ovenstående --- og måske
med noget jeg slet ikke har tænkt på endnu.
mvh. Esben
P.S: Tak for interessen!
| |
Jonas Kongslund (28-05-2001)
| Kommentar Fra : Jonas Kongslund |
Dato : 28-05-01 07:07 |
|
Esben Mose Hansen wrote:
> Der er mange muligheder, men man kunne forestille sig flere ting:
> *fuldstændig elastisk stød* --- begge objekter får tilført en
> hastighedsvektor vinkelret på sammenstødspunktet-
>
[...snip...]
Kan man forvente at det system, du ønsker at lave har et fast antal
hændelsestyper (f.eks. fuldstændig elastisk stød)?
Opførslen for to objekter, der støder sammen er dermed afhængig af to
ting:
- hændelsestypen
- objekternes type
Den sidste faktor er træls idet man bliver nødt til at give systemet
informationer for hver mulig kombination af objekttyper, men man kommer
ikke uden om det. To mulige måder, som du selv foreslog, er enten at
lægge informationerne i det enkelte objekt eller lave parklasser. Første
løsningsmulighed giver en stærk kobling, som gør systemet svært at
udvide, mens den anden også bidrager med en masse ekstra klasser.
Hvis den enkelte hændelsestype kan laves tilstrækkelig generel, så må
det være muligt at parametrisere den med regler for de
tilstandsændringer der skal ske, såfremt to objekter af type t1 og t2
støder sammen. Dermed kan du lagre reglerne for hver hændelsestype i en
matrix, hvilket vil gøre udvidelse af systemet mere smertefrit.
--
Jonas Kongslund
| |
Esben Mose Hansen (28-05-2001)
| Kommentar Fra : Esben Mose Hansen |
Dato : 28-05-01 20:30 |
|
Jonas Kongslund wrote:
> Esben Mose Hansen wrote:
>
>>Der er mange muligheder, men man kunne forestille sig flere ting:
>>*fuldstændig elastisk stød* --- begge objekter får tilført en
>>hastighedsvektor vinkelret på sammenstødspunktet-
>>
>>
> [...snip...]
>
> Kan man forvente at det system, du ønsker at lave har et fast antal
> hændelsestyper (f.eks. fuldstændig elastisk stød)?
Lidt enkere end det, endda, fordi jeg forestille mig at to objekters
sammenstød altid giver samme hændelse, i.e. der findes en afbildning af
ObjekttyperxObjektyper->Hændelser.
> Opførslen for to objekter, der støder sammen er dermed afhængig af to
> ting:
> - hændelsestypen
> - objekternes type
Det er lidt mere generalt, men ja.
> Den sidste faktor er træls idet man bliver nødt til at give systemet
> informationer for hver mulig kombination af objekttyper, men man kommer
> ikke uden om det. To mulige måder, som du selv foreslog, er enten at
> lægge informationerne i det enkelte objekt eller lave parklasser. Første
> løsningsmulighed giver en stærk kobling, som gør systemet svært at
> udvide, mens den anden også bidrager med en masse ekstra klasser.
Det var også min konklusion. Jeg håber nogen giver mig uret :)
> Hvis den enkelte hændelsestype kan laves tilstrækkelig generel, så må
> det være muligt at parametrisere den med regler for de
> tilstandsændringer der skal ske, såfremt to objekter af type t1 og t2
> støder sammen. Dermed kan du lagre reglerne for hver hændelsestype i en
> matrix, hvilket vil gøre udvidelse af systemet mere smertefrit.
Jeg det ville jeg kunne gøre, og det bliver nok sådan det komme til at
ske. Men man drømmer jo altid om at finde den perfekte løsning
1000 tak for råd&vejledning!
mvh. Esben
| |
Niels Ull Harremoës (05-06-2001)
| Kommentar Fra : Niels Ull Harremoës |
Dato : 05-06-01 13:32 |
|
"Esben Mose Hansen" <esbenSLETMIG@oek.dk> skrev i en meddelelse
news:3B12A73F.9030904@oek.dk...
> Jonas Kongslund wrote:
>
> > Esben Mose Hansen wrote:
> >
> >>Der er mange muligheder, men man kunne forestille sig flere ting:
> >>*fuldstændig elastisk stød* --- begge objekter får tilført en
> >>hastighedsvektor vinkelret på sammenstødspunktet-
> >>
> >>
> > [...snip...]
> >
> > Kan man forvente at det system, du ønsker at lave har et fast antal
> > hændelsestyper (f.eks. fuldstændig elastisk stød)?
>
>
> Lidt enkere end det, endda, fordi jeg forestille mig at to objekters
> sammenstød altid giver samme hændelse, i.e. der findes en afbildning af
> ObjekttyperxObjektyper->Hændelser.
>
>
> > Opførslen for to objekter, der støder sammen er dermed afhængig af to
> > ting:
> > - hændelsestypen
> > - objekternes type
>
>
> Det er lidt mere generalt, men ja.
>
>
> > Den sidste faktor er træls idet man bliver nødt til at give systemet
> > informationer for hver mulig kombination af objekttyper, men man kommer
> > ikke uden om det. To mulige måder, som du selv foreslog, er enten at
> > lægge informationerne i det enkelte objekt eller lave parklasser. Første
> > løsningsmulighed giver en stærk kobling, som gør systemet svært at
> > udvide, mens den anden også bidrager med en masse ekstra klasser.
>
>
> Det var også min konklusion. Jeg håber nogen giver mig uret :)
>
>
> > Hvis den enkelte hændelsestype kan laves tilstrækkelig generel, så må
> > det være muligt at parametrisere den med regler for de
> > tilstandsændringer der skal ske, såfremt to objekter af type t1 og t2
> > støder sammen. Dermed kan du lagre reglerne for hver hændelsestype i en
> > matrix, hvilket vil gøre udvidelse af systemet mere smertefrit.
Problemet kommer jo når det skal være generelt - dvs når du ikke vil lave
alt for meget ekstra fordi du indfører en GummiBoldMedGlimmer underklasse
til klassen GummiBold, og det i øvrigt ikke påvirker kollisionen.
Antag vi har klassehierarkier Dims->A->AA og Dims->B->BB
Når nu en AA og en BB støder sammen, skal vi altså lede efter mapninger for
AA + BB, A + BB, Dims + BB, AA + B, AA + Dims, A + B, A + Dims, Dims + B og
Dims + Dims
Og det er jo ikke oplagt hvad der er den "bedste match" - er det A + BB
eller AA + B? Vi ønsker vel atlid at der vælges
ens og at valget ikke afhænger af hvad der kommer først. Sagt på en anden
måde: mapning(X,Y) == Mapning(Y,X) for alle X og Y.
En simpel måde at løse det på ville være at lave en hashtabel, der brugte
et sorteret par af klasser som index og gav en hændelse som resultat - men
det løser stadig ikke problemet med hvordan man vælger hvilken rækkefølge
kombinationerne af forældreklasser skal gennemløbes. Desuden er det vel ret
meget overhead.
God fornøjelse
Niels Harremoës
| |
Esben Mose Hansen (05-06-2001)
| Kommentar Fra : Esben Mose Hansen |
Dato : 05-06-01 16:58 |
|
Niels Ull Harremoës wrote:
>>>Den sidste faktor er træls idet man bliver nødt til at give systemet
>>>informationer for hver mulig kombination af objekttyper, men man kommer
>>>ikke uden om det. To mulige måder, som du selv foreslog, er enten at
>>>lægge informationerne i det enkelte objekt eller lave parklasser. Første
>>>løsningsmulighed giver en stærk kobling, som gør systemet svært at
>>>udvide, mens den anden også bidrager med en masse ekstra klasser.
>>>
>>Det var også min konklusion. Jeg håber nogen giver mig uret :)
>>
>>>Hvis den enkelte hændelsestype kan laves tilstrækkelig generel, så må
>>>det være muligt at parametrisere den med regler for de
>>>tilstandsændringer der skal ske, såfremt to objekter af type t1 og t2
>>>støder sammen. Dermed kan du lagre reglerne for hver hændelsestype i en
>>>matrix, hvilket vil gøre udvidelse af systemet mere smertefrit.
>>>
>
> Problemet kommer jo når det skal være generelt - dvs når du ikke vil lave
> alt for meget ekstra fordi du indfører en GummiBoldMedGlimmer underklasse
> til klassen GummiBold, og det i øvrigt ikke påvirker kollisionen.
Det ville være rart, ja.
>
> Antag vi har klassehierarkier Dims->A->AA og Dims->B->BB
> Når nu en AA og en BB støder sammen, skal vi altså lede efter mapninger for
> AA + BB, A + BB, Dims + BB, AA + B, AA + Dims, A + B, A + Dims, Dims + B og
> Dims + Dims
>
> Og det er jo ikke oplagt hvad der er den "bedste match" - er det A + BB
> eller AA + B? Vi ønsker vel atlid at der vælges
> ens og at valget ikke afhænger af hvad der kommer først. Sagt på en anden
> måde: mapning(X,Y) == Mapning(Y,X) for alle X og Y.
>
> En simpel måde at løse det på ville være at lave en hashtabel, der brugte
> et sorteret par af klasser som index og gav en hændelse som resultat - men
> det løser stadig ikke problemet med hvordan man vælger hvilken rækkefølge
> kombinationerne af forældreklasser skal gennemløbes. Desuden er det vel ret
> meget overhead.
>
Overhead'en til "hits" i ovennævnte problem er selvfølgelig lille, men
uacceptable i "collisiondetection". Men det er da en idet at bruge en
hashtable. Noget at tænke over, i hvert fald. Ang. hvilke man vælger kan
man jo sige, at man altid vælger det yderste led i
nedarvningshierakiet. Ang. symmetri mapning(X,Y)=mapning(Y,X) kunne man
vel blot lave tabellen symmetrisk. For at opsummere ville tabellen
opfylde symmetri egenskaben samt at mapning er en afbildning af en
produktmængde. (og altså ikke en delmængde af en produktmængde.)
Dette kunne man klarer ved at erklærer en getKey() metode i klaasen
Dims. Hvis man vil med i hashtabellen må man implementere denne metode,
ellers nedarver man bare. Så må man så bare spørge først den ene part i
et par af Dims'er om denne har en metode til at håndtere intekraktionen
(hit, f.eks.). Hvis den ene part ikke har må man spørge den anden. Hvis
denne part heller ikke har smider man en exception, defaulter eller hvad
man nu kan finde på. Man kunne f.eks. vandrer opad i nedarvninghierakiet.
Det synes jeg faktisk er den bedste løsning endnu! Det begynder at
ligne noget
Tak for iput!
/
mvh. Esben
| |
Thomas Jespersen (27-05-2001)
| Kommentar Fra : Thomas Jespersen |
Dato : 27-05-01 19:35 |
| | |
|
|