想要OO应用程序设计建议

时间:2014-02-03 14:51:35

标签: oop

我继承了一个访问多个网站并解析HTML以在本地存储数据的应用程序。

HTML解析是轻而易举的,但为了使将来更容易添加其他网站“解析器”,我正在进行整体设计。

我正在努力解决的问题是如何为每个“解析器”封装解析和数据“转换”或“映射”,以便我可以创建一个标准约定来添加新的解析器。

整体结构如下:

- 计划任务每​​15分钟启动一次,并在中央控制器中运行基本上是一种方法。

- 系统循环遍历要执行的“解析器”列表

- 每个解析器都会转到其特定站点并下载该页面并对其进行解析以获取数据

- 每个站点的数据“列”不与本地数据库表“对齐”,因此需要进行各种翻译

- 翻译后,数据存储在本地。

我最初的想法是,每个解析器只应返回一个代表该站点数据的记录集,之后其他一些翻译器 应该将其转换为记录集,然后存储在本地。但是因为每个站点都会有所不同,所以我很快就开始倾向于每个解析器实际返回相同的东西 - 格式正确(通过本地数据库架构标准)记录集可以存储。

应用程序的先前版本实际上让每个解析器都写入csv文件,然后用于导入数据。设计师正在做一些接近我倾向的方式,只是我相信所有这些都可以在内存中完成,而无需写入CSV文件。

那么每个解析器都应该检索数据并创建一个通用的本地相关记录集来存储吗?如果本地数据库结构发生更改,则必须触摸每个解析器,并触及相当深的。如果我在每个解析器的开头有一个mappng“约定”,说明远程站点的哪些列号映射到本地站点的列号,那么当一个或另一个发生更改时,更新可能不是那么困难所有解析器和新解析器的创建都会更容易,因为它们的结构的“格式”已经存在。

OO-wise,我设想有一个ParserBase对象,每个特定站点都会扩展(ParserVendorX,ParserVendorY等)。基础(或者可能是抽象的)解析器将定义每个特定解析器中必须包含的所有方法,并且我会说我需要以下私有方法:

retrieveData parseData translateData

并且唯一的公共方法可能是“getData” - 它只返回数据对象的记录集,用于在数据库中存储数据。

因此,我正在寻找可能适用于此处的模式的建议,和/或其他人可能已经为类似于我正在进行的项目实施的现实世界解决方案。

为了记录,我故意不提及我正在使用哪种语言,除非它绝对必要......这是一个高级别的问题,所以某人的任何其他语言的解决方案仍然被认为是相关的。

谢谢!

1 个答案:

答案 0 :(得分:0)

首先看一下Strategy Pattern

The strategy pattern defines a family of algorithms, encapsulates each one, and makes them interchangeable

在你的情况下,你会有一系列解析器和许多实现不同的实现。

例如:

public interface BaseParser 
{
   bool Parse(SomeRequest request);
}

有许多意见:

public class Html5Parser : BaseParser 
{
   public bool Parse(SomeRequest request)
   {
... does stuff
   }
}

public class XHtmlParser : BaseParser 
{
   public bool Parse(SomeRequest request)
   {
     ... does stuff
   }
}

然后你可以像这样执行它们:

foreach(var parser in ParserList)
{
   parser.Parse(myRequest);
}

至于在每个内容中执行的操作,请应用single responsibility中的S.O.L.I.D原则 并且你应该能够弄明白,只需将每件作品整齐地封装成一个单独的组件,以构成整体。

相关问题