2014-07-21 13 views
6

Sono relativamente nuovo a OOP. A volte mi imbatto in situazioni in cui non sono sicuro di dove dovrebbe andare un metodo. Proverò a dare un esempio minimo; Spero di non esagerare e di renderlo troppo astratto.Una funzione dovrebbe andare in una/entrambe le due classi o essere indipendente?

Dire che ho una classe Point che contiene la posizione di un punto e una classe Line che contiene l'equazione di una linea. Ora ho bisogno di un metodo che calcoli la distanza (perpendicolare) tra un Point e un Line. Ho potuto fare:

  • Point :: distance_to_line (linea L)
  • linea :: distance_to_point (punto P)
  • una funzione di free-standing: point_line_distance (linea L, punto P)

C'è un modo preferito in OOP in generale, o dipende dalla lingua? In C++ una funzione indipendente è un'opzione, ma dalla mia comprensione limitata di Java, non consente le funzioni free-standing. In tal caso creeresti una classe come PointLineDistanceCalculator?

+0

Se mi ponessi un tale problema, farei quanto segue. Crea file '. GeometryHelper' .h' e' .cpp' che hanno un sacco di funzioni libere. Farebbero cose come 'point_line_distance',' line_intersection', ecc. – CoryKramer

+0

Ha senso che un punto abbia dei metodi per calcolare la sua distanza da ogni singolo tipo di forma sotto il sole? Probabilmente no.Quindi dovrebbe probabilmente essere una funzione non membro, che ti permette di mantenere l'interfaccia Point semplice e pulita. E i nomi delle funzioni non devono avere nomi lunghi come 'point_line_distance', ma potrebbero semplicemente essere chiamati' distance'. – juanchopanza

+0

Purché funzionalmente identici, lo inserirò come membro della classe di linea solo per ridurre le dipendenze tra punto e linea dato che la linea ha già una dipendenza dal punto, non c'è motivo di introdurre il contrario – cppguy

risposta

4

La terza opzione di un altro posto che non è nella classe Point o Line è l'opzione migliore.

Points non dovrebbe essere a conoscenza di Lines e viceversa. Altrimenti, saranno strettamente accoppiati.

http://en.wikipedia.org/wiki/Loose_coupling

Tuttavia, non ci può essere qualche altra classe che conosce entrambi.

In java, avrei probabilmente creato una terza classe Distance o DistanceCalculator che potesse calcolare le distanze tra diversi oggetti.

Distance.between(Point a, Point b) 

Distance.between(Point a, line l) 

ecc

+0

Non è necessaria una classe, a meno che non si stia utilizzando una lingua che non ha funzioni non associate. – juanchopanza

1

in Java si può sempre creare la funzione free standing come un metodo statico di una delle due classi (o di una terza classe di supporto).

Non credo che ci sia un modo preferito in generale, ma si potrebbero avere tutti e tre per la massima flessibilità e riutilizzare il codice.

Ad esempio, un metodo terrebbe la logica:

class Point { 
... 
    float distToLine (Line l) { 
     .... 
     return some result; 
    } 
... 
} 

e quindi gli altri metodi chiamerà il metodo originale:

class Line { 
... 
    float distToPoint (Point p) { 
     return p.distToLine (this); 
    } 
... 
    static float pointToLineDistance (Point p, Line l) { 
     return p.distToLine (l); 
    } 
... 
} 
0

Una quarta opzione è quella di trovare/costruire un antenato comune nella gerarchia delle classi che potrebbe essere qualcosa come "GeometricEntity". Qualunque cosa per cui "la distanza da un'altra GeometricEntity" abbia un significato.

Problemi correlati