Avatar billede conrad Nybegynder
18. juli 2006 - 12:57 Der er 9 kommentarer og
3 løsninger

Hvad er bedst - at give object med eller alle variable i metode

Jeg har en diskussion med en kollega om hvad der er mest "rigtigt"

1. at definere metoden kun med de parametre som der skal bruges fra klassen
2. at give hele instancen med og trække parametrene ud

Vi snakker her om en metode som er specifikt skrevet til at operere på en bestemt klasse, så der er ikke nogen "reusability" fordel ved 1.

Eksempel på 1
public void doSomething(int x, int y)
{
-- do something with x and y
}

Eksempel på 2
public void doSomething(MyObject o)
{
  do something with o.x() and o.y()
}

Argumenter for 1
-tager kun de parametre som behøves -> performance ?

Argumenter for 2
- signatur skal ikke ændres når en ny værdi, fx z() skal bruges fra MyObject

Nogle (saglige) bud ?
Avatar billede mikkelbm Nybegynder
18. juli 2006 - 13:04 #1
1) Jeg tvivler på det har så meget at sige performance mæssigt. Medmindre I selvfølgelig allokerer en helvedes masse objekter.

2) Helt klart at foretrække, da man som I selv er inde på, kan ændre i MyObject og tilføje ekstra properties, som kan være relevante at gemme - uden at skulle opdatere metodekaldet.
Avatar billede arne_v Ekspert
18. juli 2006 - 13:28 #2
Jeg vil sige at svaret afhænger af dine lag. Hvis vi kigger på de 3 muligheder:

A) kaldende kode
  kaldte kode + MyObject

B) kaldende kode + MyObject
  kaldte kode

C) kaldende kode + kaldte kode + MyObject

så vil jeg sende et MyObject med over i A og C men simple argumenter i B
Avatar billede jakoba Nybegynder
19. juli 2006 - 16:32 #3
Hvis metoden er specifik for x og y værdien i MyObject klassen burde den metode vel ligge i selve MyObject klassen (eller i en extension til den).

Hvis metoden er generel og bruges på mange andre x og y værdier end dem i MyObject skal den ligge 'udenfor' MyObject og have x og y som parametre.

Hvis begge dele gælder, ville det nok være rigtigs at lave en statisk klasse til medtoden med selve udregningen (med x og y værdier) a la MATH klassen. og så desuden lave en metode i MyObject der kalder den metode på 'sine' x og y værdier.

eg:
static class Pytagoras {
    static public double hypotenuse( couble x, double y ) {
        return Math.pow( Math.pow(x,2) + Math.pow(y,2), 0.5 );
    }
    //...
}// endclass Pytagoras

class MyObject {      // Hvert MyObject objekt representerer en trekant
    double x, y;      // lænden på 2 sider i trekanten
    double v;        // vinkelen imellem de to sider( i grader )
    //...
    public double getHypotenuse() throws NotRightAngledException {
        if( math.abs( v ) != 90 ) {
            throw  new NotRightAngledException( this.toString() )
        } else {
            return Pytagoras.hypotenuse(x,y);
        }
    }
    ...
}// endclass MyObject
Avatar billede mikkelbm Nybegynder
19. juli 2006 - 18:14 #4
>> jakoba

Din filosofi holder vel ikke altid stik. Nu ved jeg ikke præcis hvad situationen er her, men hvis opgaven er at persistere nogle informationer som Mybject indeholder, skal klassen vel ikke selv have ansvaret for det?
Avatar billede nielle Nybegynder
19. juli 2006 - 18:32 #5
Umiddelbart ville jeg vurdere at 1) var hurtigere end 2) - med mindre at vi da snakker om at objektet skal transporteres over nettet.

Ved 1) bliver der oprettet nye kopier af x og y. Der skal afsættes plads i memory til dette og de skal sendes til doSomething(). Disse værdier er value-overført.

Ved 2) bliver selve objektet overført. Eller rettere sagt, det er en reference til objektet der bliver overført. Hvis man skriver til f.eks. x inde fra doSomething(), vil man efterfølgende kunne konstatere at x faktisk er ændret i selve objektet ... også når man forlader doSomething() igen. Værdien bliver reference-overført.

Da det kun er 1 reference der skal overføres vil koden på maskinniveau (bytecodeniveau) være mere effektiv end hvis det er 2 integers der skal overføres.

I praksis er det dog næppe noget som tynger på performance.
Avatar billede nielle Nybegynder
19. juli 2006 - 18:34 #6
Ud fra et rent OO-mæssigt synspunkt så vil jeg i øvrigt sige at de er 2) som er den "rigtige løsning".

Et er dog teori, og et andet er praksis ;^)
Avatar billede conrad Nybegynder
21. juli 2006 - 09:38 #7
Tak for input - det er tid til at lægge nogle svar
Avatar billede mikkelbm Nybegynder
21. juli 2006 - 17:48 #8
Der kommer et her...
Avatar billede nielle Nybegynder
21. juli 2006 - 17:51 #9
Svar :^)
Avatar billede arne_v Ekspert
22. juli 2006 - 01:11 #10
.
Avatar billede conrad Nybegynder
24. juli 2006 - 07:31 #11
Tak for inputs. Jeg har delt point lige mellem dem der har lagt svar - satser på det er ok
Avatar billede nielle Nybegynder
24. juli 2006 - 18:50 #12
Takker for point :^)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester