突然发现这样一个问题

moondreamyou 2010-02-02 01:58:34
比如一个函数:

void Methor()
{
int a=1;
if(a!=1)
return;//如果a!=1就停止执行

int b=1;
if(b!=1)
return;//如果b!=1就停止执行

int c=1;
if(c!=1)
return;//如果c!=1就停止执行

...

Response.Write("结束");

}

发现这样写很多重复代码,于是决定单独写一个比较函数,如下:

Compare(int value)
{
if(value!=1)
return ?
}

问题就在这里,这个函数应该返回什么类型?Methor()方法里面又应该怎么调用Compare()? 这里应该如何重构优化代码呢?





...全文
207 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
moondreamyou 2010-02-11
  • 打赏
  • 举报
回复
引用 32 楼 tel15907250537 的回复:
void Methor()
{
/*
int a=1;
if(a!=1)
return;//如果a!=1就停止执行

int b=1;
if(b!=1)
return;//如果b!=1就停止执行

int c=1;
if(c!=1)
return;//如果c!=1就停止执行

...
///
if(Compare(a))
return ;


Response.Write("结束");

}

发现这样写很多重复代码,于是决定单独写一个比较函数,如下:

bool Compare(int value)
{
if(value!=1)
return true
ekse
return false

}


即使这样改你的代码还是很多重复。
按你改的:


void Methor()
{
/*
int a=1;
if(Compare(a))
return;//如果a!=1就停止执行

int b=1;
if(Compare(b))
return;//如果b!=1就停止执行

int c=1;
if(Compare(c))
return;//如果c!=1就停止执行

...

Response.Write("结束");
}

bool Compare(int value)
{
if(value!=1)
return true;
else
return false;
}


tel15907250537 2010-02-03
  • 打赏
  • 举报
回复
void Methor()
{
/*
int a=1;
if(a!=1)
return;//如果a!=1就停止执行

int b=1;
if(b!=1)
return;//如果b!=1就停止执行

int c=1;
if(c!=1)
return;//如果c!=1就停止执行

...
///
if(Compare(a))
return ;



Response.Write("结束");

}

发现这样写很多重复代码,于是决定单独写一个比较函数,如下:

bool Compare(int value)
{
if(value!=1)
return true
ekse
return false

}
  • 打赏
  • 举报
回复
看你怎么定义这个方法的类型了
asslin 2010-02-03
  • 打赏
  • 举报
回复
Thread thread;
void DOMethor()
{
thread=new Thread(methor);
thread.Start();
}
methor()
{
compore
}
compore(int value)
{
if(thread.IsAlived)thread.Abort();
}
moondreamyou 2010-02-03
  • 打赏
  • 举报
回复
对于在methor()外结束methor的确有难度。
moondreamyou 2010-02-03
  • 打赏
  • 举报
回复
ckl881003的方法挺特别,不过开销比较大。
bwangel 2010-02-02
  • 打赏
  • 举报
回复

void Main()
{
int a=1;
if(Compare(a))
{
//do you want...
}
...
}

bool Compare(int value)
{
return value!=1;
}
sic_hcq 2010-02-02
  • 打赏
  • 举报
回复
int result;
int a = 1;
int b = 1;
int c = 1;

bool Comp(int parm, out int result)
{
//do some for result
return parm!=1;
}

if(Comp(a, out result))
{
//do some for result
return;
}
....

不知道这样可以吗??
自由建客 2010-02-02
  • 打赏
  • 举报
回复
什么跟什么呀!楼主要的是少写点代码,能够把 if(a!=1) return; 缩短点。除了宏我没想出更简单的方案。
C/C++ 很简单,C# 的宏怎么用,等楼下。
前面代码怎么没发上来?
#define COMP(x,v) \
do { \
if(x!==v) return; \
} while(0)

void Methor()
{
int a=1;
COMP(a,1); //如果a!=1就停止执行

int b=1;
COMP(b,1); //如果b!=1就停止执行

int c=1;
COMP(c,1); //如果c!=1就停止执行

...

Response.Write("结束");
}
自由建客 2010-02-02
  • 打赏
  • 举报
回复
什么跟什么呀!楼主要的是少写点代码,能够把 if(a!=1) return; 缩短点。除了宏我没想出更简单的方案。
C/C++ 很简单,C# 的宏怎么用,等楼下。
#define COMP(x,v) \
do { \
if(x!==v) return; \
} while(0)

void Methor()
{
int a=1;
COMP(a,1); //如果a!=1就停止执行

int b=1;
COMP(b,1); //如果b!=1就停止执行

int c=1;
COMP(c,1); //如果c!=1就停止执行

...

Response.Write("结束");
}
lgf11088 2010-02-02
  • 打赏
  • 举报
回复
方法前面的都已说了,自己试试吧
moondreamyou 2010-02-02
  • 打赏
  • 举报
回复
回复yfqvip:
我不是为了专这个牛角尖而来的,问这个问题也不是没意义的,而是在实际中我的确有类似的问题遇到了,我如果把涉及代码全部贴上来,阅读起来非常麻烦,所以我只用了简单的int a,Change()这样的来代替,我觉得这样就够了,初学者也能看得懂。关于这个问题我想了很久,没有什么比较好的方法,可能是我设计模式学得不够好,但我这里发问就是想看看大家有没有好的方法去处理,比如xray2005的方法是可以考虑的,你最后的ref的方法也可以考虑。说多了,希望你别介意。
ckl881003 2010-02-02
  • 打赏
  • 举报
回复

void Methor()
{
try
{
Compar(a);
...
}
catch
{
//结束方法了
}
}


void Compare(int value)
{
if(value!=1)
throw new Exception;
}

十八道胡同 2010-02-02
  • 打赏
  • 举报
回复
xray2005的方法很不错的。
满衣兄 2010-02-02
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 moondreamyou 的回复:]
请大家认真审题后再回答,现在就只有xray2005比较明白我的想法。
[/Quote]
既然你已经有答案了就按照他的方法写吧。
满衣兄 2010-02-02
  • 打赏
  • 举报
回复
你要是想取值就加个ref参数就是了,何必搞的这么麻烦,而且根据你写的这个例子来看根本就不需要单独写个函数。你想要问什么问题就直接把你的代码贴出来,而不是举这种不着边际的例子。就你这个例子而言是毫无意义的。还是那句话,这是个最低层的问题,就像在问4=3+1怎么换成4=2+2一样,如果整天计较这种钻牛角尖问题就很恐怖了。
moondreamyou 2010-02-02
  • 打赏
  • 举报
回复
请大家认真审题后再回答,现在就只有xray2005比较明白我的想法。
moondreamyou 2010-02-02
  • 打赏
  • 举报
回复
这里问的不完全是重构的问题,请耐心阅读:

比如这部分你如果单独写在另一个方法里,比如Change(),return就不是原来的Methor的return了,
而是Change的return。


Methor()
{
int a=1;
if(a!=1) //这里的a!=1只是随便写的一个逻辑,实际中可能是调用方法如if(Change(a)==0)
return;
...
}


如果你用

if(Change(a)==0||Change(b)==0||Change(c)==0)
return;


那么你的Change(a)的返回值就取不到,实际中可能要去,如果你要取,就必须改为:

int aa=Change(a);
if(aa==0)
return;

int bb=Change(b);
if(bb==0)
return;
...



这时,又变回一开始的样子了,是不是很有趣,不知道你这样明白没有?

如果你还要改,也许你会想用:

int aa=Change(a);
int bb=Change(b);
int cc=Change(c);
if(aa==0||bb==0||cc==0)
return;


这样就不行了,因为你是调用了3次Change才return的,而我可能压根到不了3次就return停止了。
moondreamyou 2010-02-02
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 yfqvip 的回复:]
一样的啊,你把公共部分都提取放在Compare中就是了,这种问题根本就没必要问,这是最低层次的最基本的东西,完全是根据你个人的风格来写就行了,你自己觉得怎么样好看就怎么写。
[/Quote]

这里问的不完全是重构的问题,请耐心阅读:

比如这部分你如果单独写在另一个方法里,比如Change(),return就不是原来的Methor的return了,而是Change的return;
int a=1;
if(a!=1)
return;

如果你用
if(Change(a)==0||Change(b)==0||Change(c)==0)
return;
那么你的Change(a)的返回值就取不到,如果你要取,就必须改为:

int aa=Change(a);
if(aa==0)
return;

int bb=Change(b);
if(bb==0)
return;
...

这时,又变回一开始的样子了,是不是很有趣,不知道你这样明白没有?

如果你还要改,也许你会想用:
int aa=Change(a);
int bb=Change(b);
int cc=Change(c);
if(aa==0||bb==0||cc==0)
return;
这样就不行了,因为你是调用了3次Change才return的,而我可能压根到不了3次就return停止了。



mengfanzongfox 2010-02-02
  • 打赏
  • 举报
回复
哎备具啊
加载更多回复(13)

17,740

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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