Come definire la funzione di riproduzione audio? una sola funzione per tutti i suoni? o ogni suono ha una sua funzione?

1

Dopo molti anni, non riesco ancora a determinare il modo corretto di definire una classe / funzione per riprodurre il suono. Supponiamo che la mia app abbia bisogno di riprodurre alcuni suoni, ad esempio: clic sul pulsante, popup di errore, ... Come dovrei definire la funzione?

** Metodo 1: una sola funzione per tutti i suoni **

//simulate languages features that enums are numbers
const Sound={
    BUTTON_CLICK:0,
    ERROR_POPUP:1,
};

class MyClass{
  static playSound(sound){
    switch(sound){
      case Sound.BUTTON_CLICK:
        SoundLibrary.playSound('button_click.mp3');
      break;
      case Sound.ERROR_POPUP:
        SoundLibrary.playSound('error_popup.mp3');
      break;
    }
  }
}

** Metodo 2: una funzione per ogni suono **

class MyClass{
  static playButtonClickSound(){
    SoundLibrary.playSound('button_click.mp3');
  }

  static playErrorPopupSound(){
    SoundLibrary.playSound('error_popup.mp3');
  }
}

** Metodo 3: una classe per ogni suono **

class ButtonClickSound{
  static play(){
    SoundLibrary.playSound('button_click.mp3');
  }
}

class ErrorPopupSound{
  static play(){
    SoundLibrary.playSound('error_popup.mp3');
  }
}
** Method 4: (other methods)**

Quale modo dovrei usare?

    
posta mmmaaa 20.03.2018 - 07:27
fonte

3 risposte

3

Ogni metodo ha i suoi punti di forza e di debolezza. Tuttavia, se il tuo programma non trarrà vantaggio dai punti di forza, la complessità aggiunta è ancora un punto debole.

Metodo 2

Il metodo 2, per esempio, semplificherà il tuo codice. Piuttosto che passare il parametro corretto, è sufficiente chiamare la funzione corretta. Tuttavia, ciò significa anche che se finisci per avere 100 suoni, avrai 100 metodi. Non è scalabile e, onestamente, alla fine tutti fanno la stessa cosa concettualmente. Ciò che cambia è il valore passato a SoundLibrary.playSound .

Metodo 3

Il metodo 3 non avrà una singola classe con 100 metodi, ma avrai 100 classi! Questo può essere un punto di forza se stai caricando dinamicamente la classe, ad esempio disponi di una configurazione che seleziona un elenco di classi che puntano alla classe contenente il suono da riprodurre, consentendo in effetti di modificare i suoni senza creare un'altra versione del programma. Tuttavia, questo creerà un serio disordine con molti suoni.

Metodo 1

Il Metodo 1 è il migliore dei metodi menzionati e più sensato per il chiamante, dovendo passare solo il valore enum appropriato relativo al suono da riprodurre, tuttavia si rischia ancora di avere una gigantesca istruzione switch contenente 100 casi.

Metodo 4

Considera il metodo 4:

const Sound={
    BUTTON_CLICK:"button_click.mp3",
    ERROR_POPUP:"error_popup.mp3",
};

Il valore enum ora è ora 1 a 1 associato al percorso del file del suono. Il tuo programma continua a usare i valori enum, senza dover sapere nulla sul percorso o su come giocare. Devi solo creare una singola funzione che riproduca il file audio associato associato al valore enum.

Non posso essere sicuro di quale lingua sia, ma se la tua lingua non supporta l'associazione di valori con esso, puoi comunque caricare un file di configurazione con = linee che definiscono il percorso esatto associato a ciascun enum. La funzione assegnata al compito di riprodurre il suono cercherà il percorso dell'enum e quindi chiamerà la libreria del suono con il percorso associato.

Questa soluzione è probabilmente l'ideale in qualsiasi situazione in cui potresti potenzialmente avere a che fare con un gran numero di suoni in futuro, dato che si adatta bene. Se hai a che fare con un progetto per animali con un piccolo numero di suoni, il metodo 1 probabilmente ti va bene. Altrimenti, consiglio vivamente il metodo 4.

    
risposta data 20.03.2018 - 08:49
fonte
3

Tutte e tre le soluzioni presentano numerosi problemi:

  1. Stai utilizzando un metodo statico per creare effetti collaterali,
  2. Stai accoppiando strettamente questi metodi a SoundLibrary ,
  3. Stai utilizzando "stringhe magiche" piuttosto che costanti.

Suggerirei di concentrarti sulla risoluzione di questi problemi, prima di preoccuparti di quanti metodi e classi utilizzare.

Quando li hai indirizzati, dovresti prendere in considerazione l'idea di utilizzare gli eventi per attivare i suoni, piuttosto che chiamare i metodi direttamente.

E infine, sono d'accordo con Neil: usa una struttura di dati della mappa per mappare i tuoi valori enum o nomi di eventi ai suoni, per evitare gigantesche istruzioni switch o un gran numero di metodi / classi.

    
risposta data 20.03.2018 - 10:46
fonte
2

Suggerisco di provare prima a guardarlo dalla prospettiva del consumatore che consuma piuttosto che dall'implementazione.

Che cosa vuoi che sia il client che consuma? Ad esempio,

  • Supporterai schemi sonori che possono essere modificati al volo?
  • Aggiungi nuove cose che possono creare suoni al volo?

Senza sapere cosa stai cercando di fornire sarà una risposta difficile a quale delle tue implementazioni mostrate è migliore delle altre.

Detto questo, ancora, al di là del primo approccio, le classi che stai suggerendo e i metodi statici che stai suggerendo non ci comprano molto in termini di astrazione: ammontano a packaging, che è utile, ma c'è molto di più da fare bene e amp; astrazioni utilizzabili della confezione. Queste classi nascondono i nomi dei file mp3 dal client che consuma, ma poi scambiano i codici di classe e / o i nomi dei metodi codificati.

L'enum è un modo ragionevole per identificare le cose che producono suoni se la lista è statica, il che significa che è solo modificata / aggiunta a durante lo sviluppo e non in fase di runtime.

Se hai bisogno di una funzionalità dinamica, dovrai essere in grado di distribuire chiavi diverse. Dovrai anche considerare di mappare le chiavi a testi leggibili dall'uomo per quando vuoi aiutare l'utente a cambiare il loro schema sonoro.

Concentrati prima sull'astrazione generale che vuoi che i tuoi clienti (probabilmente tu) consumino, quindi implementa quell'astrazione usando gli strumenti del linguaggio (come interfacce, classi, ecc.).

    
risposta data 20.03.2018 - 18:19
fonte

Leggi altre domande sui tag