我是一名C#编程学生,虽然我已经习惯了几年的编程,而且学习的内容超出了课程的教学范围,这正是我正在做的事情,所以我已经做好了充分的准备一旦我进入工作环境。这个特殊课程根本不是OOP,实际上是下一堂课,但对于这个项目,老师说他不介意我们是否超越并在OOP中完成了项目(事实上你不能得到A在他的班上,除非你无论如何都要超越。)
项目(此时)读取XML文件,逐字节,将元素标记存储到一个数组,将数据值存储到另一个数组。我和他一起战斗(考虑到处理XML的.net框架)但这是一场失败的战斗。他希望我们在不使用.net XML的情况下编写代码。
他确实为这个程序提供了一个OOP示例(他最初用Java编写,移植到C ++,然后从C ++移植到C#)
在他的例子中,他有三节课。第一个,XMLObject
,包含数组,准构造函数,getter和setter方法(不是属性,我计划在我的版本中修复),以及添加<
和{{的方法1}}要标记存储在数组中(如果需要,输出到控制台。)
第二堂课是>
班。在这一个中,他有一些字段可以跟踪行数,文件偏移量,标记偏移量以及用于保存元素和数据的字符串。
同样,他有getter和setter方法,几个解析不同东西的解析方法,以及一个使用其他解析方法的通用解析方法(在这里将它们组合起来)。其中一些方法调用XMLObject类的方法,并将解析后的元素和数据值发送到各自的数组。
他拥有的第三个类是没有字段的类,有两个方法,一个用于执行ATOI,另一个用于将一部分文件流转储到控制台。
我知道我们基本上构建了一个效率较低的版本,已经包含在.net框架中。我已经向他指出了这个问题,并被告知“不要使用.net的XML类,讨论结束”,所以让我们都同意只留下那个。
我的问题是,那些真的应该是3个独立的课程。解析类不应该从XML对象类继承,还是只能在XML对象类中编码,ATOI和转储方法是否也不应该属于这两个类中的一个?
对我而言,如果解析类的目标是解析XML文件并将元素和数据字段存储到数组,那么它应该在同一个类中而不是被隔离并且必须通过getter来实现和setter(或我将要做的版本中的属性)。我不明白为什么数组需要从实际给它们存储什么的解析方法中封装出来。
任何帮助都会受到赞赏,因为我仍然在设计这个,并希望至少尽可能接近“正确”(我知道这是一个相对术语)OOP表格。
答案 0 :(得分:10)
一般规则是我们在一个类的大小中计算它所具有的职责数量:
一个班级应该有一个 责任:单一理由 变化
在我看来,你的老师确实正确地分担了他的职责。他将表示与xml解析逻辑分开,并将xml数据与xml解析行为分开。
答案 1 :(得分:8)
首先:如果你在编程课程中,可能有一个很好的理由,他希望你这样做:我真的不建议与你的教授争论。你永远不会赢,你可以伤害你的成绩。
第二:他的版本不是(考虑到它主要是对System.XML命名空间部分的重写)太可怕了。基本上你有一个“是”你的XML类。可以把它想象成XDocument或XmlDocument类:基本上它只包含Xml本身。然后你有你的Xml Parser:想象一下像XmlReader。而你的最后一个是他的XmlWriter。
请记住,使用OOP,您的Xml类(代表文档本身的那个)既不知道也不关心它如何拥有它拥有的信息。此外,Parser应该知道如何获取Xml,但它不应该关心它存储的位置。最后,你的Writer类不应该关心数据的来源,只关注它的来源。
我知道它被过度使用了,但是把你的程序想象成一辆汽车 - 它有几个部分都需要一起工作,但你应该能够改变它的任何部分,而不会对其他部分产生重大影响。如果你把所有东西都归为一类,就会失去这种灵活性。
答案 2 :(得分:2)
有些观点:
课程是名词;方法是动词。
您的课程应该被称为XmlParser
。
由于XML解析器既不是XMLObject的一部分,也不扩展XMLObject,因此它应该是一个单独的类。
第三类与其他两个任何一个都没有关系;它只是一个普通的Utilities
类。
一般而言,每个班级应负责一个单位的工作或存储 不要试图将过多的东西放入一个班级(参见“上帝对象”的反模式) 拥有很多课程没有错。 (只要它们都有意义)
答案 3 :(得分:2)
让我们总结系统必须做的事情:
我可能会按照以下方式将其分割:
IEnumerable<byte>
)IEnumerable<XmlToken>
)Visit(Tag tag)
和Visit(Value value)
已实现,相关内容存储在数组中。你看,我最终得到了7个班级和1个界面。但您可能会注意到,您已为完全成熟的XML解析器奠定了基础。
通常销售为OO的代码通常不是。课程应遵循单一责任原则。