【问题标题】:How to design a HTML parser that would follow the Single Responsibility Principle?如何设计一个遵循单一职责原则的 HTML 解析器?
【发布时间】:2020-03-07 19:56:55
【问题描述】:

我正在编写一个应用程序,它使用 BeautifoulSoup4 从 HTML 中提取一些数据。这些是某种搜索结果,更具体地说。我认为拥有一个 Parser 类是个好主意,它存储 URL 前缀、请求标头等默认值。配置这些参数后,公共方法将返回一个对象列表,每个对象都包含一个结果,或者可能甚至是一个带有列表的对象以及一些其他参数。我正在努力将构建解析器实现的小块逻辑与解析器类本身分离。我想编写几十个解析器私有实用程序方法,例如:_is_next_page_available、_are_there_any_results、_is_did_you_mean_available 等。但是,这些是编写单元测试的完美候选者!而且因为我想让它们私有化,所以我觉得我错过了一些东西......

我的另一个想法是将解析器编写为一个函数,调用一堆其他实用函数,但这等于将所有这些方法公开,这是没有意义的,因为它们是实现细节。

你能告诉我如何正确设计这个吗?

【问题讨论】:

  • 我认为你有点自相矛盾:你说你想让方法私有,但这会阻止你对它们进行单元测试(这是一个完全正确的观点),但在最后一段似乎您说您也不希望这些方法公开,因为它们是实现细节。

标签: python unit-testing oop solid-principles


【解决方案1】:

我认为您对单一职责原则 (SRP) 的解释略有不同。它的实际含义与“一个班级应该只做一件事”有点不同。它实际上表明一个类应该有一个且只有一个改变的理由。

要使用 SRP,您必须问自己您的解析器模块方法负责什么/谁负责,什么/谁可能使它们发生变化。如果每种方法的答案都相同,那么您的 Parser 类正确地使用了 SRP。如果存在对不同事物(业务规则提供者、用户组等)负责的方法,则应将这些方法取出并放在其他地方。

您对 SRP 的总体目标是保护您的班级免受来自不同方向的更改。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-27
    • 1970-01-01
    • 2016-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多