Una funzione che prende dimensioni / coordinate dovrebbe prenderle come parametri multipli o un oggetto? [duplicare]

0

Penso principalmente alle coordinate x, y, ma suppongo che le coordinate 3D e superiori si applichino anche.

Diciamo che sto scrivendo una funzione per restituire il centro di un rettangolo data la sua larghezza e altezza. Qual è il più logicamente corretto di

center(width, height) {
    return {
        x: width / 2,
        y: height / 2
    };
}

e

center(dimensions) {
    return {
        x: dimensions.width / 2,
        y: dimensions.height / 2
    };
}

So che in realtà entrambi i modi andrebbero bene ... ma logicamente, le coordinate o le dimensioni dovrebbero essere considerate come un elemento o più?

    
posta clb 01.08.2017 - 12:13
fonte

3 risposte

5

È meglio raggrupparli in oggetti. In questo modo, devi solo preoccuparti della struttura interna quando desideri accedere a uno dei campi. Confronta questo:

dimensions = someArea.calculateDimensions();
theCenter = center(dimensions.width, dimensions.height);
someObject.moveTo(theCenter.x, theCenter.y);

A questo:

someObject.moveTo(center(someArea.calculateDimensions()));

La seconda versione:

  • Funziona in 2D e 3D.
  • Non interessa se i nomi dei campi sono x, y o top, left (nota il diverso ordine), width, height o w, h o altro.
  • Molto più semplice.

Un altro vantaggio dell'utilizzo di oggetti è che non è possibile trattare accidentalmente, ad esempio, le coordinate come dimensioni. Devi farlo in modo esplicito. Questo può prevenire ogni sorta di bug logici strani ...

    
risposta data 01.08.2017 - 16:38
fonte
1

Se usi l'aritmetica vettoriale o l'algebra vettoriale, il tuo tipo di dati renderà la conversione dalla matematica al codice molto più semplice se impacchetti le coordinate. Vector aritmetica o algebra usa il vettore o il punto come una singola unità.

    
risposta data 03.08.2017 - 21:25
fonte
0

Se hai il codice esistente, segui la sua convenzione. Quale potrebbe essere un guazzabuglio, cioè supportare entrambe le opzioni .

A proposito, c'è spesso una terza opzione ragionevole, se l'ordine è "ovvio", come le coordinate cartesiane, per passare un array di coordinate. Quindi potresti fare (pseudocodice)

center(dimensions) {
  float c = new float(dimensions.length);
  for (int i = 0; i < dimensions.length; i++)
    c[i] = dimensions[i] / 2;
  return c;
}
    
risposta data 01.08.2017 - 20:06
fonte

Leggi altre domande sui tag