我正在写一些代码,结果却让我觉得太难看了.反正我是否可以重构它以便我不使用嵌套的if语句?
def hours_occupied(date)
#assuming date is a valid date object
availability = get_work_hours(date)
focus = "work"
if availability.nil
availability = get_family_hours(date)
focus = "family"
if availability.nil
availability = get_friend_hours(date)
focus = "friends"
end
end
end
Run Code Online (Sandbox Code Playgroud)
我知道我可以做这样的事情以获得可用性
availability = get_work_hours(date) || get_family_hours(date) || get_friend_hours(date)
Run Code Online (Sandbox Code Playgroud)
但是如何相应地设置焦点变量?
好的,我想要一些意见,我怎么能解决这个方法的混乱!
它与许多嵌套的'if'语句有关.
但是我意识到我必须确切地知道方法失败的地方,目前在每个相应的'else'子句中我都记录错误(失败的'if'条件').
注意:忽略事物背后的任何逻辑,请关注样式和结构,因为我已经使所有的功能名称等等.
这是骨架结构:
public void MyMethod()
{
try
{
bool tryAgain = false;
string filename = DownloadFile();
if( IsFileFormatOk(filename) )
{
blah = GetBlah(filename);
if(blah.ID > 0)
{
if(ImportFile(filename)
{
string username = GetUserFromFile(filename);
if(isValidUser(username))
{
// few more levels to go
//
//
//
}
else
{
LogError(filename, ...); // specific to this if statement
tryAgain = true;
}
}
else
{
LogError(filename, ...); // specific to this if statement
tryAgain = true;
}
}
else
{ …Run Code Online (Sandbox Code Playgroud) 对Lines of code - (C)在嵌套 ifs 内运行的“ ”有任何性能影响吗?
if (condition_1)
{
/* Lines of code */ - (A)
if (condition_2)
{
/* Lines of code */ - (B)
if (condition_n)
{
/* Lines of code */ - (C)
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是否意味着您可以嵌套任意数量的 if 语句而不会影响包含在最后一个 if 语句末尾的代码的执行时间?
通常,当我想要打破一个语句时,我只是boolean为控制流设置了一个标志,但是我有一个带有许多嵌套If语句的特殊情况,我真的希望有一种方法可以通过一个简单的语句来突破几个.
在Java中,您可以命名一个循环然后中断到该位置; VBA有什么类似的东西,可以从If语句中的深层嵌套位置使用吗?我知道VBA有循环的语句(while,for等),所以我想知道Ifs 是否有类似的东西.
理想情况下,我想做一些事情:
If ...
*NAMED_IF*
If ...
If ...
:
*break out of NAMED_IF*
:
End If
End If
*Now We end up at this control position*
End If
Run Code Online (Sandbox Code Playgroud) 当特定单元格中包含特定值时,我想显示一个消息框.我用以下代码完成了这个;
If Range("P8") = "Y" Then
MsgBox "Message here"
End If
Run Code Online (Sandbox Code Playgroud)
这是在Worksheet_Changesub中,因此每次另一个单元格值更改时都会显示消息框.我试图通过添加一个布尔变量来解决这个问题,当第一次显示消息框时设置为true;
If Range("P8") = "Y" Then
If messageshown = False Then
messageshown = True
MsgBox "Message here"
Else
End If
Else
End If
Run Code Online (Sandbox Code Playgroud)
但是,每次更改工作表中的单元格时,仍会显示消息框.我有一种感觉它'; s到与我写的嵌套if语句,但尝试了各种不同的方式和在那里我下订单的方式做else和end if,但无济于事.
我正在处理创建列表的代码,然后应用"或"和"和"条件来执行进一步操作:
a= ["john", "carlos", "22", "70"]
if (("qjohn" or "carlos") in a) and (("272" or "70") in a):
print "true"
else:
print "not true"
Run Code Online (Sandbox Code Playgroud)
输出:
not true
Run Code Online (Sandbox Code Playgroud)
当我这样做:
a= ["john", "carlos", "22", "70"]
if ("qjohn" or "cdarlos" in a) and ("272" or "d70" in a):
print "true"
else:
print "not true"
Run Code Online (Sandbox Code Playgroud)
输出是 "true"
我没有得到的**carlos and 70**应该是真实的,但它打印"不真实".这个错误的原因是什么?谢谢
我有一列体重指数 (BMI) 范围,我想将其自动分组到另一列中的类别或存储桶中。它看起来像这样:
\n\ncolA colB\n\nBMI BMI Grouping\n23.11 BMI \xe2\x89\xa5 18.5 - 24.9\n22.66 BMI \xe2\x89\xa5 18.5 - 24.9\n33.55 BMI \xe2\x89\xa5 30 - 34.9\n40.12 BMI \xe2\x89\xa5 35\n\nRun Code Online (Sandbox Code Playgroud)\n\n我有 5 个“BMI 分组”类别,我想将 BMI 范围分类为:
\n\n请教我 Google 表格所需的公式或代码。
\n考虑下面的C代码。
#include <stdio.h>
#define foo(x) if (x>0) printf("Ouch\n");
int main()
{
int a = 4;
int b = -3;
if(a>b)
foo(b) ;
else
printf("Arrg!\n");
printf("thanks\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
该程序运行时,出现错误提示error: ‘else’ without a previous ‘if’。当我们更换foo(b)与if (b>0) printf("Ouch\n")根据宏定义,不应该将程序转移到下面的代码时,用大括号写的?
if(a>b){
if(x>0){
printf("Ouch\n");
}
}
else{
printf("Arrh!\n");
}
printf("thanks\n");
Run Code Online (Sandbox Code Playgroud)
我不明白为什么编译器会抱怨。该程序实际上转移到了什么?
谢谢
我有一个包含稀疏数据的人性化工作表:
PART | FRUIT
---------------
Alpha |
| Apples
| Pears
Beta |
| Lemons
| Oranges
Run Code Online (Sandbox Code Playgroud)
我想创建第二个自动更新的机器友好工作表,该工作表将填充 PART 列中的所有空单元格:
PART | FRUIT
---------------
Alpha |
Alpha | Apples
Alpha | Pears
Beta |
Beta | Lemons
Beta | Oranges
Run Code Online (Sandbox Code Playgroud)
我可以在机器友好的工作表上的“水果”列中保留空白单元格。但理想情况下我希望删除这些行:
PART | FRUIT
---------------
Alpha | Apples
Alpha | Pears
Beta | Lemons
Beta | Oranges
Run Code Online (Sandbox Code Playgroud)
如果我想在机器友好的工作表中使用插值,我会依靠MATCH 技巧或FILTER 粘贴到任何地方的公式。
但我真的想避免在添加、更改或删除原始工作表中的行时更新机器友好的工作表。(如果我向原始工作表添加新列,则必须更新它,我没问题。)这意味着使用手动插值是禁止的。
理想的情况是,我会在第二张纸上输入一个魔法={ARRAYFORMULA()}或=QUERY某种魔法,然后就不管它了。
={ ARRAYFORMULA(MAGIC(PART)), FRUIT }
但到目前为止,我还无法思考如何解决这个问题。有什么建议么?
假设您有一个怪物对象的下表:
| 性别 | 年龄 | 类型 | 结果 |
|---|---|---|---|
| 男性 | 年轻的 | 火 | 1 |
| 男性 | 老的 | 冰 | 2 |
| 男性 | 老的 | 木头 | 6 |
| 女性 | 年轻的 | 火 | 4 |
| 女性 | 老的 | 冰 | 5 |
| 女性 | 老的 | 木头 | 8 |
| 其他 | 年轻的 | 火 | 7 |
| 其他 | 老的 | 冰 | 10 |
| 其他 | 老的 | 木头 | 20 |
如果我有一个怪物并输入它来得到结果;在不使用长嵌套 if-else 语句的情况下,如何获得怪物对象的结果?
if(monster.Gender == Male && monster.Age == Old)
if(monster.Type == Ice)
return 2
if(monster.Type == Wood)
return 6
if(monster.Gender == Male && monster.Age == Young)
etc...
Run Code Online (Sandbox Code Playgroud)
我似乎无法全神贯注于使其可扩展,例如:说我想在将来添加一列,或者想在另一件事之前验证某件事。
是否有任何简单的设计模式或类似的东西我可以实现来简化它并使其可扩展?
nested-if ×10
if-statement ×4
vba ×2
vlookup ×2
break ×1
c ×1
c# ×1
c++ ×1
control-flow ×1
excel ×1
excel-vba ×1
list ×1
match ×1
performance ×1
python ×1
refactoring ×1
ruby ×1