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

时间:2016-09-05 00:35:10

标签: c# class structure soc

我一直想知道在基于类的语言中分离代码的最佳实践是什么。作为一个例子,我创建了一个项目来处理与我的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;
    }

}

数据类型 - &gt; Anime.cs

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

数据类型 - &gt; 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
}

数据类型 - &gt; 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
}

数据类型 - &gt; 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
}

这两个是结构化代码的首选方法,还是有更好的方法。这看起来似乎微不足道,但它对我来说很重要。

感谢您帮助我!

1 个答案:

答案 0 :(得分:2)

一般情况下,请按照Single Responsibility Principle进行操作。在实践中,这意味着您拥有仅数据的简单对象和更复杂的服务类,这些服务类的工作方式类似于从外部服务或数据库加载。

你的第二个例子混合了关注点,它紧紧地将这两个类绑定在一起(Episode现在依赖于Anime)。您还可以了解如何确定将该加载方法放在哪个类上:它应该是anime.GetEpisodes()还是Episode.GetEpisodesByAnime()?随着对象图变得越来越复杂,这会升级。

稍后您可能希望为实体提供不同的数据传输对象。拥有简单的纯数据对象可以轻松添加这些对象并使用Automapper进行转换。

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