为了账号安全,请及时绑定邮箱和手机立即绑定

解耦问题 - 改进和替代方案

解耦问题 - 改进和替代方案

C#
慕少森 2021-11-21 14:40:42
我正在学习 SOLID 原则——尤其是控制反转-DI-解耦,当我在审查我的一个代码时,我注意到这种方法(见下文)引起了我的注意。此代码将由任何需要读取 json 文件的方法调用,接受将用于查找 json 文件的字符串值。但是正如您所看到的(我简化了代码 - 为了本主题排除了异常处理),我不确定从哪里开始(有很多初始化或依赖项??发生了,我不确定在哪里开始)。这种方法/场景可以作为一个很好的选择开始吗?你认为我应该保留哪个?并且需要解耦?谢谢。public async Task<object> ReadJsonByKey(string jsonPath, string jsonKey){    // First - is it okay to have an initialization at this stage?    var value = new object();         // Second - is this fine to have this in the scope of this method?    using (TextReader reader = File.OpenText(jsonPath))      {        // Third -  Calling Jobject that accepts new instance of JsonTextReader        var jObject = await JObject.LoadAsync(new JsonTextReader(reader));         obj = jObject.SelectToken(jsonKey);    }    return value;}我问这个的原因也是因为(基于标准)松散耦合的东西可以很容易地测试 - 即单元测试[UnitTestSuite]    [TestCase1]        // Method should only be able to accept ".json" or ".txt" file    [TestCase2]        // JsonPath file is valid file system    [TestCase3]        // Method should be able to retrieve a node value based from a specific json and key    [TestCase4]        // Json-text file is not empty
查看完整描述

1 回答

?
函数式编程

TA贡献1807条经验 获得超9个赞

看起来您正试图将基础设施问题与应用程序代码分离。


假设是这种情况,您需要一个负责读取数据的类:


public interface IDataReader

{

     Task<object> ReadJsonByKey(string jsonPath, string jsonKey)

}

其实现将是您上面的代码:


public class DataReader : IDataReader

{

    public async Task<object> ReadJsonByKey(string jsonPath, string jsonKey)

    {

        // First - is it okay to have an initialization at this stage?

        var value = new object();     


        // Second - is this fine to have this in the scope of this method?

        using (TextReader reader = File.OpenText(jsonPath))  

        {

            // Third -  Calling Jobject that accepts new instance of JsonTextReader

            var jObject = await JObject.LoadAsync(new JsonTextReader(reader)); 

            obj = jObject.SelectToken(jsonKey);

        }

        return value;

    }

}

但是,这个类现在同时进行文件读取和反序列化,因此您可以进一步分为:


public class DataReader : IDataReader

{

    IDeserializer _deserializer;


    public DataReader(IDeserializer deserializer)

    {

        _deserializer = deserializer;

    }


    public async Task<object> ReadJsonByKey(string jsonPath, string jsonKey)

    {

        var json =  File.ReadAllText(jsonPath);


        return _deserializer.Deserialize(json, jsonKey);

    }

}

这意味着现在可以IDeserializer独立于文件系统依赖项进行单元测试。


但是,主要的好处应该是您现在可以IDataReader在对应用程序代码进行单元测试时模拟实现。


查看完整回答
反对 回复 2021-11-21
  • 1 回答
  • 0 关注
  • 171 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信