你可以调用没有重载方法的第二个构造函数

时间:2015-03-27 04:23:53

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

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

我需要有两个构造函数。

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));
    }
}

每个人都从智能表中的不同位置抓取一个json文件。所以为了调用第二个构造函数,我只需要为它提供一个布尔值true。事情就是这样,从代码中可以看出,我实际上并不需要在方法中使用任何布尔值,我只需要知道这是我想调用的构造函数。

有更好的方法吗?

5 个答案:

答案 0 :(得分:2)

您可能考虑的其他事情是设置用于测试的编译器指令

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

答案 1 :(得分: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());
}

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

答案 2 :(得分:1)

会是这样的:

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()

进行初始化

答案 3 :(得分:1)

您真的不需要两个构造函数 - 看起来您可以从传入工作表中受益:

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

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

答案 4 :(得分:0)

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

public JsonQuery() : this(false) // or true
{
}

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