Как спроектировать парсер HTML, который бы следовал принципу единой ответственности? - PullRequest
1 голос
/ 07 марта 2020

Я пишу приложение, которое извлекает некоторые данные из HTML, используя BeautifoulSoup4. Это какие-то результаты поиска, если быть более точным c. Я подумал, что было бы неплохо иметь класс Parser, хранящий значения по умолчанию, такие как префиксы URL, заголовки запросов и т. Д. c. После настройки этих параметров метод publi c возвращает список объектов, каждый из которых содержит один результат или, возможно, даже объект со списком, включенным в него, наряду с некоторыми другими параметрами. Я изо всех сил пытаюсь отделить небольшие кусочки логики c, которые строят эту реализацию анализатора от самого класса анализатора. Я хочу написать десятки методов частной утилиты парсера, таких как: _is_next_page_available, _are_there_any_results, _is_did_you_mean_available et c. Тем не менее, это идеальные кандидаты для написания юнит-тестов! И поскольку я хочу сделать их приватными, у меня возникает ощущение, что я что-то упускаю ...

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

Не могли бы вы дать мне совет, как правильно спроектировать это?

1 Ответ

0 голосов
/ 09 марта 2020

Я думаю, что вы интерпретируете Принцип единой ответственности (SRP) немного по-другому. Это фактическое значение немного отличается от «класс должен делать только одно». На самом деле в нем говорится, что у класса должна быть одна-единственная причина для изменения.

Чтобы использовать SRP, вы должны спросить себя, за что / за кого будут отвечать ваши методы модуля синтаксического анализатора, что / кто может заставить их измениться. , Если ответ для каждого метода один и тот же, тогда ваш класс Parser правильно использует SRP. Если существуют методы, которые отвечают за разные вещи (дающие бизнес-правила, группы пользователей и т. Д. c.), То эти методы должны быть удалены и размещены в другом месте.

Ваша общая цель с SRP: чтобы защитить свой класс от изменений, происходящих с разных сторон.

...