Определение правильного отношения ассоциации между классами - PullRequest
2 голосов
/ 02 марта 2012

В модуле, который я сейчас разрабатываю, я попытался смоделировать требования к диаграмме классов с правильными отношениями.

Требования:

  1. Модуль подключится к наборуftp-серверов и загрузите некоторые файлы.
  2. Модуль проанализирует каждый файл для генерации набора счетов.

Итак, я создал 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, но кто и кого должен содержать?

1 Ответ

1 голос
/ 02 марта 2012

На мой взгляд, вы должны пересмотреть обязанности файла. Файл может быть загружен, но он не является ответственным за файл.

Я имею в виду, что класс File должен описывать свойства и обязанности файла. Ответственность за загрузку файла должна быть помещена в DownloadManager или что-то подобное.

Некоторые замечательные рекомендации по определению приложения можно найти в [SOLID design принцип , происхождение принципа можно найти в этой статье Дядя Боб

Это дает вам пять руководящих принципов, которые дают вам конструкцию, которая должна быть слабо связана и которую легче поддерживать и использовать повторно. По этой теме доступно много ресурсов.

...