В модуле, который я сейчас разрабатываю, я попытался смоделировать требования к диаграмме классов с правильными отношениями.
Требования:
- Модуль подключится к наборуftp-серверов и загрузите некоторые файлы.
- Модуль проанализирует каждый файл для генерации набора счетов.
Итак, я создал 4 класса File, Ftp & Parser.Теперь я подумал, что должен сделать класс File способным download()
и parse()
.
class File{
private $supplier;
private $status;
private $fileName;
private $fileId;
function __construct($supplier){
$this->supplier=$supplier;
}
function downloadFile(){
$ftp= new Ftp($this->supplier);
$this->fileName=$ftp->download();
}
function parseFile(){
$parser= new Parser($this); // The parse needs the fileName in addition to the supplier info to parse the file correctly.
$parser->parse();
}
function saveFileInfoToDB(){
//Save file Info to db.
}
}
Поэтому, когда мне нужно загрузить файл, я делал следующее:
class ServiceInvoker{
function downloadFilesFromFtpServers(){
foreach($suppliers as $supplier){
/*$supplier here is an object containing all data needed to download a file
from that certain supplier filled from the database
(i.e. ftpUsername, ftpPassword, ftpHost, SupplierName, supplierFileType).*/
try{
$file= new File($supplier);
$file->downloadFile()
$file->saveFileInfoToDB();
}catch(Exception $e){
//log error
}
}
}
}
Вы можете ясно видеть, что для загрузки файла мне нужно выполнить несколько вызовов загрузки в разных объектах.
Я думаю, что проблема была, главным образом, в том, что я думал, что класс File должен иметь возможность загружать себя и, следовательно,Я создал экземпляр объекта Ftp в самом классе File.
То же самое происходит, когда я пытаюсь проанализировать файл, так как мне нужно передать $this
в синтаксический анализ, чтобы получить информацию о файле.
Я думаю, что класс Ftp должен был быть передан объекту поставщика непосредственно в ServiceInvoker и заставить его возвращать объект File, если процесс успешно загрузил этот файл.
Теперь, как мне правильно определитьсвязь между классами Ftp Parser и File?Должен ли File содержать объект синтаксического анализатора или сам анализатор должен содержать объект File и вызываться непосредственно из сервисного инициатора?Я могу четко определить связь между классами Parser и File как Association.То же самое между классами Ftp и file, но кто и кого должен содержать?