Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何用非常相似的if/else语句正确地重构这么大的代码?_C#_If Statement_Refactoring - Fatal编程技术网

C# 如何用非常相似的if/else语句正确地重构这么大的代码?

C# 如何用非常相似的if/else语句正确地重构这么大的代码?,c#,if-statement,refactoring,C#,If Statement,Refactoring,我正在尝试重构这段代码,这段代码会更大,我想知道哪种方法更好 string obje = String.Empty; long userId = 0; long objNewId = 0; long objOldId = 0; string action = String.Empty; if (oldObject.GetType() == typeof(FooDto)) { obje = ConstantParams.WCFLOG_APPLICATION_Foo; FooDto

我正在尝试重构这段代码,这段代码会更大,我想知道哪种方法更好

string obje = String.Empty;
long userId = 0;
long objNewId = 0;
long objOldId = 0;
string action = String.Empty;

if (oldObject.GetType() == typeof(FooDto))
{
    obje = ConstantParams.WCFLOG_APPLICATION_Foo;
    FooDto newFoo = (FooDto)response.Data;
    FooDto oldFoo = (FooDto)oldObject;

    userId = newFoo.UserApplicationId;
    objNewId = newFoo.Id;
    objOldId = oldFoo.Id;
}
else if (oldObject.GetType() == typeof(BarDto))
{
    obje = ConstantParams.WCFLOG_APPLICATION_Bar;
    BarDto newBar = (BarDto)response.Data;
    BarDto oldBar = (BarDto)oldObject;

    userId = newBar.UserApplicationId;
    objNewId = newBar.Id;
    objOldId = oldBar.Id;
}

action = (objOldId == 0) ? ConstantParams.WCFLOG_APPLICATION_NEW : ConstantParams.WCFLOG_APPLICATION_UPD;

string message = Helper.GenerateMessage(action, obje, userId, objNewId);
问题是,写这样的东西是可能的,但我不知道这样的东西是否可能:

obje = ConstantParams.WCFLOG_APPLICATION_[[XXX]];
[[XXX]]Dto newItem = ([[XXX]]Dto)response.Data;
[[XXX]]Dto oldItem = ([[XXX]]Dto)oldObject;

userId = newItem .UserApplicationId;
objNewId = newItem .Id;
objOldId = oldItem .Id;

假设Foo、Bar和它们的对应项都继承或实现了一个包含Id和UserApplicationId的公共类,我们将其称为SuperclassDto,因为您没有指定,这可以简单到:

string obje = String.Empty;
long userId = 0;
long objNewId = 0;
long objOldId = 0;
string action = String.Empty;

obje = ConstantParams.WCFLOG_APPLICATION_Foo;

SuperclassDto newDto = (SuperclassDto)response.Data;
SuperclassDto oldDto = (SuperclassDto)oldObject;

userId = newFoo.UserApplicationId;
objNewId = newDto.Id;
objOldId = oldDto.Id;

action = (objOldId == 0) ? ConstantParams.WCFLOG_APPLICATION_NEW : ConstantParams.WCFLOG_APPLICATION_UPD;

string message = Helper.GenerateMessage(action, obje, userId, objNewId);

如果您的继承/实现层次结构不是这么简单,您应该能够强制进入这种状态。

关于重构工作代码的问题通常最好在次要问题上提出,但只是为了让您了解其他人,让其他人更好地理解您:动词是“重构”,而不是“重构”。我会更正的。这是一个不错的选择,但在使用
ConstantParams.xxx
时,我也会使用if/else,它可能会很大。现在我明白了。好的,那么给SuperclassDto添加一个getThing()方法,并在每个子类实现中返回适当的东西——或者初始化它。或者构建一个从类到对象的映射。例如,Foo将返回WCFLOG\u应用程序\u Foo。或者映射将是从Foo类到WCFLOG\u应用程序\u Foo。