面向对象的更新方法

时间:2020-03-05 18:59:18  来源:igfitidea点击:

我的任务是维护最初用VB6编写的应用程序。此后已将其导入VB .Net,至少可以说该代码不是面向对象的。该代码充满了类,这些类只包含"公共共享"属性(变量)和方法(函数),它们的结果限制了应用程序一次打开多个项目。

一个项目由一个XML文件组成,该文件包含常规项目设置,以及包含其他与项目相关的数据的Access数据库的位置。多年来,XML文件的格式已被修改,并且采用了更新和版本控制策略。每当遇到旧版本时,所选策略都会在打开后执行更新。到目前为止,更新仅包括重新排列XML文件中的数据或者更改数据库模式,以及将数据从XML文件移至数据库。

在OOP中有相当多的背景知识,我很容易看出一个项目应该是一个与其他对象进行交互的自包含对象。但是,我看不到如何在OOP中应用所选的更新策略。

到目前为止,在OOP中实施所选更新策略的问题使我无法使用OOP。如果有人在执行此类任务方面有经验,或者对如何进行操作有建议,我将不胜感激。

解决方案

回答

建立一个读取XML文件的类,并基于该文件中的数据提供属性/方法/等。当类回写XML文件时,以新版本所需的方式格式化它。

因此,基本上,该类将能够在当前版本以及所有旧版本中读取,但是它将始终写出新版本。

数据将保存在该类的内部变量中,而不是每次需要时都必须扫描XML文件。

在这种情况下,将VERSION节点添加到XML文件也将有所帮助。

回答

当我们使用策略一词(即"策略设计模式")时,我们可能已经回答了自己的问题。

可能我们可以:

  • 创建一个对转换一无所知但接受策略对象的项目类。
  • 创建类的层次结构以对每种可能的转换策略进行建模。
  • 使用工厂方法以正确的策略构建项目对象

回答

我不明白为什么这是一个令人困扰的问题。它可以通过多种方式解决。

如果我们想做一个完全面向对象的企业类型的事情,则可以采用以下解决方案的任何子集:

  • 创建一个接口IProject,该接口描述其他对象如何与项目交互。
  • 创建Project的当前实现,该实现实现IProject,并且可以读写当前版本。
  • 为每个过去的版本扩展Project,重写xml和数据库读取方法,并在实例化这些类时让构造函数调用write
  • 为了增加工作量,请创建一个ProjectFactory,该工厂将检测文件的版本并实例化正确的版本。
  • 如果需要其他版本,请重写当前项目以执行与过去项目相同的操作,使用所有读取访问新版本的Project,然后调用write。

该解决方案的优点是我们可以继续浏览不同的版本,每个新版本只需要能够从以前的版本更新到最新版本,所有以前的版本都可以层叠到倒数第二个版本。