【问题标题】:Can you call a second constructor without an overload method你能在没有重载方法的情况下调用第二个构造函数吗
【发布时间】:2015-03-27 04:23:53
【问题描述】:

所以我有一个问题。这不是一个真正的问题,因为代码仍然有效,但看起来很草率。

我需要有两个构造函数。

public class JsonQuery
{
    const string currentWorkSheet = "GLHTanneryData_CurrentWeek";
    const string unitTestingWorkSheet = "GLHTanneryData_UnitTesting";
    private const string authorisation = "XXXX";
    JObject jObject;

    public JsonQuery()
    {
        SmartsheetQuery smartsheetQuery = new SmartsheetQuery();
        jObject = JObject.Parse(smartsheetQuery.getJsonAsString(currentWorkSheet));
    }

    public JsonQuery(bool testing)
    {
        SmartsheetQuery smartsheetQuery = new SmartsheetQuery();
        jObject = JObject.Parse(smartsheetQuery.getJsonAsString(unitTestingWorkSheet));
    }
}

每个都从 smartsheets 上的不同位置获取一个 json 文件。因此,为了调用第二个构造函数,我只需为其提供一个布尔值 true。问题是,正如您从代码中看到的那样,我实际上不需要在方法中使用任何布尔值,我只需要知道这是我想要调用的构造函数。

有更好的方法吗?

【问题讨论】:

    标签: c# json constructor linq-to-json


    【解决方案1】:

    您可能会考虑为测试设置编译器指令

    public JsonQuery()
    {
        SmartsheetQuery smartsheetQuery = new SmartsheetQuery();
    #if TEST
        jObject = JObject.Parse(smartsheetQuery.getJsonAsString(unitTestingWorkSheet));
    #else
        jObject = JObject.Parse(smartsheetQuery.getJsonAsString(currentWorkSheet));
    #endif
    }
    

    【讨论】:

    • 我不确定编译器指令是什么?
    【解决方案2】:

    看起来你的类违反了Single Responsibility Principle,它既在确定数据又在解析它。

    在您的情况下,这个问题使得测试解析机制变得非常困难,因为它们在类中交织在一起。

    另一种方法是让解析类依赖于某种数据提供者接口。

    public interface ISmartSheetProvider
    {
        string GetJsonData();
    }
    
    public class ProductionSmartSheetProvider : ISmartSheetProvider
    {
        public string GetJsonData()
        {
            return new SmartsheetQuery().getJsonAsString("GLHTanneryData_CurrentWeek"));
        }
    }
    
    public class MockSmartSheetProvider : ISmartSheetProvider
    {
        public string GetJsonData()
        {    
            return "..."; // whatever test data.
        }
    }
    
    public class JsonQuery(ISmartSheetProvider smartSheetProvider)
    {
        jObject = jObject.Parse(smartSheetProvider.GetJsonData());
    }
    

    虽然所有工作都在构造函数中完成,但最好将其作为字符串提供或将整个类转换为静态方法。我假设这里省略了一些代码,并假设该类比提供的更多。

    【讨论】:

    • 嗨,马特,我真的很感激这一点,但我打算将类外数据的字符串移动到配置文件中。
    【解决方案3】:

    您实际上并不需要两个构造函数 - 看起来您会从传入工作表中受益:

     public JsonQuery(string worksheet)
     {
        SmartsheetQuery smartsheetQuery = new SmartsheetQuery();
        jObject = JObject.Parse(smartsheetQuery.getJsonAsString(worksheet));    
     }
    

    只需传入不同的工作表进行测试。

    【讨论】:

      【解决方案4】:

      这样可以吗:

      public JsonQuery(bool testing = false)
      {
          SmartsheetQuery smartsheetQuery = new SmartsheetQuery();
      
          if (testing)
               jObject = JObject.Parse(smartsheetQuery.getJsonAsString(unitTestingWorkSheet));
          else
               jObject = JObject.Parse(smartsheetQuery.getJsonAsString(currentWorkSheet));
      }
      

      那么对于非测试你只需要初始化new JsonQuery()

      【讨论】:

        【解决方案5】:

        这称为构造函数链接或嵌套:

        public JsonQuery() : this(false) // or true
        {
        }
        
        public JsonQuery(bool testing) // or optional parameter value
        {
            // use 'testing' here
        }
        

        【讨论】:

          猜你喜欢
          • 2014-02-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-22
          • 2016-06-04
          • 2011-12-15
          • 2021-01-03
          • 2022-01-15
          相关资源
          最近更新 更多