【问题标题】:Are there any patterns for reducing method counts?是否有任何减少方法计数的模式?
【发布时间】:2015-10-01 20:54:31
【问题描述】:

有一个类,它有两个方法。 (完整源码可以在here找到)

public string SearchAnime(string searchTerm)
{
    // returns string
}

public AnimeSearchResponse SearchAnimeDeserialized(string searchTerm)
{
    // returns an AnimeSearchResponse type object instance
}

我正在尝试创建上述两种方法的异步版本。 这意味着需要创建像 SearchAnimeAsyncSearchAnimeDeserializedAsync 这样的方法。

计划添加更多返回 XML 或 JSON 数据的 SearchAnime* 方法。 随着我添加更多SearchAnime* 方法,由于异步对应方法,方法的数量将增加两倍。 (SearchAnimeXml & SearchAnimeXmlAsync 和 SearchAnimeJson & SearchAnimeJsonAsync)

情况变得更糟,因为该类还包含 SearchMangaSearchMangaDeserialized,我将为它们创建异步版本。

是否有任何解决方案或设计模式可以缓解方法的爆炸式增长?

【问题讨论】:

  • 由于我们不知道这些方法实际上做什么,我们无法将它们融入任何模式,这使得这个问题过于宽泛。
  • 我希望大多数服务框架将提供“神奇”的序列化解决方案(即 WebAPI)......同时考虑通过没有同步版本来简化您的生活。这将为您提供一种方法:)
  • @Alexei 这真的取决于谁将调用该代码。有时async 在不可能的情况下带来的麻烦多于做好事。
  • 你可以合并SearchAnimeSearchManga。例如将签名更改为public string Search(string searchTerm, SearchType enum) 并在方法中使用条件。
  • 我知道的关于如何减少类中方法数量的最好方法是增加类的数量:)。例如,请参阅@Kapol 的答案。

标签: c# .net methods code-organization


【解决方案1】:

我想到的一个解决方案是创建一个Searcher 抽象基类(使用方法SearchSearchAsync)和一个ISearchResponse 接口(指定所有响应共有的行为)。那么每个Searcher-派生类将只有两个公开的方法。

public interface ISearchResponse
{
    void Foo();
}

public class AnimeSearchResponse : ISearchResponse
{
    public void Foo() {}
}

public abstract class Searcher
{
    abstract ISearchResponse Search();
    abstract ISearchResponse SearchAsync();
}

public class AnimeSearcher : Searcher
{
    public override ISearchResponse Search(string searchTerm)
    {
        return new AnimeSearchResponse(searchTerm);
    }

    public override ISearchResponse SearchAsync(string searchTerm)
    {
        return new AnimeSearchResponse(searchTerm);
    }
}

您最终会得到很多类而不是很多方法,但其优点是派生类型将更加专业化,并且可以在需要时轻松地相互替换。在应用程序的某个地方,您可以选择要使用的Searcher 的具体类型,例如使用 Factory 方法 设计模式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多