Come rispondere alla domanda dell'intervista: cos'è un singleton e come lo useresti? [chiuso]

StackOverflow https://stackoverflow.com/questions/815528

Domanda

Ho letto le domande su S.O. per quanto riguarda Singleton e ho appena visto un'ora di discussioni tecniche su Google. Per quanto posso dire, il consenso nel mondo OO sembra essere che i singoli siano più un anti-modello piuttosto che un utile modello di progettazione.

Detto questo, sto intervistando in questi giorni e la domanda sorge molto: che cos'è un singleton e come lo useresti?

Qual è il modo migliore per rispondere a questa domanda? Dovrei semplicemente descrivere il modello di progettazione e poi dire che l'unico uso accettabile di cui ho sentito parlare è per la registrazione e che è spesso usato male per lo stato globale?

È stato utile?

Soluzione

Tricky. Ci sono molte persone che pensano che i singoli siano essenzialmente un anti-pattern come hai detto tu (me compreso), ma ci sono anche molti che pensano che sia semplicemente un modo accettabile dalla OOP per fare i globi.

Se l'intervistatore è in quel campo, allora sì, penso che abbia torto, ma potrebbe non essere la cosa migliore da dire durante l'intervista. ;)

Quindi probabilmente proverei a essere neutrale e attenermi ai fatti. Non sai in quale campo rientra il tuo intervistatore, quindi atteniti ai fatti indiscutibili. Cosa fa un singleton? E per dimostrare l'utilizzo, attenersi ai pochi casi in cui la maggior parte delle persone può concordare sul fatto che un singleton è una risposta accettabile. O spiega la tua esperienza (dal momento che le persone non possono essere in disaccordo neanche con quello).

Ma se sei " per " o " contro " Singletons, un'intervista probabilmente non è il momento giusto per crociare per quella causa. ;)

Altri suggerimenti

Vai con la tua esperienza di utilizzo / non utilizzo. Questa è la migliore risposta ogni giorno. Se non l'hai usato, ma sai di cosa si tratta, vai avanti e dillo. Il più delle volte, è l'intervistatore che non si avventurerebbe oltre Singletons, quindi prenditi una pausa.

Finché sei pronto per una discussione, penso che la tua risposta suggerita sia buona. Ma tieni presente che alcuni di noi ritengono che i singoli siano un'idea utile. Alcuni dati hanno una portata naturalmente globale e i singoli rappresentano un modo ragionevole per sottrarre tali dati. Ovviamente puoi anche usare i singoli in ambiti più limitati, ad esempio all'interno di uno spazio dei nomi specifico, se le tue lingue supportano un tale costrutto.

Un singleton.

Per definizione è un oggetto che ha solo un'istanza nell'intera applicazione. Ciò può essere garantito rendendo privato il costruttore e fornendo un'istanza statica tramite una proprietà pubblica nella definizione dell'oggetto.

È un modello utile per la gestione di una risorsa in cui solo un oggetto può accedervi contemporaneamente.

Tuttavia ha molti compromessi. L'istanza singleton di molti ha i propri requisiti che rendono oneroso il test di qualsiasi classe che lo utilizza in quanto devono soddisfare i suoi prerequisiti e i prerequisiti della classe da testare.

Inoltre può essere un problema quando si mantiene un progetto e si tenta di modificare parte dell'astrazione. Pertanto trovo che sia meglio astrarre un singleton tramite un'interfaccia. Mantieni " singola istanza " come dettaglio di implementazione e passare l'istanza singleton come interfaccia che significa che il codice chiamante non è legato alla definizione della classe (e alla proprietà statica). Ciò semplifica il test e l'estrazione in un secondo momento a spese dell'impianto idraulico (ad es. Passandolo a Ctors o proprietà del setter).

Allo stesso modo, ricordando a tutti che il mondo esisteva prima del GoF, aggiungerò che si possono anche usare le modifiche del modello Singleton per garantire solo un'istanza per Sessione, per Discussione o per qualunque cosa. Usa semplicemente lo stato per sessione o thread o qualunque cosa per contenere l'uno per istanza.

La mia risposta:

  

Oh andiamo, non potresti trovare almeno il    seconda domanda più popolare su   questo vecchio soggetto stanco? Dovevi andare per il primo? Me ne sto andando.   l'intervista è finita.

O almeno così vorrei che fosse ...

La mia risposta sarebbe:

  

Un Singleton è un modello di progettazione che   specifica un metodo per garantire ciò   esiste solo 1 istanza di un oggetto in   tempo di esecuzione.

     

Lo userei con discrezione.

Che dire dei Singleton che non hanno uno stato? Sono in particolare cose come alcune possibili strategie concrete idempotenti nel modello di strategia, algoritmo puro, nessun dato.

O classi Java Enum, che sono Singleton. Trovo qualcosa di simile utile:

public enum StringComparator implements Comparator {

  CASE_SENSITIVE {
    int compare(Object lhs, Object rhs) {
      // check for null omitted for brevity
      return lhs.equals(rhs);
    }
  },

  CASE_INSENSITIVE {
    int compare(Object lhs, Object rhs) {
      return String.CASE_INSENSITIVE_ORDER( lhs, rhs ) ;
    }
  };

  boolean equals( Object o ) {
   return this == o ;
  }
} 

Ci sono alcuni usi in cui mi sono imbattuto. La registrazione è ovvia. Un altro è l'output della console che utilizza nCurses. Ho creato una libreria che utilizza oggetti Panel, ma ognuno aveva bisogno di comunicare con un singolo Controller che controllava cose come ordini z e simili. Un altro è un generatore di numeri casuali per un gioco. Vuoi davvero ridimensionare quel twister di mersenne in ogni funzione o passarlo ovunque?

Ma per la maggior parte, causano un cattivo design.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top