Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 需要OO应用程序设计建议_Oop - Fatal编程技术网

Oop 需要OO应用程序设计建议

Oop 需要OO应用程序设计建议,oop,Oop,我继承了一个应用程序,它访问多个网站并解析HTML以在本地存储数据 HTML解析是一件轻而易举的事,但是为了使将来添加额外的站点“解析器”更容易,我正在进行总体设计 我正在努力解决的问题是如何为每个“解析器”封装解析和数据“转换”或“映射”,以便创建添加新解析器的标准约定 总体结构如下: --计划任务每15分钟启动一次,并在中央控制器中运行本质上是一种方法的任务 --系统在要执行的“解析器”列表上循环 --每个解析器都会访问其特定站点,下载页面并对其进行数据解析 --每个站点的数据“列”与本地数

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

HTML解析是一件轻而易举的事,但是为了使将来添加额外的站点“解析器”更容易,我正在进行总体设计

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

总体结构如下:

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

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

--每个解析器都会访问其特定站点,下载页面并对其进行数据解析

--每个站点的数据“列”与本地数据库表不“对齐”,因此需要进行排序转换

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

我最初的想法是,每个解析器应该只返回一个表示该站点数据的记录集,然后再返回其他转换器 应该将其转换为一个记录集,然后存储在本地。但是因为每个站点的情况都不一样,所以我很快开始倾向于每个解析器返回相同的东西——一个格式正确的(按照本地数据库模式标准)记录集,可以存储

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

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

从面向对象的角度来看,我设想拥有一个ParserBase对象,每个特定站点都将扩展它(ParserVendorX、ParserVendorY等)。基本(或者可能是抽象)解析器将定义每个特定解析器中必须包含的所有方法,我会毫不犹豫地说,需要以下私有方法:

检索数据 解析数据 翻译数据

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

因此,我正在寻找一个关于可能在这里应用的模式的建议,和/或其他人可能为类似于我正在工作的项目实施的现实世界解决方案

作为记录,我故意不提及我使用的语言,除非它是绝对必要的。。。这是一个高层次的问题,因此任何其他语言的某人的解决方案仍然被认为是相关的


谢谢

首先看一下

策略模式定义了一系列算法,封装了每一种算法,并使它们可以互换

在您的例子中,您将拥有一系列解析器和许多执行不同操作的实现

例如:

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);
}
至于在每一项中做什么,应用 你应该能够弄明白,只是把每一件作品整齐地封装成一个单独的组件,组成一个整体