Design dell'oggetto in cui vengono utilizzati valori codificati per creare un'istanza di oggetti?

0

Sto creando il design per un programma di fusione tra i segnalibri del browser e mi sono imbattuto in un problema di progettazione che ho visto prima, ma non ho mai trovato una buona soluzione per questo. Quindi diciamo che ho una classe Browser:

Browser:
  String bookmarkFilePath
  String type
  Bool bookmarkFileExists()

Quando viene eseguito il mio programma, desidero avere valori codificati dei browser comuni e le posizioni del loro file dei segnalibri:

Object with hard-coded values:
  "~/Library/Application Support/Google/Default/Bookmarks", "Chrome"
  "~/Library/Safari/Bookmarks.plist", "Safari"

Esiste un modello di progettazione o un tipo di oggetto che potrebbe effettivamente occupare un oggetto con valori hard-coded (nome del browser / percorso file segnalibri) e utilizzarlo per creare istanze (e possibilmente gestire) altri oggetti (Browser)?

Inoltre, la flessibilità è importante poiché ci sono casi limite come il percorso dei file di Firefox per il file dei segnalibri che è sempre diverso e alcune ricerche devono essere fatte.

EDIT: lo implementerò in Python. Ci scusiamo per non averlo menzionato prima .

    
posta Korey Hinton 01.06.2013 - 16:43
fonte

3 risposte

2

Mi viene in mente lo scherzo classico con la battuta finale " I non iniziare da qui. ".

Poiché esiste un comportamento diverso associato a ciascun browser specifico, mi sembra che tu abbia effettivamente un certo numero di diverse sottoclassi della classe base Browser :

La differenza chiave tra le sottoclassi sono le differenze di comportamento, non la differenza nella struttura delle informazioni.

La sottoclassi per le differenze di funzionamento è meno comune rispetto alla sottoclasse per le differenze nelle informazioni, ma è comunque valida.

Date queste classi, è possibile registrare ciascuna di esse con un contenitore IoC:

Bind<Browser>().To<Chrome>().InTransientScope();
Bind<Browser>().To<Safari>().InTransientScope();
Bind<Browser>().To<Firefox>().InTransientScope();
Bind<Browser>().To<Opera>().InTransientScope();
Bind<Browser>().To<InternetExplorer>().InTransientScope();

(Sintassi da NInject, ma appena inserito nella parte superiore della mia testa. Il tuo contenitore IoC di scelta sarà diverso.)

Quindi, potresti definire il tuo BookmarkMerger principale con questo costruttore:

public BookmarkMerger(IList<Browser> browsers) { ... }

e fare affidamento sul contenitore IoC per fornire a tutte le implementazioni definite, come istanze di oggetti, pronte per essere utilizzate.

Se ti servivano ancora le cartelle per essere codificate in modo soft in un file di configurazione, invece di hard-coded nella tua sorgente, ciascuna sottoclasse potrebbe caricare la propria configurazione quando istanziata.

    
risposta data 02.06.2013 - 06:12
fonte
2

Inserisci le stringhe hard-coded in un file di configurazione, fx usando il formato INI. In questo modo puoi scambiarli senza toccare il codice.

paths.ini

Chrome="~/Library/Application Support/Google/Default/Bookmarks"
Safari="~/Library/Safari/Bookmarks.plist"

o

chrome.ini

path="~/Library/Application Support/Google/Default/Bookmarks"

safari.ini

path="~/Library/Safari/Bookmarks.plist"

La prima variante è migliore, se usi una fabbrica per gli oggetti del browser, la seconda, se l'oggetto browser legge la configurazione stessa.

    
risposta data 02.06.2013 - 05:29
fonte
1

Vorrei iniziare con un enum con valori come safari, chrome, opera ... e un costruttore che accetta un percorso predefinito e magari aggiunge metodi per gestire i casi limite.

    
risposta data 01.06.2013 - 22:55
fonte

Leggi altre domande sui tag