我是一个自学成才的程序员,我遇到的许多问题都来自缺乏正规教育(而且常常也是经验)。
我的问题如下:如何合理化类或函数创建的数据的存储位置?我将举一个简单的例子:
案例:我有一个带有REST API的网上商店(SHOP),还带有一个REST API的产品提供商(PROVIDER)。我确定产品,然后将数据发送给PROVIDER,然后由PROVIDER向我发送格式化的数据,SHOP可以读取该数据以在网上商店中制作有效的产品。 PROVIDER还具有辅助REST API,可提供生成的图像。
我会想到的:
我会讲三课:ProductBase
,Shop
和Provider
ProductBase
将是我实例化并存储各个产品信息的类。
Shop
将是我设计与网上商店进行api交互的地方。
Provider
与商店相同,但用于与提供程序api进行交互。
我的问题:在某些时候,您创建的数据并没有明确分开。例如:是否将生成的产品数据(来自PROVIDER)存储在我创建的ProductBase
实例中?感觉就像我以这种方式耦合了两个类。但是不在那里,那在哪里?
如果我使用PROVIDER创建产品图片并将其上传到SHOP,该怎么办?是否将上传的图片网址存储在PRODUCT中?您如何跟踪所有这些信息?
我要回答的问题:
我已经阅读了很多有关OOP和设计模式的文章,并且采用了TDD方法,该方法极大地帮助了我的代码改进,但是我还没有找到有关如何处理软件工程中运行时生成的数据流的任何信息。
什么是解决上述问题的好方法,您能否解释一下其理由?
答案 0 :(得分:1)
如果我理解正确,我认为您当前关心的是您具有要存储在对象中的“原始”产品数据,并且还具有要存储在其中的“已处理”(格式化)产品数据对象。您的问题是您是否应该将它们混合。
首先让我指出另一个明显的选择。即,具有两个产品类别:RawProduct和ProcessedProduct。该做什么?
(编辑:同样,可以肯定的是,产品数据不应存储在提供程序中。提供程序执行格式化操作,但该数据是产品数据。不是提供程序数据。)
这取决于。有两个注意事项:
1)通常,在OOP中,想法是将数据操作与数据耦合。因此,如果可能的话,您可以在ProductBase中使用某种方法,例如“ format()”,其中format将把对象发送给API进行格式化,并将结果存储在实例变量中。然后,您还可以使用类似“ find_image”的方法,该方法可以从API中获取图像网址,然后将其存储在字段中。对象的数据是动态的。只能通过对象方法来更改。
2)如果需要版本控制(如果希望获得对象状态的完整历史记录),则无法用新数据覆盖字段。因此,您需要存储对象中每个对象字段的历史记录,或者需要创建新对象。
3)RAM是否值得关注?有时,我会创建只存储对象生命最后一部分的数据类,以便将更多对象放入内存中。
我个人经常会发现自己创建了“ RawObject”和“ ProcessedObject”类,这在很多时候都比较容易。但这可能是因为我主要处理文档处理,因此非常清楚。通常,您只需要更新对象数据即可。
拥有一个具有完整历史记录的对象的好处是调试起来容易得多。因为原始数据和API结果在同一个对象中。因此,您可以轻松地探查出了什么问题。如果您开始拆分,就很难跟踪。通常,对象拥有的去处越多,就越容易找出问题出在哪里。
也请记住,因为这是一个Python问题,所以Python是multi-paridigm。而且,如果您正在编写管道样式的架构(同步,线性流程),那么功能方法也可以很好地工作。
一旦您的数据存储在产品对象中,任何东西都可以保存对该对象的引用。因此,商店可以引用对象,而产品可以引用对象。要清楚“具有”关系和“具有”关系之间的区别。