我应该在一节课上输入多少信息?(OOP)

本文关键字:OOP 信息 多少 一节课 输入 我应该 | 更新日期: 2023-09-27 17:57:30

虽然我已经涉猎编程几年了,但我是一名一级C#编程学生,除了课堂上教给我的东西之外,我还在学习,所以一旦进入工作环境,我就做好了充分的准备。这节课根本不是OOP,这实际上是下一节课,但对于这个项目,老师说他不介意我们超越极限,用OOP做这个项目(事实上,除非你超越极限,否则你在他的课上无法获得A)。

项目(此时)是逐字节读取XML文件,将元素标记存储到一个数组中,并将数据值存储到另一个数组。我和他在这个问题上进行了斗争(考虑到处理XML的.net框架),但那是一场失败的斗争。他希望我们在不使用.net XML的情况下编写代码。

他确实为这个程序提供了一个OOP的例子,他把它放在一起(最初是用Java编写的,移植到C++,然后从C++移植到C#)

在他的例子中,他有三节课。第一个是XMLObject,它包含数组、准构造函数、getter和setter方法(而不是属性,我计划在我的版本中修复它),以及一个将<>添加到要存储在数组中的标签中的方法(如果需要,输出到控制台)

第二类是parseXML类。在这个字段中,他有跟踪行数、文件偏移量、标记偏移量以及保存元素和数据的字符串的字段。同样,他有getter和setter方法,几个搜索不同内容的解析方法,以及一个使用其他解析方法的通用解析方法(在这里有点结合了它们)。其中一些方法调用XMLObject类的方法,并将解析后的元素和数据值发送到它们各自的数组。

他拥有的第三个类没有字段,有两个方法,一个用于执行ATOI,另一个用于将文件流的一部分转储到控制台。

我知道我们本质上是在构建一个效率较低的.net框架版本。我已经向他指出了这一点,并被告知"不要使用.net的XML类,讨论结束",所以让我们都同意不使用这个类。

我的问题是,这真的应该是三个单独的班级吗。解析类不是应该继承自XML对象类,或者只是在XML对象类中编码吗?ATOI和转储方法不应该也在这两个类中的一个中吗?

对我来说,如果解析类的目标是解析XML文件并将元素和数据字段存储到数组中,那么它应该在同一个类中,而不是孤立的,必须通过getter和setter(或我要做的版本中的属性)来完成。我不明白为什么数组需要封装在解析方法之外,解析方法实际上为它们提供了存储内容。

任何帮助都将不胜感激,因为我仍在设计它,并且希望它至少接近"适当的"(我知道这是一个相对的术语)OOP形式

一个类应该有一个责任:改变

在我看来,你的老师确实正确地划分了他的职责。他将表示与xml解析逻辑分离,并将xml数据与xml解析行为分离。

我应该在一节课上输入多少信息?(OOP)

第一:如果你在编程课上,他可能有充分的理由希望你手工完成:我真的不建议和你的教授争论。你永远不会赢,你可能会影响你的成绩。

第二:他的版本并不太糟糕(考虑到它在很大程度上是对System.XML命名空间部分的重写)。基本上,您有一个类"就是"您的XML。把它想象成XDocument或XmlDocument类:基本上它只包含Xml本身。然后你就有了Xml解析器:把它想象成XmlReader。你的最后一个是他的XmlWriter。

请记住,使用OOP,Xml类(表示文档本身的类)既不应该知道也不应该关心它是如何获得所拥有的信息的。此外,Parser应该知道如何获取Xml,但不应该太在意它存储在哪里。最后,Writer类不应该真正关心数据来自哪里,而应该只关心数据的去向。

我知道它被过度使用了,但把你的程序想象成一辆汽车——它有几个部分必须协同工作,但你应该能够在不严重影响其他部分的情况下更改它的任何给定部分。如果你把所有的东西都归为一类,你就失去了灵活性。

一些要点:

  • 类是名词;方法是动词
    你的课应该叫XmlParser

  • 由于XML解析器既不是XMLObject的一部分,也不是对XMLObject的扩展,所以它应该是一个单独的类。

  • 第三类与其他两类无关;它只是一个普通的CCD_ 6类。

  • 一般来说,每个类都应该负责一个单独的工作或存储单元
    不要试图在一个类中投入太多(参见"上帝对象"反模式)
    上很多课没什么错。(只要它们都有意义)

让我们总结一下系统必须做的事情:

  • 以逐字节读取xml文件
  • 将元素标签存储到一个阵列中
  • 将数据值转换为另一个

我可能会以以下方式将其分割:

  • 阅读器:给定一个文件路径,按字节生成内容(IEnumerable<byte>
  • Tokenizer:给定字节的枚举,生成与XML上下文相关的令牌(IEnumerable<XmlToken>
  • XmlToken:标记化器生成的任何输出的基类。现在你需要两个专业:
    • 标签:打开标签
    • 值:标记的内容
  • TokenDelegator:接受Tokenizer和的实例
  • IXmlTokenVisitor:(请参阅访问者模式)
  • TagAndValueStore:实现IXmlTokenVisitor。实现了CCD_ 9和CCD_

你看,我最终得到了7个类和1个接口。但是您可能会注意到,您已经为一个成熟的XML解析器奠定了基础。

通常,被推销为OO的代码并不是。一个班级应该遵守单一责任原则。