Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
If statement 没有if语句的编程?_If Statement_Coding Style_Functional Programming_Conventions - Fatal编程技术网

If statement 没有if语句的编程?

If statement 没有if语句的编程?,if-statement,coding-style,functional-programming,conventions,If Statement,Coding Style,Functional Programming,Conventions,我记得有一段时间(可能是几年前)我在Stackoverflow上读到了尽可能少的if测试编程的魅力。有点相关,但我认为重点在于使用许多小函数,这些函数返回由测试确定的值,具体取决于它们接收的参数。一个非常简单的例子是: int i = 5; bool iIsSmall = isSmall(i); 使用isSmall()如下所示: private bool isSmall(int number) { return (i < 10); } private bool isSmall

我记得有一段时间(可能是几年前)我在Stackoverflow上读到了尽可能少的if测试编程的魅力。有点相关,但我认为重点在于使用许多小函数,这些函数返回由测试确定的值,具体取决于它们接收的参数。一个非常简单的例子是:

int i = 5; 
bool iIsSmall = isSmall(i);
使用
isSmall()
如下所示:

private bool isSmall(int number)
{
    return (i < 10);
}
private bool isSmall(整数)
{
返回(i<10);
}
而不仅仅是这样做:

int i = 5;
bool isSmall;
if (i < 10) {
    isSmall = true;
} else {
    isSmall = false;
}
inti=5;
布尔伊斯梅尔;
如果(i<10){
isSmall=真;
}否则{
isSmall=假;
}
(逻辑上,此代码只是示例代码。它不是我正在制作的程序的一部分。)

我相信这样做的原因是因为它看起来更好,并且使程序员不太容易出现逻辑错误。如果正确地应用了这种编码约定,您几乎不会在任何地方看到If测试,除非函数的唯一目的是进行该测试

现在,我的问题是:有关于这项公约的任何文件吗?有没有任何地方可以看到这种风格的支持者和反对者之间的激烈争论?我试着搜索Stackoverflow的帖子,但我再也找不到了


最后,我希望这个问题不要被否决,因为我不是在要求解决问题。我只是希望听到更多关于这种编码风格的信息,并可能提高我将来将要做的所有编码的质量。

这真的是一种惯例吗?人们是否应该仅仅因为可能会对它感到沮丧而杀死minimal if构造

好的,如果语句趋向于失控,特别是如果随着时间的推移添加了许多特殊情况。一个又一个分支被添加,最后,没有人能够不花几个小时的时间和几杯咖啡就理解所有事情都在做什么

但是把所有的东西都放在不同的函数中真的是个好主意吗?代码应该是可重用的。代码应该是可读的。但是函数调用只是需要在源文件中进一步查找它。如果所有的If都是这样存放的,那么您只需一直在源文件中跳过。这是否支持可读性

或考虑一个IF语句,该语句不在任何地方重复使用。为了惯例,它真的应该进入一个单独的功能吗?这里也涉及一些开销。性能问题也可能与此相关


我想说的是:遵循编码约定是好的。风格很重要。但也有例外。只要试着编写适合您的项目的好代码,并牢记未来。归根结底,编码约定只是一种指导原则,它试图帮助我们在不强制执行任何内容的情况下生成好的代码。

我从未听说过这种情况。无论如何,我不知道它是怎么工作的。当然,拥有一个
iIsSmall
的唯一目的就是以后在它上面分支(可能与其他值结合使用)

我所听到的是一个论点,即完全避免使用像
iIsSmall
这样的变量
iIsSmall
只是存储您所做测试的结果,以便您以后可以使用该结果做出一些决策。那么,为什么不在需要做出决定的地方测试
i
的值呢?i、 e.而不是:

int i = 5; 
bool iIsSmall = isSmall(i);
...
<code>
...
if (iIsSmall) {
    <do something because i is small>
} else {
    <do something different because i is not small>
}
inti=5;
bool iIsSmall=isSmall(i);
...

...
如果(iIsSmall){
}否则{
}
只要写下:

int i = 5
...
<code>
...
if (isSmall(i)) {
    <do something because i is small>
} else {
    <do something different because i is not small>
}
inti=5
...

...
如有(i)(i)){
}否则{
}
这样你就可以在分支点上知道你实际上在做什么分支,因为它就在那里。在本例中,这并不难,但如果测试很复杂,您可能无法用变量名对整个内容进行编码

它也更安全。没有任何危险,名称
iIsSmall
会产生误导,因为您更改了代码,以便它在测试其他东西,或者因为调用
isSmall
后,
i
实际上被更改,因此它不必再小,或者因为有人刚刚选择了一个愚蠢的变量名,等等

显然,这并不总是有效的。如果
isSmall
测试非常昂贵,并且您需要多次对其结果进行分支,那么您不希望多次执行它。您可能也不想多次重复该调用的代码,除非它很琐碎。或者,您可能希望返回不知道
i
的调用者使用的标志(不过,您可以只返回
isSmall(i)
,而不是将其存储在变量中然后返回变量)


顺便说一句,在您的示例中,separate函数不保存任何内容。您可以将
(i<10)
包含在
bool
变量的赋值中,就像在
bool
函数的返回语句中一样简单。i、 你可以很容易地写出
bool isSmall=i<10-这避免了if语句,而不是单独的函数。形式为if(test){x=true;}else{x=false;}if(test){return true;}else{return false;}的代码总是愚蠢的;只需使用
x=test
返回测试

这整个“如果”与“不如果”的事情让我想到了1。基本上,观察到使用if语句或不使用if语句编程是一个封装和可扩展性问题,有时使用if语句2更好,有时使用方法/函数指针的动态调度更好

当我们想要建模时,有两个轴需要考虑:

  • 我们需要处理的输入的不同情况(或类型)
  • 我们希望对这些输入执行的不同操作
  • 实现这类事情的一种方法是使用if语句/模式匹配/vis
    data List = Nil | Cons Int List
    
    length xs = case xs of
      Nil -> 0
      Cons a as -> 1 + length x
    
    concat xs ys = case ii of
      Nil -> jj
      Cons a as -> Cons a (concat as ys)
    
    data List = {
        length :: Int
        concat :: (List -> List)
    }
    
    nil = List {
        length = 0,
        concat = (\ys -> ys)
    }
    
    cons x xs = List {
        length = 1 + length xs,
        concat = (\ys -> cons x (concat xs ys))
    }
    
    data Size = Big | Small
    
    toSize :: Int -> Size
    toSize n = if n < 10 then Small else Big
    
    someOp :: Size -> String
    someOp Small = "Wow, its small"
    someOp Big   = "Wow, its big"