Sto scrivendo lezioni che "devono essere usate in un modo specifico" (suppongo che tutte le classi debbano ...).
Ad esempio, creo la fooManager
classe, che richiede una chiamata, per esempio, a Initialize(string,string)
. E, per spingere un po 'più in là l'esempio, la classe sarebbe inutile se non ascoltiamo la sua ThisHappened
azione.
Il mio punto è che la classe che sto scrivendo richiede chiamate di metodo. Ma si compilerà bene se non si chiamano questi metodi e finirà con un nuovo FooManager vuoto. Ad un certo punto, o non funzionerà, o forse andrà in crash, a seconda della classe e di ciò che fa. Il programmatore che implementa la mia classe ovviamente guarderebbe al suo interno e realizzerebbe "Oh, non ho chiamato Initialize!", E andrebbe bene.
Ma non mi piace. Ciò che vorrei idealmente è che il codice NON venga compilato se il metodo non è stato chiamato; Immagino che semplicemente non sia possibile. O qualcosa che sarebbe immediatamente visibile e chiaro.
Mi trovo turbato dall'attuale approccio che ho qui, che è il seguente:
Aggiungi un valore booleano privato nella classe e controlla ovunque sia necessario se la classe è inizializzata; in caso contrario, lancerò un'eccezione dicendo "La classe non è stata inizializzata, sei sicuro di chiamare .Initialize(string,string)
?".
Sono un po 'd'accordo con questo approccio, ma porta a un sacco di codice che viene compilato e, alla fine, non è necessario per l'utente finale.
Inoltre, a volte è ancora più codice quando ci sono più metodi di un semplice da Initiliaze
chiamare. Cerco di mantenere le mie lezioni con non troppi metodi / azioni pubblici, ma questo non risolve il problema, mantenendolo ragionevole.
Quello che sto cercando qui è:
- Il mio approccio è corretto?
- Ce n'è uno migliore?
- Che cosa fate / che consigli ragazzi?
- Sto cercando di risolvere un problema? I colleghi mi hanno detto che è il programmatore a controllare la lezione prima di provare a usarla. Rispetto rispettosamente, ma credo che sia un'altra questione.
In parole povere, sto cercando di capire un modo per non dimenticare di implementare le chiamate quando quella classe viene riutilizzata in seguito, o da qualcun altro.
CHIARIMENTI:
Per chiarire molte domande qui:
Sicuramente non sto solo parlando della parte Inizializzazione di una classe, ma piuttosto è tutta la sua vita. Impedisci ai colleghi di chiamare un metodo due volte, assicurandoti di chiamare X prima di Y, ecc. Tutto ciò che finirebbe per essere obbligatorio e nella documentazione, ma che vorrei nel codice e nel modo più semplice e piccolo possibile. Mi è davvero piaciuta l'idea degli Assert, anche se sono abbastanza sicuro che dovrò mescolare alcune altre idee in quanto gli Assert non saranno sempre possibili.
Sto usando il linguaggio C #! Come non l'ho detto ?! Sono in un ambiente Xamarin e sto costruendo app mobili di solito usando circa 6-9 progetti in una soluzione, inclusi progetti PCL, iOS, Android e Windows. Sono stato uno sviluppatore per circa un anno e mezzo (scuola e lavoro insieme), quindi le mie dichiarazioni / domande a volte ridicole. Tutto ciò che probabilmente è irrilevante qui, ma troppe informazioni non è sempre una cosa negativa.
Non riesco sempre a mettere tutto ciò che è obbligatorio nel costruttore, a causa delle restrizioni della piattaforma e dell'utilizzo di Dependency Injection, con parametri diversi da Interfaces è fuori dal tavolo. O forse la mia conoscenza non è sufficiente, il che è altamente possibile. Il più delle volte non è un problema di inizializzazione, ma di più
come posso assicurarmi che si sia registrato a quell'evento?
come posso assicurarmi che non abbia dimenticato di "interrompere il processo ad un certo punto"
Qui ricordo una lezione di recupero di annunci. Finché la vista in cui l'annuncio è visibile è visibile, la classe recupera un nuovo annuncio ogni minuto. Quella classe ha bisogno di una vista quando costruita dove può visualizzare l'annuncio, che potrebbe ovviamente entrare in un parametro. Ma una volta sparita la vista, è necessario chiamare StopFetching (). Altrimenti la classe continuerebbe a recuperare annunci per una vista che non è nemmeno lì, e questo è male.
Inoltre, quella classe ha eventi che devono essere ascoltati, come ad esempio "AdClicked". Tutto funziona bene se non ascoltato, ma perdiamo il monitoraggio delle analisi lì se i tocchi non sono registrati. L'annuncio funziona comunque, quindi l'utente e lo sviluppatore non vedranno alcuna differenza e le analisi avranno solo dati errati. Deve essere evitato, ma non sono sicuro di come gli sviluppatori possano sapere che devono registrarsi all'evento tao. Questo è un esempio semplificato, ma l'idea è lì, "assicurati che usi l'azione pubblica che è disponibile" e nei momenti giusti ovviamente!
initialize
essere effettuata in ritardo dopo la creazione dell'oggetto? Il direttore sarebbe troppo "rischioso" nel senso che potrebbe generare eccezioni e spezzare la catena della creazione?
new
se l'oggetto non è pronto per essere utilizzato. Fare affidamento su un metodo di inizializzazione è destinato a tornare a perseguitarti e dovrebbe essere evitato a meno che non sia assolutamente necessario, almeno questa è la mia esperienza.