Sto imparando sulla programmazione di un'interfaccia nella programmazione OOP. Capisco che dovresti codificare un'interfaccia in modo da poterla "scambiare".
Tuttavia, ho una situazione in cui sento di poter riutilizzare nuovamente un'interfaccia piuttosto che semplicemente sostituirla.
interface GetFile
{
public function getFile();
}
class GetFileFromUrl implements GetFile
{
public function __construct($url, $destination_path) {...}
public function getFile()
{
// download file from url and return path of file
return 'file_path';
}
}
class GetFileFromZip implements GetFile
{
public function __construct($path, $extraction_path) {...}
public function getFile()
{
// extract file from zip and return path of file
return 'file_path';
}
}
class DoStuff
{
// coding to an interface
public function doStuff(File $file) {
$do_stuff = $file->getFile();
//do stuff with file
}
}
Ho pensato che questo avrebbe permesso la massima flessibilità nel riuso del codice in futuro, dato che posso estendere ulteriormente l'interfaccia
class GetFileFromDirectory implements GetFile(...)
class GetFileFromTar implements GetFile(...)
I sento questo un approccio abbastanza buono in quanto posso passare qualsiasi implementazione di GetFile
a DoStuff
e eseguirà readFile
nel metodo doStuff()
.
La mia domanda che sto cercando di porre è come posso "concatenare" queste classi che implementano GetFile
insieme?
vale a dire. GetFileFromUrl
poi GetFileFromZip
per ottenere un file zip da un URL e decomprimerlo?
Quindi usare solo uno sarebbe
$file_from_url = new GetFileFromUrl($url_path, $destination_path);
$do_stuff = (new DoStuff)->doStuff($file_from_url);
Ma "concatenando" due che sto facendo attualmente;
$zip_file_path = (new GetFileFromUrl($url_path, $destination_path))->getFile();
$file_from_zip = new GetFileFromZip($zip_file_path, $destination_path);
$do_stuff = (new DoStuff)->doStuff($zip_from_tar);
C'è un modo migliore / più pulito per farlo?
Grazie a thepacker , il mio pensiero rivisto è quello di separare la funzionalità in un'unica interfaccia che ottiene un file da qualche parte e un'altra interfaccia che fa qualcosa al file;
interface GetFile()
interface ConvertFile()
Quindi potrei fare
class GetFileFromUrl implements GetFile {...}
class ConvertFileFromZip implements ConvertFile {
// coding to an interface
public function __construct(GetFile $from) {...}
}
$zip_from_url = new GetFileFromUrl($url, $destination);
$file_path = new ConvertFileFromZip($zip_from_url);
Voglio solo confermare che questa è la linea di condotta corretta in questo caso.