Architecting single action: Object vs Static Util

1

Supponiamo di avere una funzionalità nella mia applicazione che è responsabile dell'aggiunta di un file marker cancellato .deleted in una directory che è considerata cancellata.

Quale sarebbe il modo migliore per implementarlo? Funzione statica o un oggetto con un singolo metodo che trasmette questa funzionalità? Quelle sono le mie 2 opzioni (la mia lingua non è funzionale):

class MarkAsDeletedDir {
  void apply(File directory) {
    directory.addChild(".deleted");
  }
}

Utilizzo: new MarkAsDeletedDir().apply(dir)

o

class AppUtils {
  // other stuff
  // ...

  static void markAsDeletedDir(File directory) {
    directory.addChild(".deleted");
  }

}

Utilizzo: AppUtils.markAsDeletedDir(dir)

Non assumere sovraccarico di prestazioni nella creazione di nuovi oggetti come il precedente.

    
posta Konstantine 31.10.2017 - 12:51
fonte

3 risposte

3

Il problema che stai affrontando non è esattamente quello che la gente definirebbe come ossessione primitiva , ma ritengo che sia molto vicino.

Quindi, ci sono altre operazioni relative a file / directory nel tuo sistema?

Se è così, puoi creare la tua classe File / Directory, avvolgendo la classe standard e fornendo le tue operazioni in cima.

Il punto è: invece di pensare di creare un metodo util (statico) nostra una classe util (MarkAsDeletedDir), puoi semplicemente creare un metodo sul File stesso, come ad esempio il tuoOwnFile.markAsDeleted ().

    
risposta data 31.10.2017 - 12:59
fonte
1

I metodi statici con effetti collaterali sono problematici, perché non possono essere derisi per il test unitario. Quindi consiglierei una lezione normale.

    
risposta data 31.10.2017 - 15:24
fonte
0

Personalmente non mi piacciono i metodi statici. Ci sono molte ragioni per quello , ma dato che la tua domanda riguarda un pezzo di codice specifico, sono più incline alla prima opzione, ma in questi casi di solito uso un decoratore. Ovviamente dipende da come appare l'interfaccia File e, nel caso sia sottile, l'implementazione potrebbe essere simile a quella:

interface File
{
    public function contents();
}

class Directory implements File
{
    public function contents()
    {
        return exec('ls -la');
    }
}

class DeletedDirectory implements File
{
    private $file;

    public function __construct(File $file)
    {
        $this->file = $file;
    }

    public function contents()
    {
        $this->file->addChild('.deleted');

        return $this->file->contents();
    }
}

Ovviamente non è un proiettile eccessivo o argentato, è solo uno dei tanti modi per risolvere un problema. Questa particolare soluzione potrebbe o non potrebbe corrispondere alle tue esatte esigenze, poiché ogni modello è solo una forma e non un'essenza.

    
risposta data 04.11.2017 - 09:57
fonte

Leggi altre domande sui tag