什么时候可以过早地退出循环/方法?

时间:2019-07-09 18:53:48

标签: loops methods logic

这是我在大学课堂上一直在思考的一个问题,我需要征服其他人的观点。我进行了搜索,但在编码实践方面找不到与这个问题非常相似的问题。

(示例用Java编写)
当我编写代码时,通常会编写如下方法:

public void myMethod(int one, int two) {
    if (one >= two) return;
    // do things

    if (two != one) return;
    // do other things
}

代替编写这样的方法:

public void myMethod(int one, int two) {
    if (one < two) {
        // do things
        if (two != one) {
            // do other things
        }
    }
}

类似地,我将这样编写循环:

for (int i = 0; i < x.length; i++) {
    if (x[i].getValue() > 4) continue;
    // do things

    if (!xConditionTwo) continue;
    // do other things
}

而不是这样:

for (int i = 0; i < x.length; i++) {
    if (x[i].getValue() <= 4) {
        // do things

        if (xConditionTwo) {
            // do other things
        }
    }
}

如此处所示,我按顺序查看内容(从顶部到底部),如果那不是我们想要的东西,而我不这样做,那么退出方法/循环对我来说是有意义的不需要else语句。

但是,当我与大学讲师交谈时,他们都同意,如果有人要编写这样的代码,他们将不会被录用,因为该人无法找出不需要使用continue /的算法。返回。

我对所有人的问题是:什么时候可以使用继续/返回来中断呢?为什么这被认为是不好的做法?如何避免在没有else的情况下使用if语句来避免额外的缩进?

1 个答案:

答案 0 :(得分:1)

这将是一个主要处理意见的问题,但是对于您的两个示例,我都会像您一样在第一行中使用continue / return,而在另一行中使用if语句。

int ocgToDelete = -1;
List < Object > objects = Lists.newArrayList();

pdPage = doc.getDocumentCatalog().getPages().get(0);
PDResources resources = pdPage.getResources();
PDFStreamParser parser = new PDFStreamParser(pdPage);
parser.parse();
objects = parser.getTokens();
int index = -1;
/* Looping through Tokens */
for (Object obj: objects) {
    index++;
    if (obj instanceof COSName) {
        PDPropertyList prop = resources
            .getProperties((COSName) obj);
        if (prop != null &&
            prop instanceof PDOptionalContentGroup) {
            String ocgName = ((PDOptionalContentGroup) prop)
                .getName();
            if (StringUtils.equals(ocgName, OCName)) {
                /*Found OCG to Delete */
                ocgToDelete = index;
                break;
            }

        }
    }
}

/*Generating New Tokens */
List < Object > newTokens = Lists.newArrayList();
for (int i = 0; i < pdParser.getTokens().size(); i++) {
    /*Skipping this token */
    if (i == ocgToDelete) {
        continue;
    }
    newTokens.add(pdParser.getTokens().get(i));
}
/*Updating page contents */
ByteArrayOutputStream pdfOutStream = new ByteArrayOutputStream();
PDStream newContents = new PDStream(doc);
OutputStream output = newContents
    .createOutputStream();
ContentStreamWriter writer = new ContentStreamWriter(output);
writer.writeTokens(newTokens);
output.close();
pdPage.setContents(newContents);
doc.save(pdfOutStream);
doc.close();

FileOutputStream out = new FileOutputStream(
    new File("test/emitted/OCGResult.pdf"));
out.write(pdfOutStream.toByteArray());
out.close();

对我来说,这样读起来更好,并且可以限制嵌套的if语句