Classi con una funzione pubblica sostituita con un costruttore

1

Ho un numero di classi con un singolo metodo pubblico. Esaminando questa risposta, tendo a concordare con quanto affermato.

L'OP elenca alcuni esempi, che interpreto per essere usato come

(new VideoCompressor)->compress($raw_video);

Mentre la leggibilità migliora leggermente chiamando il nome del metodo esplicito, ritengo che sia quasi leggibile spostando semplicemente i parametri su __construct() e chiamando la funzione compress all'interno del costruttore.

new VideoCompressor($raw_video);

Ciò tuttavia aggiungerebbe un costruttore alla classe se non ne avesse già uno.

Ai miei occhi sarebbe uno scambio tra chiamate alle classi leggermente più piccole in cambio di più codice all'interno della classe.

C'è qualche altra ragione per cui si dovrebbe preferire un metodo diverso dal gusto personale?

    
posta myol 02.10.2015 - 16:16
fonte

3 risposte

5

Funzionerebbe? Sì. È questo il giusto design di classe? No.

Lo scopo di un costruttore è garantire la creazione (costruzione) valida dell'istanza, né più né meno.

    
risposta data 02.10.2015 - 16:27
fonte
3

Chiamare la funzione compress è l'approccio corretto. In questo modo puoi facilmente implementare più metodi di compressione.

interface VideoCompression
{
    public function compress($rawVideo);
}

final class MP4VideoCompression implements VideoCompression
{
    public function compress($rawVideo) { }
}

final class H264VideoCompression implements VideoCompression
{
    public function compress($rawVideo) { }
}

Successivamente, nella tua app, puoi ottenere la classe di compressione video basata sull'input dell'utente tramite una fabbrica, ad esempio.

Aggiornamento: Dopo aver verificato il thread originale, ho realizzato MainMa pubblicato esattamente come me / a> con ulteriori ragioni per usare in questo modo.

    
risposta data 02.10.2015 - 16:25
fonte
1

Come esempio veloce. Spero che tu veda che legare la costellazione di un oggetto al momento dell'uso elimina l'iniezione di dipendenza, ti lega ad un tipo concreto eliminando il polimorfismo (usando un diverso IVideoCompressore è ora impossibile) ed è generalmente cattivo:

    interface IVideoCompressor
    {
        Compress();
    }

    class VideoCompressor : IVideoCompressor
    {
        public byte[] Compress(byte[] input){
             throw new NotImplementedException();
        }
    }

    public class DirectoryFiddler
    {
        IVideoCompressor _videoComp;

        public DirectoryFiddler(IVideoCompressor videoComp, IImageCompressor imageCOmp)
        {
            _videoComp = videoComp;
        }

        public byte[] DoSomething(Idirectory directory)
        {
            // DI, polymorphism, in general good stuff
            return _videoComp.Compress(directory.Video);
        }

        public byte[] DoSomething2(Idirectory directory)
        {
            // Tied to VideoCompressor
            return new VideoCompressor(directory.Video).Compress();
        }
    }
    
risposta data 02.10.2015 - 16:32
fonte

Leggi altre domande sui tag