基于类的环境中的关注点分离/代码结构(以c#为例)

本文关键字:结构 为例 代码 环境 于类 关注点 分离 | 更新日期: 2023-09-27 18:05:33

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

示例1

项目文件

  • Api.cs
  • 数据类型
    • Anime.cs
    • Episode.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;
    }
}

DataTypes -> animation .cs

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

DataTypes -> Episode.cs

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

或例2

项目文件

  • Api.cs
  • 数据类型
    • Anime.cs
    • Episode.cs

Api.cs

public class Api
{
    // Nothing for now
}

DataTypes -> animation .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
}

DataTypes -> 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
}

这两种方法中哪一种是构建代码的首选方法,或者有更好的方法来做到这一点?这似乎微不足道,但对我却很重要。

谢谢你的帮助!

基于类的环境中的关注点分离/代码结构(以c#为例)

一般来说,遵循单一职责原则。在实践中,这意味着你有简单的对象和更复杂的服务类,它们的工作就像从外部服务或数据库加载一样。

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

以后你可能会想要一个实体的不同的数据传输对象。使用简单的纯数据对象可以方便地添加这些对象并使用Automapper进行转换。

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