【问题标题】:is it a good idea to have classes with the same name in different namespace in c#?在 c# 的不同命名空间中拥有同名的类是个好主意吗?
【发布时间】:2010-09-14 08:51:05
【问题描述】:

例如,我们有两个解析简历的类,一个解析 Excel,另一个解析 HTML。我的同事喜欢做的是将这两个类命名为相同的名称,并将它们放入不同的命名空间,如图所示如下:

namespace XX.ResumeParsers.Excel
class ResumeParser{}

namespace XX.ResumeParsers.Html
class ResumeParser{}

我觉得这不是一个好主意,我宁愿重命名这些类,并将它们放在一个命名空间中(但如果需要,可以放在不同的文件中):

//in Excel folder under ResumeParsers folder
namespace XX.ResumeParsers
class ExcelResumeParser{}

//in Html folder under ResumeParsers folder
namespace XX.ResumeParsers
class HtmlResumeParser{}

因此,Hierarchy 仍然存在于文件夹中,但命名空间相同(不完全匹配文件夹层次结构),可以吗?

如果我是对的,知道如何说服我的同事吗?或者他们的解决方案有什么明显的缺点?

谢谢。

【问题讨论】:

  • 根据 Jon 的说法,这里有 2 个决定:1,它们是否应该在不同的命名空间中是一个单独的决定。 2、尽可能保持类名唯一——特别是当它们都来自同一个消费者时。

标签: namespace-organisation


【解决方案1】:

这通常不是一个好主意,不,尤其是当您需要使用同一代码中的两个类时。它们是否应该在不同的命名空间中是一个单独的决定,但我肯定会称它们为HtmlResumeParserExcelResumeParser,而不是试图让命名空间通信上下文。这将使您在阅读代码时更容易准确地确定您在说什么。

【讨论】:

    【解决方案2】:

    我可以从经验中看出 - 在涉及类似示例的大型代码库中工作 - 就可读性而言,第二种选择要好得多。就我而言,我很想抓住选择相反方式的程序员:)。

    一般来说,对于编写代码的人来说,总是很清楚正在使用哪个类以及为什么 - 但想想阅读它的人 - 他们是否能够一眼看出您的代码中使用了哪个解析器?

    还有一种情况是你需要在同一个方法中使用两个类——Jon 已经提到过——你会遇到冲突并且需要使用完整的命名空间——这很痛苦。即使你知道你不需要——未来的其他人可能需要这样做。并且可能也想抓住你:)。

    【讨论】:

      【解决方案3】:

      这里没有绝对的对与错,但将相似的类放在同一个命名空间中似乎是个好主意。

      您可以查看StreamReaderStringReader 作为框架中的类似示例。它们都实现了相同的接口 (TextReader),并且都在 System.IO 命名空间中,尽管 StringReader 类在从内存中的字符串读取时并没有执行任何实际的 I/O。

      无论你是否将类放在同一个命名空间中,你都应该尽量使类名唯一。如果您需要在同一个文件中同时使用这两个类,那么必须始终指定完整的命名空间会很麻烦。

      【讨论】:

      • 您还可以查看 Soap 和二进制格式化程序,您会发现它们有不同的命名空间。我认为我的例子更适用于这个问题:)
      • 我喜欢 Jon Skeet 的观点:它们是否应该在不同的命名空间中是另一个划分。 “您应该尝试使类名唯一”,这也是我的选择。谢谢大家。
      【解决方案4】:

      我会说,如果任何给定的代码将使用其中一个或另一个但不能同时使用两者,并且如果这两者在单独的程序集中实现,那可能是可以的。如果它们在同一个程序集中,或者如果一个类想要同时使用两者,那么我更喜欢不同的类名。

      【讨论】:

        【解决方案5】:

        如果解析器有一个基接口和一些特定的辅助类,但只在基接口上使用,第一个解决方案(不同的命名空间)是最好的。因为:

        • 可以分为不同的 组件
        • 每个解析器独立 来自其他

        【讨论】:

        • 但是即使您将类命名为 HtmlResumeParser 和 ExcelResumeParser,您也可以将它们分成不同的程序集。
        • 将它们放在同一个命名空间中并不能阻止您将它们放在单独的程序集中,从而使它们独立。
        • 如果你想为文件名提供命名空间,你可能无法为这个程序集提供不同的名称。
        • 名称如何决定解析器是否相互独立?
        • 如果您想将一个解析器的逻辑重用于另一个解析器,则必须添加 using。因此可以更好地控制解析器之间的依赖关系。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-03
        • 1970-01-01
        • 1970-01-01
        • 2019-03-01
        • 1970-01-01
        • 2013-04-17
        • 2018-01-16
        相关资源
        最近更新 更多