[英]Cleaning up alternating code
我有關於以下功能
bool flag = true;
while(true){
if(flag){
function1();
}else{
function2();
}
flag = !flag;
}
我正在看它,但看起來似乎並不干凈。 我只想在這兩個功能之間切換。 有沒有一種方法可以使此方法更簡潔,更易讀,還是只是保持這種方式? 因為現在我有5行代碼,看起來有些混亂。
PS: while(true)
實際上不是代碼的一部分,而只是它正在進行一段時間的演示。
恕我直言,還可以。 很明顯是什么意思。
您可以使用狀態模式。 盡管對於這么簡單的事情可能已經結束了。
剛發現:添加答案(由於引入了OP,因此在引入新信息時似乎比編輯更好)。
public IEnumerable<bool> AlternatingBools() {
bool cur = false;
while (true) {
yield return cur;
cur = !cur;
}
}
您可以制作類似C#的eqiv。 使用lambdas進行JQuery切換。
令人失望的是你不能只寫:
(flag) ? function1() : function2();
但這是無效的。
如果function1
和function2
返回相同的類型,則可以編寫:
var trash = (flag) ? function1() : function2();
這是否更具可讀性值得懷疑。
當然,也可以將所有內容放在一行上:
if (flag) function1(); else function2();
同樣,可讀性值得懷疑。 如果這種事情在您的代碼中很普遍,那么有人會說這是一個足夠普遍的習慣用法。 但是總的來說,我會在代碼審查中阻止類似的事情。
同樣,如果它在您的代碼中很普遍,您可以編寫一個方法來為您處理:
bool IfTrueFalseToggle(bool flag, Action trueFunc, Action falseFunc)
{
if (flag)
trueFunc();
else
falseFunc();
return !flag;
}
然后,您可以通過以下方式調用它:
flag = IfTrueFalseToggle(flag, function1, function2);
它可能需要一個更好的名稱,除非有大量使用它的代碼,否則我不會走那條路。 另外,您可能最終不得不編寫成千上萬種不同的相似方法來處理要使用它調用的所有不同類型的Action
或Func
。
考慮到所有問題,我想說的是,總體而言,您所擁有的將變得干凈。
這個怎么樣
bool flag = true;
while (true)
{
// xor operator
if (flag ^= true)
{
function1();
}
else
{
function2();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.