Выскабливание в PubMed результаты запроса: выполнение


Недавно я разместил вопрос ищут отзыв на скрипт, я писал (см.: выскабливание в PubMed результаты запроса)

С тех пор я переписал его в класс, который я разместил ниже. Как это выглядит? Как я могу улучшить его?

class PubMedQuery {

private $query;
private $searchParameters;
private $searchURL;
private $fetchParameters;
private $fetchURL;
private $searchResults;
private $fetchResults;
private $matches;
private $matchRegex;
private $emailAddresses;

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

public function setSearchParameters() {
    $this->searchParameters = array(
        'db'         => 'pubmed',
        'term'       => $this->query,
        'retmode'    => 'xml',
        'retstart'   => '0',
        'retmax'     => '1000',
        'usehistory' => 'y'
    );
}

public function getSearchParameters() {
    return $this->searchParameters; 
} 

public function setFetchParameters() {
    $this->fetchParameters = array(
        'db'        => 'pubmed',
        'retmax'    => '1000',
        'query_key' => (string) $this->searchResults->QueryKey,
        'WebEnv'    => (string) $this->searchResults->WebEnv
    );
}

public function getFetchParameters() {
    return $this->fetchParameters; 
} 

public function setSearchURL() {
    $this->baseSearchURL = 'http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?';
    $this->searchURL = $this->baseSearchURL . http_build_query($this->getSearchParameters());
}

public function getSearchURL() {
    return $this->searchURL; 
}

public function setFetchURL() {
    $this->baseFetchURL = 'http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?';
    $this->fetchURL = $this->baseFetchURL . http_build_query($this->getFetchParameters());
}

public function getFetchURL() {
    return $this->fetchURL; 
}

public function setSearchResults() {
    $this->setSearchParameters();  
    $this->setSearchURL();
    $this->searchResults = simplexml_load_file($this->getSearchURL());
}

public function getSearchResults() {
    $this->setFetchParameters();
    $this->setFetchURL();
    return file_get_contents($this->getFetchURL()); 
}

public function setEmailAddresses() {
    $this->matches = array();
    $this->matchRegex = '/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/'; 
    preg_match_all($this->matchRegex, $this->getSearchResults(), $this->matches);
    $this->emailAddresses = array_unique(array_values($this->matches[0]));
}

public function getEmailAddresses() {
    $this->setSearchResults();
    $this->getSearchResults();
    $this->setEmailAddresses();
    return $this->emailAddresses;
}
}

//Example using search term "psoriasis"
$query  = new PubMedQuery('psoriasis');
echo implode('<br />', $query->getEmailAddresses());


Комментарии
1 ответ

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

Далее, я не уверен, что мне нравятся поиска/выборки параметров устанавливаются в различных местах по всему коду. Это выглядит как то, что должно быть сделано в конструкторе; настройки все данные, необходимые для завершения ответственность класса в конструкторе. Если вы когда-нибудь добавить новый метод или сделать некоторые изменения, вы всегда должны держать в задней части вашего ума "Я еще?". Ну, сделать это в метод__Construct() и вы будете знать, что вы.

Наконец, я заметил Вы же какого - нибудь функции, но не присваивая возвращаемое значение любой переменной. Если вы не используете возвращаемое значение не нужно использовать сделать* функции и если вы не использовать получить* функция вам не нужно это в классе.

В целом мне нравится API-интерфейс, названия методов говорят сами за себя. Я не уверен, что все они должны быть государственными , как вы используете только один метод фактически используется от вызывающего кода. Кроме того, я могу изменить свойства с частного на защищенный для расширения, но это, конечно, не обязательный, а так же предпочтения, как и все остальное. Я также предпочел бы видеть какую-то документацию, даже если это просто ответственность и хотя процессы, лежащие почему ты решил проблему таким образом.

2
ответ дан 26 января 2012 в 11:01 Источник Поделиться