[提问]如何对一个长达300行的函数做重构

yahle 2010-01-14 01:45:34

函数例子,实际的长度有300多行,其中200多行是对参数以及各种运行状态做判断。
如果方法成功,返回0,否则返回各种错误状态。

List<int> GetErrorParamTypes()
{
return new List<int>();
}

public int LongFun(int param1, int param2, int param3)
{
// 参数验证
if (param1 == 0 || param2 == 0 || param3 == 0)
return -1;

if (param1 == param2)
return -2;

foreach (var errorType in GetErrorParamTypes())
{
if (errorType == param1)
return -3;
}

if (param3 == 10)
return -4;

// 做一些数据操作
return 0;
}


目前根据验证的内容,做了一些分类,分成几个不同的验证函数,但是现在存在的一个问题是,每次调用验证函数,都需要判断一个返回值,如果验证成功则继续,否则返回验证函数返回的错误值。
现在就是在主函数里还需要多验证一次错误值这个地方感觉有点不漂亮,想问一下大家有没有什么好的代码模式可以参考。


public int LongFun2(int param1, int param2, int param3)
{
// 参数验证
if (param1 == 0 || param2 == 0 || param3 == 0)
return -1;

var ret = verify1(param1, param2);
if (ret != 0) // 验证是否成功
return ret;

ret = verify2(param3);
if (ret != 0)
return ret;

// 做一些数据操作
return 0;
}

/// <summary>
/// 验证分类1
/// </summary>
int verify1(int param1, int param2)
{

if (param1 == param2)
return -2;

foreach (var errorType in GetErrorParamTypes())
{
if (errorType == param1)
return -3;
}
return 0;
}

/// <summary>
/// 验证分类2
/// </summary>
int verify2(int param3)
{
if (param3 == 10)
return -4;
return 0;
}
...全文
278 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
鸭梨山大帝 2010-01-17
  • 打赏
  • 举报
回复
=_=!! 我所在公司,有些同仁一个函数里面有600行,把想做的事情在里面全做了... ...
一个存储过程1000多行.....
其中嵌套了 13层的SELECT...
类似 SELECT XXX FROM( SELECT XXX FROM (SELECT XXX FROM(,............) INNER JOIN xxx group by xxx) inner join XXX LEFTJOIN XXX.......................


[Quote=引用 6 楼 lianshaohua 的回复:]
太牛了。。。。公司没有代码规范?我们最长一个函数不能超过80行。。。。。。
否则没有办法维护。。。。。。
先读懂那段代码的功能,然后分为几个不同的子功能,只能这样慢慢的划分,边分还要边测试。。。。。。
还不如自己重新写过简单
[/Quote]
yahle 2010-01-17
  • 打赏
  • 举报
回复
up一次,没有回复的话明天就要结贴了
yahle 2010-01-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lianshaohua 的回复:]
太牛了。。。。公司没有代码规范?我们最长一个函数不能超过80行。。。。。。
否则没有办法维护。。。。。。
先读懂那段代码的功能,然后分为几个不同的子功能,只能这样慢慢的划分,边分还要边测试。。。。。。
还不如自己重新写过简单
[/Quote]

= =|| 代码是我写的。本来函数不是很长的,但是随着功能的增加一步步的走向了深渊。现在回过头来需要对代码做重构。代码功能上是不存在问题,关键是采用那种模式来重写会让代码更具备维护性。
yahle 2010-01-14
  • 打赏
  • 举报
回复
更正一下我的想法,我想我要如何写verify1函数,才能实现优化下面的代码。


var ret = verify1(param1, param2);
if (ret != 0) // 验证是否成功
return ret;



这次优化,我不想把代码写成这种模式。

var ret = verify1(param1, param2);
if (ret != 0) // 验证是否成功
return ret;

ret = verify2(param1, param2);
if (ret != 0) // 验证是否成功
return ret;

ret = verify3(param1, param2);
if (ret != 0) // 验证是否成功
return ret;

ret = verify4(param1, param2);
if (ret != 0) // 验证是否成功
return ret;


le562451 2010-01-14
  • 打赏
  • 举报
回复
顶~
Aslangg 2010-01-14
  • 打赏
  • 举报
回复
听说设计模式里有个状态模式
qqiuzaihui 2010-01-14
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 yahle 的回复:]
回到刚才的问题,我觉得这句写得不是很漂亮,有办法消除吗?
C# codeif (ret!=0)// 验证是否成功return ret;
[/Quote]
if (ret != 0) return ret;         // 验证是否成功

写成这样就漂亮了.
呵呵, 开个玩笑, 你这已经是最简洁的代码了. 还想要怎么优化呢?
ztenv 2010-01-14
  • 打赏
  • 举报
回复
没有办法,单就这一句,真的没有办法改,顶多加一个{}
yahle 2010-01-14
  • 打赏
  • 举报
回复
回到刚才的问题,我觉得这句写得不是很漂亮,有办法消除吗?

if (ret != 0) // 验证是否成功
return ret;
@井九 2010-01-14
  • 打赏
  • 举报
回复
如果代码流程很清晰的话,不一定要重构啊。。
ztenv 2010-01-14
  • 打赏
  • 举报
回复
太牛了。。。。公司没有代码规范?我们最长一个函数不能超过80行。。。。。。
否则没有办法维护。。。。。。
先读懂那段代码的功能,然后分为几个不同的子功能,只能这样慢慢的划分,边分还要边测试。。。。。。
还不如自己重新写过简单
yahle 2010-01-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 qldsrx 的回复:]
对于一定要验证的过程,是必须要添加验证的,如果说可以把多个参数验证合为一个参数验证,那也是可以考虑的,比如使用枚举类型枚举错误类型,每种类型之间可以通过位操作合并,这样就可以通过一个参数或者当前的各种错误状态。
[/Quote]

我对你说的理解得不是很清楚?
1.目前我们是把验证相同状态的代码合并成一个函数,这样可以拆分为验证5,6个不同状态的子函数。
2.示例用的是int返回,实际的代码里也是枚举类型,不过这个枚举类型不用按位操作,因为每次返回的错误状态就1种,不存在返回多种状态的可能性。
yahle 2010-01-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 fengjian_428 的回复:]
主函数验证错误值之后要做什么
[/Quote]

主函数验证后把错误信息返回给上一层。
fengjian_428 2010-01-14
  • 打赏
  • 举报
回复
主函数验证错误值之后要做什么
qldsrx 2010-01-14
  • 打赏
  • 举报
回复
对于一定要验证的过程,是必须要添加验证的,如果说可以把多个参数验证合为一个参数验证,那也是可以考虑的,比如使用枚举类型枚举错误类型,每种类型之间可以通过位操作合并,这样就可以通过一个参数或者当前的各种错误状态。
angel6709 2010-01-14
  • 打赏
  • 举报
回复
这个。。。。。不知道,拆开是正确的。build模式?

111,123

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧