gpt4 book ai didi

python - 设计类结构的方法

转载 作者:行者123 更新时间:2023-11-28 21:32:44 24 4
gpt4 key购买 nike

我的类结构非常简单。 B类和C类继承自A类。在某些功能和属性的情况下,功能是相似的。 B 类和 C 类对数据的处理不同,但这些类具有相同的输出(创建输出的函数位于 A 类内部)。结构示例: enter image description here

现在我需要扩展功能。我需要添加选项以处理和输出数据(X 类)方面的一些差异。该选项由配置文件管理,因此我想保留下载、处理和输出数据的旧方式,例如:

  1. 选项 1 - 使用旧方式处理和输出在没有线程的情况下下载数据
  2. 选项 2 - 使用新的处理和输出方式在没有线程的情况下下载数据
  3. 选项 3 - 使用旧方式处理和输出通过线程下载数据
  4. 选项 4 - 使用新的处理和输出方式在没有线程的情况下下载数据

我不知道如何实现新处理和输出数据的结合。我需要 B 类和 X (BX) 以及 C 类和 X (CX) 的组合。我考虑了这些选择:

  1. 最简单但最糟糕的方法 - 在 B 类和 A 类中复制一些函数。
  2. 保留 A 类和 B 类,并添加 BX 类和 AX 类的组合。
  3. 重写类A和B仅用于下载数据。然后添加用于处理数据的类,然后添加用于输出数据的类。所有类将共享对象。看起来是最好的选择,但要做的工作最多。

是否有更好的选择(例如设计模式或类似的东西)如何以最简洁的方式扩展类?

最佳答案

在我看来,你有一个 Dataflow

您拥有的是获取(下载)数据 -> 处理数据 -> 输出数据。这基本上是一个具有三个阶段的管道。

如果您使用对象来建模,则有两种类型的对象:执行操作的对象以及管理数据流和操作顺序的一个或多个对象。

让我们使用三个接口(interface)(您可以使用抽象类来定义它们,没关系)来定义管道的步骤:IDataDownloaderIDataProcessor>IDataOutputer

让我们添加另一个对象来表示和管理管道:

(注意:我没有 python 经验,所以我会用 C# 编写,抱歉..)

public class Pipeline {

private IDataDownloader mDataDownloader;
private IDataProcessor mDataProcessor;
private IDataOutputer mDataOutputer;

public void Setup() {

// use a config file to select between the two ways

if (Config.UseOldWayDownloader) {
mDataDownloader = new OldWayDownloader();
}
else {
mDataDownloader = new NewWayDownloader();
}
// ....

// or you can use service locator or dependecy injection that will get
// a specific downloader based on configuration/setup

mDataDownloader = Services.Get<IDataDownloader>();
// ....
}

public void Execute() {

var data = mDownloader.Download();

var processedData = mDataProcessor.Process(data);

mDataOutputer.Output(processedData);
}
}

这样你就会变得友善separation of concerns您将获得一个可以扩展的模块化系统。该系统也是可组合的。您可以用不同的方式组合它的各个部分。

这可能看起来需要更多工作,但事实可能并非如此。简洁的设计通常更容易编写和扩展。

确实,您可能会编写更多的代码,但是由于简洁的设计,这些代码可以编写得更快,并且可以节省调试时间。调试是我们编写软件时花费大部分时间的事情,但它经常被程序员忽视,他们认为他们只能通过编写代码行来进行测量。

一个例子是松散类型语言的情况。很多时候,你编写的代码越少,代码就越胖,但很容易因为错误而出错。如果出现错误,您会进行更多(有时更困难)的调试,从而浪费时间。

如果您从一个简单的概念验证应用程序开始,它们将显着加快开发速度。一旦您真正拥有经过测试的强大软件,就会出现不同的力量。

为了确保您的软件健壮,您必须编写更多测试和更多检查/断言,以确保一切顺利运行。因此,最终您可能会拥有与强类型为您执行一些检查相同数量的代码,并且您可以编写更少的测试。

那么什么更好呢?嗯...这取决于。

有几个因素会影响开发速度。这程序员使用某种语言的品味和经验。应用程序也会影响这一点。有些应用程序更容易使用松散类型语言编写,而另一些应用程序则更容易使用强类型语言编写。

速度可以不同,但​​并不总是这样,有时只是一样。

我认为,在您的情况下,即使最终您少了几行代码,您也会浪费更多时间尝试使层次结构正确并对其进行调试。从长远来看,如果您需要扩展它,那么难以理解的设计会显着减慢您的速度。

在管道方法中,添加下载、处理或输出数据的新方法只需添加一个类即可。

关于python - 设计类结构的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55898597/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com