Domanda

Un'API dovrebbe fornire Rect :: contiene (Point) o Point :: is_inside (Rect) o entrambi? o Math :: contiene (Point, Rect) perché è simmetrico?

Lo stesso Q vale per LineSegment :: contiene (Point), Rect :: fully_contains (Circle) ecc.

È stato utile?

Soluzione

Rect :: contiene (Point) ha molto senso in quanto è un blocco predefinito. L'altro non è davvero necessario poiché ci si aspetterebbe che ogni forma specifica attui l'operazione, mentre il Point non deve conoscere ogni possibile forma. La stessa risposta vale per LineSegment .

Per quanto riguarda la relazione tra Circle e Rect è più complicato utilizzare la maggior parte dei framework orientati agli oggetti e non ha una risposta definitiva. Alcuni altri stili di oggetti orientati agli oggetti come CLOS lo fanno usando funzioni e metodi generici che lo rendono una domanda.

Altri suggerimenti

Dipende interamente da ciò che rende l'espressione del tuo programma più pulita, più allineata con il problema che stai cercando di risolvere. Quindi, in una certa misura, tutto quanto sopra dovrebbe andare bene in contesti diversi.

Tuttavia, in generale, sono leggermente inclinato a favore di Rect :: contiene (Point) piuttosto che Point :: Is_inside (Rect) . Questo perché penso che la classe Point , poiché sarebbe utilizzata da tutti i tipi di classi (come un 'Cerchio', 'Esagono' ecc.) Dovrebbe essere molto semplice e contenere solo l'interfaccia minima.

Math :: contiene (Rect, Point) sarebbe la mia seconda scelta. Userei questo approccio, se volessi mantenere la mia classe Rectangle molto primitiva e non aggiungere troppo "convenienza" funzioni ad esso.

Una cosa importante da ricordare è, non considerare il design delle tue lezioni come scritto in pietra. Vai avanti e scegli il design che sembra migliore ora . Ogni volta che cambiano le tue esigenze, puoi e dovresti modificarlo. Questo è ciò che viene chiamato refactoring .

Sono con Federico sull'approccio Math :: contiene, anche se secondo me il più grande svantaggio è che lo sviluppatore perde la rilevabilità di IntelliSense nel trovare il metodo. Questa è una delle mie carni bovine con Boost e STL.

Un esempio di dove Rect :: contiene alla fine va storto è il metodo dell'SDK di iPhone per disegnare stringhe, che è fondamentalmente String :: drawInRect.

Dipende dall'implementazione, ma come Federick tenderei anche a Matematica :: contiene (Retto, Punto) , oltre a Retto :: contiene (Punto) . La ragione di ciò è che quest'ultima porta a una gerarchia di oggetti che include la funzione membro contiene come virtuale, che viene sostituita da una classe all'altra. Questo può avere un sovraccarico potenzialmente significativo in cui hai a che fare con un numero molto grande di rettangoli e primitive simili.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top