你能在没有重载方法的情况下调用第二个构造函数吗
Can you call a second constructor without an overload method
所以我有一个问题。这并不是真正的问题,因为代码仍然有效,但看起来很草率。
我需要两个构造函数。
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。事实是,正如您从代码中看到的那样,我实际上不需要在方法中使用任何布尔值,我只需要知道我想调用的是这个构造函数。
有更好的方法吗?
它被称为构造函数链接或嵌套:
public JsonQuery() : this(false) // or true
{
}
public JsonQuery(bool testing) // or optional parameter value
{
// use 'testing' here
}
会这样吗:
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()
初始化
您真的不需要两个构造函数 - 看起来您会从传入工作表中受益:
public JsonQuery(string worksheet)
{
SmartsheetQuery smartsheetQuery = new SmartsheetQuery();
jObject = JObject.Parse(smartsheetQuery.getJsonAsString(worksheet));
}
只需传入不同的工作表进行测试即可。
您可能会考虑的其他事情是设置用于测试的编译器指令
public JsonQuery()
{
SmartsheetQuery smartsheetQuery = new SmartsheetQuery();
#if TEST
jObject = JObject.Parse(smartsheetQuery.getJsonAsString(unitTestingWorkSheet));
#else
jObject = JObject.Parse(smartsheetQuery.getJsonAsString(currentWorkSheet));
#endif
}
看起来你的 class 违反了 Single Responsibility Principle,它既在确定数据又在解析数据。
在你的情况下,这个问题使得测试解析机制变得非常困难,因为它们在 class.
中交织在一起
另一种方法是让解析 class 依赖于某种数据提供程序接口。
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());
}
虽然所有工作都在构造函数中完成,但最好将其作为字符串提供或将整个 class 转换为静态方法。我假设这里省略了一些代码,并假设 class 比提供的更多。
所以我有一个问题。这并不是真正的问题,因为代码仍然有效,但看起来很草率。
我需要两个构造函数。
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。事实是,正如您从代码中看到的那样,我实际上不需要在方法中使用任何布尔值,我只需要知道我想调用的是这个构造函数。
有更好的方法吗?
它被称为构造函数链接或嵌套:
public JsonQuery() : this(false) // or true
{
}
public JsonQuery(bool testing) // or optional parameter value
{
// use 'testing' here
}
会这样吗:
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()
您真的不需要两个构造函数 - 看起来您会从传入工作表中受益:
public JsonQuery(string worksheet)
{
SmartsheetQuery smartsheetQuery = new SmartsheetQuery();
jObject = JObject.Parse(smartsheetQuery.getJsonAsString(worksheet));
}
只需传入不同的工作表进行测试即可。
您可能会考虑的其他事情是设置用于测试的编译器指令
public JsonQuery()
{
SmartsheetQuery smartsheetQuery = new SmartsheetQuery();
#if TEST
jObject = JObject.Parse(smartsheetQuery.getJsonAsString(unitTestingWorkSheet));
#else
jObject = JObject.Parse(smartsheetQuery.getJsonAsString(currentWorkSheet));
#endif
}
看起来你的 class 违反了 Single Responsibility Principle,它既在确定数据又在解析数据。
在你的情况下,这个问题使得测试解析机制变得非常困难,因为它们在 class.
中交织在一起另一种方法是让解析 class 依赖于某种数据提供程序接口。
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());
}
虽然所有工作都在构造函数中完成,但最好将其作为字符串提供或将整个 class 转换为静态方法。我假设这里省略了一些代码,并假设 class 比提供的更多。