Durante lo sviluppo di una classe vettoriale bidimensionale come parte di una libreria matematica, sto considerando di avere coppie di metodi statici e di istanza per motivi stilistici e di usabilità. Cioè, due funzioni equivalenti, ma una è statica & non mutante e l'altra è istante & mutante. So che non sono il primo a considerare questo problema (vedi here, ad esempio) ma non ho trovato alcuna informazione che lo indirizzi direttamente.Avere coppie di metodi statici e istanziati che eseguono le stesse attività?
A favore di avere coppie statiche e metodo esempio:
- Alcune persone preferiscono utilizzare uno o l'altro e in alcuni casi di essere in grado di scegliere rende il codice più facile da leggere.
È implicito che i metodi statici non stanno mutando quando sono forniti sia i metodi statici che quelli istanziati. Questo può rendere il codice chiamante molto più chiaro, es .:
someVector = Vector2d.add(vec1, vec2); someVector = (new Vector2d(vec1)).add(vec2); // does the same thing although more convoluted. // similarly adding directly to a vector is simpler with a mutator method. someVector.add(vec2); someVector = Vector2d.add(someVector, vec2);
Questo è particolarmente importante quando si utilizzano lunghe catene di chiamate di funzione, che è comune con i vettori.
Le operazioni sul posto possono essere più rapidamente computazionalmente rispetto alla creazione di una nuova istanza per ogni operazione. L'utente decide quando le prestazioni sono importanti. Per gli utenti di una classe Vector, le prestazioni possono essere importanti in quanto i vettori vengono spesso utilizzati in un codice computazionalmente costoso.
A favore di avere solo metodi statici o di istanza, ma non entrambi:
No significativo la ridondanza del codice. Più semplice da mantenere.
Meno ingombro. I javadoc saranno quasi la metà delle dimensioni.
Non è necessario informare gli utenti che i metodi statici non si alterano mai e che i metodi non basati su getter vengono sempre modificati.
Quanto disapprovante sta avendo coppie di metodi statici/di istanza? È usato in tutte le principali biblioteche?
Il modello "i metodi statici non mutano, i metodi di istanza" sono ampiamente conosciuti?
È vero che la progettazione di una classe apparentemente banale come un "2D Vector" pone * molte * sfide progettuali. In particolare, il compromesso tra convenienza e prestazioni (meno spazzatura) e il trade off tra l'uso "idiomatico" e cose come l'immutabilità rendono questo aspetto più difficile di quanto non sembri a prima vista. Nessuna risposta fino ad ora (se ne scrivessi una, doveva essere * lunga * ...), ma ... se hai fornito un po 'più di codice (vale a dire, l'intera classe) questo potrebbe essere adatto per http://codereview.stackexchange.com/ – Marco13
Si potrebbe argomentare che avere due metodi con nomi equivalenti, ma semantica selvaggiamente diversa, potrebbe confondere l'utente, portando a bug sottili. –