Esiste un modo per utilizzare le tecniche RAII in COM?

4

Sono preso tra due modelli concettuali su come costruire oggetti, e sto avendo problemi a capire quale standard voglio adottare.

Preferisco programmare in .NET e spesso provo a usare RAII e le proprietà di sola lettura per creare oggetti immutabili con i loro dati passati attraverso i parametri del costruttore. Questo è stato un grande passo avanti rispetto ai giorni VB6 in cui dovevamo simulare i costruttori e per convenzione chiamare "Init" o "Factory.Create" per ottenere oggetti in buono stato.

Tuttavia, faccio spesso wrapper COM-callable per permettermi di chiamare le funzioni tramite l'automazione da altre applicazioni. Come probabilmente sapete, COM vuole che gli oggetti abbiano un costruttore senza parametri. Questa è una dissonanza con lo schema RAI / immutabile che ho usato con tale successo nel mondo .NET.

Ricordo modelli di oggetti più vecchi come ADO in cui di solito istanziate un oggetto, impostate proprietà come ConnectionString, quindi chiamate Open. L'oggetto potrebbe essere immutabile non tramite una dichiarazione ReadOnly, ma lanciando un'eccezione "Can not change while open" sul setter della proprietà.

È questo il modello migliore da utilizzare per COM? Mi sto perdendo un modo migliore per dare una pelle a questo gatto? Dato che RAII è uscito dalla comunità C ++, come gestiscono la COM basandosi su un diverso schema di inizializzazione?

    
posta Mike 24.07.2014 - 17:20
fonte

1 risposta

5

RAII non significa necessariamente che tu abbia un oggetto pienamente funzionante. Significa che hai un oggetto completamente costruito pronto a funzionare. Quindi se il tuo oggetto ha bisogno di una chiamata di inizializzazione per impostare il suo stato, va bene - non ha nulla a che fare con RAII che ti assicura un oggetto che è possibile riempire con stato (cioè non costruito a metà in uno stato incerto).

Penso che sia meglio considerarlo come la differenza tra lo stato dell'applicazione e quello del sistema. cioè l'oggetto è completamente pronto per andare fino al sistema, è correttamente disposto in memoria, ecc. Quindi la tua applicazione può lavorare con esso.

Leggi questo articolo di Martin Fowler che discute la differenza tra la creazione di un oggetto e l'inizializzazione tramite il suo costruttore o successivo impostazione delle proprietà (es. inizializzazione).

. dato che non puoi creare un oggetto COM con l'impostazione di proprietà in stile costruttore, devi avvolgere la sua costruzione in un oggetto su cui hai il controllo (quindi il costruttore dell'oggetto restituisce solo un oggetto valido se il COM dipendente viene creato e inizializzato)

C ++ farebbe lo stesso genere di cose, solo il C ++ tende ad essere più preoccupato della durata della vita usando RAII (dove l'oggetto è distrutto correttamente quando esce dall'ambito) piuttosto che sull'inizializzazione. Molte persone racchiudono un oggetto COM in un puntatore intelligente (ad es. CComPtr per nominarne uno), ma questo ancora non imposta le sue proprietà come desideri. Non c'è ancora nulla che ti impedisca di avvolgere ulteriormente il puntatore intelligente con un costruttore che fa tutto.

    
risposta data 24.07.2014 - 17:55
fonte

Leggi altre domande sui tag