1

我是Java的新手。我有一些设计问题。

假设我有一个爬虫应用程序,它执行以下操作: 1. 爬取一个 url 并获取其内容 2. 解析内容 3. 显示内容

  1. 你如何决定实现一个函数还是一个类?-- 解析器应该是爬虫类的一个函数,还是它本身应该是一个类,所以它也可以被其他应用程序使用?-- 如果它应该是一个类,它应该是保护类还是公共类?

  2. 您如何在实现公共类或受保护类之间做出决定?-- 如果我必须创建一个类来从解析的内容生成统计信息,例如,该类应该受到保护(因此只有爬虫类可以访问它)还是应该是公共的?

谢谢罗恩

4

3 回答 3

2

对于这类问题,我见过的最佳指导是“面向对象设计的 SOLID 原则”。

http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod

这些原则中最基本的,并且可以回答您的第一个问题的是“单一职责原则”。这表明,“一个类应该有一个,而且只有一个,改变的理由。” 换句话说,你的班级应该每个人都做一件事。如果您最终需要更改某件事的工作方式,那么您只有一个类可以更改,并且希望该类中只有一个地方可以进行更改。在您的情况下,您可能希望一个类从 URL 检索内容,另一个类将其解析为某种内存数据结构,另一个类来处理数据(如果需要),以及另一个类(或类)以您需要的任何格式显示内容。显然,你可以对课程忘乎所以,但测试很多小项目通常更容易,

公共与受保护的问题取决于您计划如何使用此代码。如果您的类可以在您的库之外独立使用,您可以考虑将其公开,但如果它完成某些特定的或与您的其他类相关的任务,它可能会受到保护。例如,从 URL 检索内容的类是一个很好的通用类,因此您可以将其公开,但是执行某些特定类型的数据操作的类可能在您的库之外没有用处,因此它可以是受保护。总的来说,它并不总是黑白分明,但最终,这通常不是什么大不了的事。

于 2010-05-04T23:59:30.197 回答
2

我觉得安迪的回答很好。我有几点补充:

如果您认为将来会扩展某个类,则可以将所有private方法(如果有)设置为protected. 这样,任何未来的扩展类也可以访问这些。

我喜欢这样的规则,即方法不应该长于您可以在{ }不滚动的情况下看到它的左方括号和右方括号 ( )。如果一个方法比那个长,试着把它分成几个方法(privateprotectedpublic根据你的喜好)。这使代码更具可读性,并且还可以节省代码行数。

所以假设一个方法越来越大,你把它分成几个private方法。如果这些新方法只在第一个“母亲”方法中使用,那么将所有这些都移到它自己的类中是有意义的。通过这种方式,您将使原始类更小且更具可读性。此外,您将使新类的功能更易于理解,因为它不会与原始类的功能混淆。

于 2010-05-05T00:09:59.670 回答
1

我喜欢将班级视为可以做特定事情“方法”的“人”。

在您的情况下,如果您告诉他那是哪个 url,那么他可以获取 url 的内容。

然后是另一个人,他非常擅长解析内容。我认为他使用名为 rome 的工具来做到这一点,但我不确定。他保持私密(提示;))

然后我们有第三个人,他展示东西。他有点智障,只理解“另一个人”制作的东西,但没关系。

最后,这个项目需要一个老板,他向其他 3 个人下达命令并在他们之间传递信息。

ps:我从来没有真正考虑过是否让课程受到保护。通常它们只是公开的,没有任何具体原因。只要不疼,何必呢?

于 2010-05-05T10:23:54.910 回答