如何用 2 个可能的实现或子类替换一个类

问题描述 投票:0回答:1

我有一个 csv 解析器应用程序,它使用 Header 类型来解析 csv 的标题并将它们保存在成员变量中。

CSVParser —-> 使用标头(名称、区域、价格)

现在,我有一个新的要求,我需要支持新的标头类型 -> 名称、地区、税收

我如何支持这个?

方法一 我想到了标题(名称,区域)和一个,

  • PriceHeader 扩展了 Header(价格)
  • TaxHeader 扩展标题(税)

但是我需要更改 CSVParser 中的代码来确定我想要使用哪种标头类型。

方法2 创建由 A. PriceCSVParser 和 B. TaxCSVParser 实现的接口 CSVParser。它们分别使用 PriceHeader 和 TaxHeader。然后我当然需要更改上游以确定要使用哪个 CSVParser。 CSVParser 在开始解析之前需要验证标头。验证取决于应用哪些标头字段。

我是 OOP 新手,并且研究过 SOLID 设计原则,但对设计模式完全陌生。

简而言之,当我必须使用 2 种类型的模型对象(如标题)时,如何设计我的应用程序。抱歉没有发布代码片段。通过电话发布此信息。

尝试过方法1 - 继承,但我觉得这违反了子类应该替代超类的原则。然后在方法2中-我也可以尝试接口。 我知道这个问题是主观的,糟糕的设计会“起作用”,但我想用这个问题作为学习更好设计的一种方式

oop solid-principles
1个回答
0
投票

如果您有非常相似的方法但具有不同的签名,则可以创建一个具有相同名称的方法。这取决于语言,但这称为重载。

所以,针对不同的目的,需要不同的方法。这是方法存在的主要原因。

但是我需要更改 CSVParser 中的代码来确定我想要使用哪种标头类型。

对于这个问题,您不需要任何新课程。您仍在编写有关 cvs 解析器的代码。您不必仅仅因为可以使用 OOP 概念就必须使用 OOP 概念。只需编写一个简单的第三个主要方法来决定您需要哪种解析器方法。此方法应该在解析器之间导航。因此,如果您需要第三个解析器,您只需编辑此方法即可到达第三个解析器。

如果您不需要它们用于任何目的,创建新的接口、类会使事情变得复杂。尝试找到最简单的解决方案。希望它能澄清一些事情。

© www.soinside.com 2019 - 2024. All rights reserved.