Domanda

è accettabile / buona norma utilizzare il pattern metodo concatenamento sugli oggetti di valore (come, restituendo un nuovo oggetto invece di questo)? ci sono casi fuori là dove questa soluzione viene implementata?

Non riesco a pensare a nessun svantaggi, ma mi piacerebbe sentire il vostro punto.

È stato utile?

Soluzione

Conclusione:. Questa pratica è del tutto accettabile

Credo che questo è in genere quello che si verifica quando si dispone di un oggetto immutabile. Invece di mutare l'oggetto originale, uno nuovo è stato creato con il valore dato e restituito. Gli argomenti a favore e contro facendo questo con metodo di concatenamento sono più o meno lo stesso che utilizzare mutevole vs. oggetti immutabili.

L'unica preoccupazione che avrei è che questo concetto viene chiarito ai chiamanti della classe - non possono dipendere da uguaglianza identità con l'oggetto incatenato e deve essere messo in chiaro la chiamata non cambia l'oggetto originale. Anche se fossero effettivamente concatenamento chiamate, non sarebbero assegnano gli oggetti intermedi, quindi non ci sarebbe molto di un rischio di questo. Quello che è importante è che solo usare l'ultimo oggetto nella catena metodo.

Per usare java.lang.String come un esempio, un cliente della stringa fare questo:

myString.trim().replace("a", "b").substring(3, 9);

... non significa niente, e generalmente indica programmatore malinteso. Quello che dovrebbe essere facendo è questo:

String myNewString = myString.trim().replace("a", "b").substring(3, 9);

... e quindi utilizzando myNewString nelle operazioni successive. È interessante notare che lo strumento di analisi statica per Java, Findbugs, in grado di rilevare le istanze di questo malinteso, e riferire come una probabile bug.

comprensione del cliente è il caso principale. Altri svantaggi includono se l'oggetto valore è molto costoso creare, facendo uno nuovo per ogni catena sarà un calo di prestazioni. Si dovrebbe essere in grado di dire dal proprio scenario, se questo è probabile che sia un problema. In questo caso, invece di creare un nuovo oggetto per ogni catena di metodo, si consiglia di implementare il builder.

Oltre a quelli, non riesco a pensare a tutte le altre questioni.

Altri suggerimenti

Sì, questa è una perfetta buona cosa da fare. Esempi:

  • String in Java e .NET
  • DateTime e TimeSpan in .NET
  • Molti tipi di Joda Tempo e Noda tempo
  • Liste di linguaggi funzionali, come F #

Per i tipi di riferimento che sono attuate come oggetti di valore immutabili, l'inconveniente può essere a volte che si finisce per generare un sacco di immondizia. In entrambi i casi si possono finire con un sacco di copia in corso - dipende dalla situazione esatta anche se

.

Un sacco di classi Java forniscono oggetti di valore immutabili. java.lang.String, java.math.BigInteger e java.math.BigDecimal sono oggetti di valore immutabili, i loro metodi restituiscono un nuovo oggetto. Il più grande svantaggio con esso è chi ancora non conosce che non capiscono che è immutabile e pensano di modificare l'originale.

Alcune lingue sottolineano immutabilità più di altri. In Ruby stringhe sono mutabili, e le collezioni spesso forniscono una versione che restituisce una copia e un altro che muta la copia esistente (per esempio Array # ordinamento e Array # genere!). In Clojure immutabilità è la norma.

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