2

我一直想知道在基于类的语言中分离代码的最佳实践是什么。例如,我做了一个项目来处理与我的 web api 的 api 交互。我想知道正确的选择是什么,或者其他建议。

示例 1

项目文件

  • API.cs
  • 数据类型
    • 动漫.cs
    • 情节.cs

API.cs

public class Api
{
    public static async Task<List<Anime>> GetAnimesByKeyword(string keyword)
    {
        // Execute api request to server
        return result;
    }

    public static async Task<List<Episode>> GetEpisodesByAnime(Anime anime)
    {
        // Execute api request to server
        return result;
    }

}

数据类型 -> Anime.cs

public class Anime
{
    public string Name { get; set; }
    public string Summary { get; set; }
    // Other properties
}

数据类型 -> Episode.cs

public class Episode
{
    public string Name { get; set; }
    public Date ReleaseDate { get; set; }
    // Other properties
}

或示例 2

项目文件

  • API.cs
  • 数据类型
    • 动漫.cs
    • 情节.cs

API.cs

public class Api
{
    // Nothing for now
}

数据类型 -> Anime.cs

public class Anime
{
    public static async Task<Anime> GetById(int id)
    {
        return result;
    }

    public string Name { get; set; }
    public string Summary { get; set; }
    // Other properties
}

数据类型 -> Episode.cs

public class Episode
{
    public static async Task<List<Episode>> GetEpisodesByAnime(Anime anime)
    {
        return result;
    }

    public string Name { get; set; }
    public Date ReleaseDate { get; set; }
    // Other properties
}

这两种方法中的哪一种是构建代码的首选方法,或者有更好的方法来做到这一点。这可能看起来微不足道,但对我来说确实很重要。

谢谢你的协助!

4

1 回答 1

2

一般来说,遵循单一职责原则。实际上,这意味着您拥有纯数据的简单对象和更复杂的服务类,它们的工作方式类似于从外部服务或数据库加载。

您的第二个示例混合了关注点,并将这两个类紧密地绑定在一起(Episode现在取决于Anime)。您还可以看到很难决定将加载方法放在哪个类上:应该是anime.GetEpisodes()还是Episode.GetEpisodesByAnime()?随着对象图变得越来越复杂,这种情况会升级。

稍后您可能希望为实体使用不同的数据传输对象。拥有简单的纯数据对象可以很容易地添加这些对象并用于Automapper转换。

但是(在您的第一个示例中)不要使用static方法,因为这会使您的服务类更难测试。一项服务可能依赖于另一项服务(使用依赖注入),并且要单独测试每个服务,您不希望使用静态方法。

于 2016-09-05T01:09:04.533 回答