Come segnalare che una catena di metodi non dovrebbe continuare?

1

Quando esegui il concatenamento del metodo, hai metodi che restituiscono l'oggetto permettendoti di continuare la catena. Tuttavia, è necessario ottenere valori dall'oggetto in qualche modo.

Di solito ho aggiunto un metodo che restituisce un valore alla fine, ma questo complica se si aggiunge alla catena e tale metodo di ritorno potrebbe non essere più valido.

Il modo in cui lo visualizzo ogni volta che aggiungi un metodo su una catena stai perfezionando il risultato finché non ottieni la risposta desiderata nell'ultima chiamata al metodo. Avere un metodo di output finale crea una restrizione in quanto è necessario conoscere l'ultima operazione per sapere come visualizzare il risultato.

Forse hai un metodo che si traduce in una stringa e uno che si traduce in un array il tuo metodo di output deve affrontare entrambi i casi. Cosa succede se si aggiunge un metodo che memorizza il risultato della stringa da qualche parte nuovo? Ora devi aggiornare il metodo di output per gestire anche quel caso.

C'è un modo per far sapere a un metodo che è l'ultimo della catena, quindi dovresti produrre il risultato?

    
posta drawde83 13.09.2014 - 01:29
fonte

3 risposte

3

Ottieni i valori dall'oggetto restituito nel solito modo.

var result = myObject.SomeProperty;

Per tecniche di concatenamento estese, i metodi concatenati spesso restituiscono un risultato conforme a una particolare interfaccia. Ad esempio, la maggior parte dei metodi Linq in .NET Framework restituiscono un risultato conforme a IEnumerable<T> o IQueryable<T> (vale a dire una raccolta generica).

    
risposta data 13.09.2014 - 02:00
fonte
2

Il concatenamento dei metodi non è tanto una tecnica quanto un utile bit di zucchero sintattico, ei dettagli dipendono generalmente dalla semantica che si desidera fornire.

Un metodo comune è per ciascun metodo di mutare l'oggetto e restituire this ; ad esempio, new Person().setName(name).setRank(rank).setSerialNumber(serialNumber) . Con questo approccio, non è necessario sapere quale sia il "ultimo" metodo, perché puoi terminare la catena in qualsiasi punto e avere ancora lo stesso oggetto Person .

Un altro approccio comune consiste nell'avere un oggetto " builder " mutevole dedicato che consente di applicare il concatenamento del metodo per modificare il builder , prima di chiamare definitivamente un metodo build per creare un oggetto immutabile; ad esempio, new StringBuilder().append(s1).append(s2).append(s3).toString() . Il metodo build è quindi automaticamente il metodo "last". (In realtà, questo è un caso speciale dell'approccio precedente, il vero metodo "last" era append(s3) , e poi ho chiamato toString() sull'oggetto risultato dopo aver finito di modificarlo.)

Un approccio meno comune è quello di dividere la differenza tra i due precedenti approcci: se la classe di destinazione non è completamente immutabile, ma ha alcuni requisiti per la sua configurazione iniziale, è comunque possibile utilizzare una classe di build solo per quella configurazione iniziale. Il metodo build può quindi eseguire la necessaria convalida (o delegare a un costruttore che lo fa). Ad esempio, se Person richiede name e age , allora potremmo consentire sia new PersonBuilder().setName(name).setAge(age).build().setHeight(height) che new PersonBuilder().setName(name).setAge(age).setHeight(height).build() .

    
risposta data 13.09.2014 - 03:46
fonte
0

Puoi "segnalare" che una catena di metodi non dovrebbe continuare rendendo invalido il tipo di ritorno del metodo. Questo non "produrrà" molto ma fermerà la catena del metodo. Inoltre, a seconda della tua lingua, puoi fermarla restituendo una primitiva come int. Ma ogni volta che un metodo restituisce un oggetto, che ha un metodo su di esso, la catena può continuare ad andare.

In qualsiasi linguaggio OO ciò che normalmente esce alla fine (e ad ogni passo lungo il percorso) di una catena di metodi è qualcosa chiamato "oggetto temporaneo senza nome". È senza nome solo perché non l'abbiamo assegnato a qualcosa per dargli un nome. Invece abbiamo semplicemente attaccato un punto accanto ad esso e abbiamo chiamato uno dei suoi metodi. Una volta ottenuto, otteniamo un altro "oggetto temporaneo senza nome" (che potrebbe essere esattamente lo stesso oggetto di prima in un diverso stato). Puoi incatenarti ancora e ancora fino a quando non ottieni

  • (1) il comportamento che vuoi
  • (2) il tipo di oggetto che desideri
  • (3) l'oggetto nello stato desiderato

Se il comportamento è tutto ciò che volevi, allora hai finito. Se volevi gli ultimi due, basta interrompere il concatenamento e puoi dare un nome assegnandolo a qualcosa (o semplicemente passare tutto il casino in qualcosa).

Greet.hello("world").hi("Mom");                                 // (1)
String max = Math.max(1,3).toString();                          // (2)
System.out.println( new Person().setName(name).setRank(rank) ); // (3)

Tipicamente ogni metodo in una catena è un metodo di "uscita". Ti fermi quando hai ciò di cui hai bisogno.

Inoltre, nota che questo:

Person person = new Person();
person = person.setName(name);
person = person.setRank(rank);
System.out.println(person);

fa esattamente la stessa cosa di (3). Un grande vantaggio di una catena di metodi è che non devi fermarti e dare nomi di cose che non hanno bisogno di nomi.

    
risposta data 17.09.2014 - 08:37
fonte

Leggi altre domande sui tag