Quale approccio porterebbe a un'API più facile da usare?

0

Sto scrivendo un'API JavaScript e, per un caso particolare, mi chiedo quale approccio sia il più sexy. Facciamo un esempio: scrivendo un VideoPlayer , aggiungo un metodo getCurrentTime che dà il tempo trascorso dall'inizio.

  1. Il primo approccio dichiara semplicemente getCurrentTime come segue:

    getCurrentTime():number
    

    dove number è il tipo numero nativo . Questo approccio include un evento CURRENT_TIME_CHANGED in modo che gli utenti API possano aggiungere callback per essere al corrente delle variazioni di orario. L'ascolto di questo evento sarebbe il seguente:

    myVideoPlayer.addEventListener(CURRENT_TIME_CHANGED, function(evt){
        console.log ("current time = "+evt.getDispatcher().getCurrentTime());
    });
    
  2. Il secondo approccio dichiara getCurrentTime in modo diverso:

    getCurrentTime():CustomNumber
    

    dove CustomNumber è un oggetto numero personalizzato , non quello nativo. Questo oggetto personalizzato invia un evento VALUE_CHANGED quando il suo valore cambia, quindi non c'è bisogno dell'evento CURRENT_TIME_CHANGED ! Basta ascoltare l'oggetto restituito per le variazioni di valore! L'ascolto di questo evento sarebbe il seguente:

    myVideoPlayer.getCurrentTime().addEventListener(VALUE_CHANGED, function(evt){
        console.log ("current time = "+evt.getDispatcher().valueOf());
    });
    

    Tieni presente che CustomNumber ha un metodo valueOf che restituisce un numero nativo che consente di utilizzare l'oggetto CustomNumber restituito come numero, quindi:

    var result = myVideoPlayer.getCurrentTime()+5;
    

    funzionerà!

Quindi nel primo approccio, ascoltiamo un oggetto per un cambiamento nel valore della sua proprietà. Nella seconda ascoltiamo direttamente la proprietà per cambiare il suo valore. Ci sono più pro e contro per ogni approccio, voglio solo sapere quale degli sviluppatori preferirebbe usare!

    
posta Clem 28.05.2014 - 16:45
fonte

1 risposta

2

Vai con il primo approccio. Quando le persone usano un metodo come getCurrentTime() e memorizzano il valore restituito, si aspettano che quel valore rimarrà l'ora nel momento in cui hanno chiamato il metodo. Avere quel valore improvvisamente cambiato sarà fonte di grande confusione:

prevTime = myVideoPlayer.getCurrentTime();
//...at some later point
timeElapsed = myVideoPlayer.getCurrentTime() - prevTime;

Ora timeElapsed è 0 , che è sbagliato. Il codice corretto per tale API sarebbe:

prevTime = myVideoPlayer.getCurrentTime().valueOf();
//...at some later point
timeElapsed = myVideoPlayer.getCurrentTime() - prevTime;

Ma in questo modo è molto raro, e la maggior parte delle persone usa istintivamente il primo metodo e ottiene bug confusi.

    
risposta data 28.05.2014 - 17:09
fonte

Leggi altre domande sui tag