如何使用非常相似的代码 if/else 语句正确重构这么大的代码?
How to correctly refactor this big and with very similar code if/else statements?
我正在尝试重构这段代码,它会变得更大,我想知道哪种方法更好。
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 的公共 class - 我们称它为 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);
如果您的 inheritance/implementation 层次结构不是这么简单,您应该能够强制进入这种状态。
我正在尝试重构这段代码,它会变得更大,我想知道哪种方法更好。
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 的公共 class - 我们称它为 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);
如果您的 inheritance/implementation 层次结构不是这么简单,您应该能够强制进入这种状态。