基于类的环境中的关注点分离/代码结构(以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
}
这两种方法中哪一种是构建代码的首选方法,或者有更好的方法来做到这一点?这似乎微不足道,但对我却很重要。
谢谢你的帮助!
一般来说,遵循单一职责原则。在实践中,这意味着你有简单的对象和更复杂的服务类,它们的工作就像从外部服务或数据库加载一样。
你的第二个例子混合了关注,并将这两个类紧密地绑定在一起(Episode
现在依赖于Anime
)。您还可以看到很难决定将加载方法放在哪个类上:应该是anime.GetEpisodes()
还是Episode.GetEpisodesByAnime()
?当对象图变得更复杂时,这种情况就会升级。
以后你可能会想要一个实体的不同的数据传输对象。使用简单的纯数据对象可以方便地添加这些对象并使用Automapper
进行转换。
但是(在您的第一个示例中)不要使用static
方法,因为这会使您的服务类更难测试。一个服务可能依赖于另一个服务(使用依赖注入),为了单独测试每个服务,您不希望使用静态方法。