【问题标题】:Private nested class with multiple public methods具有多个公共方法的私有嵌套类
【发布时间】:2014-06-18 19:21:20
【问题描述】:

我有课来管理 3 个不同的上传操作:

internal class UploadManager
{
   internal UploadManager(UploadOperation uploadOperation)
   {
       switch (uploadOperation.OperationType)
       {
           //run different set of async tasks based on OperationType, 
           //using nested class Uploader
       }
   }


   private class Uploader
   {
        //do all upload work
   }
}

它们使用的 Wcf 操作合同中的 3 个操作与要发送的数据类型之间的区别。 这种情况下最好的架构是什么?制作 3 个不同的 Uploader 类?还是 1 类有 3 种方法?或者一个方法有 3 个重载的 1 个类?

总的来说,我应该使用嵌套类吗? 谢谢。

在 cmets 之后添加: 问:操作类型会随着时间而演变吗? 答:没有

问:你会添加更多吗? 答:是的(多 1-5 个)

问:它们(将)需要更多参数并且不会在所有类型之间共享吗? 答:没有

【问题讨论】:

  • 我会在 CodeReview 上发布这个而不是 SO,但是...IMO 我们需要另一个信息:操作类型会随着时间的推移而演变吗?你会添加更多吗?它们是否(将)需要更多的参数并且它们不会被所有类型共享?
  • 我们需要有关您尝试尝试的操作的更多信息。如果它们相似,您可以随时使用Generics,避免代码重复

标签: c# wcf oop architecture


【解决方案1】:

您应该避免在 UploadManager 中实例化类,而是提供一个 UploaderFactory 类来选择要使用的特定上传器。为此,Uploader 和 uploaderFactory 需要实现接口(IUploader 和 IUploaderFactory)。工厂有一个方法 - GetUploader(...),它返回一个正确类型的 Uploader 实例。

不需要私人课程 - 将其设为内部课程。最重要的是隔离功能,让一切都可测试。

所以是这样的:

interface IUploader
{
    void DoStuff();
}

interface IUploaderFactory
{
    IUploader GetUploader(UploadOperation uploadOperation);
}

internal class UploadManager
{
    internal UploadManager(IUploaderFactory uploaderFactory, UploadOperation uploadOperation)
    {
        var uploader = uploaderFactory.GetUploader(uploadOperation);

        //run different set of async tasks based on OperationType, 
        //using nested class Uploader
        uploader.DoStuff();
    }
}

internal class Uploader1 : IUploader
{
    public void DoStuff()
    {
        ...
    }
}

internal class Uploader2 : IUploader
{
    public void DoStuff()
    {
        ...
    }
}

internal class Uploader3 : IUploader
{
    public void DoStuff()
    {
        ...
    }
}

这种方法的主要好处是:

  • 您可以分别测试每个实例。例如 - 您测试工厂是否返回正确的上传器,然后在完全不同的测试集中测试特定的上传器。
  • 您可以轻松添加新的上传器,只需对代码进行最少的更改(只需修改新的上传器和工厂。哦,还有 UploadOperation 结构)。

这是一种模糊的答案,但我认为它解决了架构方法。

希望它有所帮助 - 祝你好运!

【讨论】:

    【解决方案2】:

    使用 KISS 原则,我会选择 1 个类和 3 个方法。

    【讨论】:

      猜你喜欢
      • 2016-04-30
      • 2011-12-08
      • 2021-07-12
      • 2020-04-01
      • 1970-01-01
      • 2014-08-06
      • 1970-01-01
      • 2014-02-01
      • 2011-12-06
      相关资源
      最近更新 更多