Qual è il miglior design per l'implementazione del callback in C ++?

7

Ho una classe "Parent". La classe "Parent" crea un oggetto di classe "Child" nel mio modulo CPP. Il caso d'uso è "Child" deve richiedere alcune informazioni da "Parent". Questo può essere fatto in diversi modi e posso pensare ai seguenti progetti.

1) Memorizza il puntatore / riferimento dell'oggetto "Parent" in "Child" e lascia che "Child" chiami un metodo pubblico di "Parent".

2) "Bambino" espone un'API per registrare i callback. "Parent" registra una funzione statica con "questo" puntatore come handle di callback. Quando "Bambino" desidera richiedere informazioni, chiamerà la funzione di richiamata registrata con l'handle di callback come uno degli argomenti. La funzione di callback assegnerà il callback all'oggetto "Parent" e otterrà le informazioni.

Qualcuno può dirmi quale è il design migliore? Inoltre vorrei sapere che esiste un design standard per questo tipo di problema?

    
posta MayurK 26.07.2016 - 12:14
fonte

3 risposte

5

Probabilmente dipende da quanto vuoi che i tuoi oggetti siano accoppiati. Ma per uno sviluppo più rapido e un codice più leggibile penso che sia preferibile il metodo 1. Basta memorizzare il riferimento al genitore come un puntatore debole (supponendo che tu usi il C ++ moderno).

Potresti fare qualche schema in cui il genitore avrebbe registrato una funzione all'interno del bambino (in questo caso preferisci chiusure e std :: function per mostrare i puntatori di funzione). Ma se questi due oggetti sono gli unici che avranno bisogno di condividere le informazioni allora non vedo alcun motivo per non dare un puntatore al genitore dell'oggetto figlio, questo è usato abbastanza spesso.

Infine, sarebbe meglio avere un flusso di dati unidirezionale se possibile. Invece di chiedere al bambino informazioni, fai in modo che il genitore lo spinga dentro. Ciò renderà l'interfaccia più leggibile e sicura (perché i genitori sanno sempre se è sicuro inviare dati ma il bambino potrebbe non essere a conoscenza dello stato del genitore). Inoltre, rende più semplice avere tutti i dati passati come valori costanti.

    
risposta data 26.07.2016 - 13:16
fonte
2

Il puntatore al genitore è un approccio valido. Ma è una soluzione molto specifica che sarà difficile estendere.

Un approccio migliore potrebbe essere quello di implementare il schema di progettazione degli osservatori . Ci sono molti esempi su come farlo; per iniziare con il GoF libro di riferimento o qui . Questa è in effetti una forma pulita generale della tua opzione 2 (genitore è osservatore, figlio è soggetto).

Se preferisci comunque l'approccio di callback, ti suggerirei di optare per un oggetti di callback .

    
risposta data 26.07.2016 - 18:56
fonte
1

Prova qualcosa orientato agli oggetti.

Passa al bambino un'interfaccia che il genitore implementa. Poiché ciò crea una struttura ciclica dei dati, è sufficiente liberare le cose nell'ordine corretto; qualcosa di cui non ci preoccupiamo in altre lingue ...

Potresti scoprire che il bambino ha bisogno solo dell'accesso al genitore (interfaccia) in determinati momenti ben noti, quindi forse puoi fornirlo come parametro per un metodo figlio piuttosto che come parametro per il costruttore.

Altrimenti, se il bambino deve rispondere ai cambiamenti nel genitore, considera il osservatore modello.

    
risposta data 26.07.2016 - 18:17
fonte

Leggi altre domande sui tag