{"id":10006234,"date":"2022-08-17T16:21:30","date_gmt":"2022-08-17T08:21:30","guid":{"rendered":"https:\/\/ityet.com\/?p=10006234"},"modified":"2022-08-17T16:21:30","modified_gmt":"2022-08-17T08:21:30","slug":"%e4%bb%a3%e7%a0%81%e5%9c%88%e5%a4%8d%e6%9d%82%e5%ba%a6%e6%b2%bb%e7%90%86%e5%b0%8f%e7%bb%93","status":"publish","type":"post","link":"https:\/\/itmax.cn\/?p=10006234","title":{"rendered":"\u4ee3\u7801\u5708\u590d\u6742\u5ea6\u6cbb\u7406\u5c0f\u7ed3"},"content":{"rendered":"<p>\u7b80\u4ecb\uff1a\u00a0\u6211\u4eec\u4e00\u76f4\u5728\u8bf4\u7cfb\u7edf\u5f88\u590d\u6742\uff0c\u90a3\u5230\u5e95\u4ec0\u4e48\u662f\u7cfb\u7edf\u590d\u6742\u5ea6\u5462\uff1f\u4f5c\u4e3a\u56e2\u961f\u7684\u7a33\u5b9a\u6027\u5e95\u76d8\u8d1f\u8d23\u4eba\uff0c\u4e5f\u7ecf\u5e38\u548c\u5927\u5bb6\u63a2\u8ba8\u4e3a\u4ec0\u4e48\u4f1a\u56e0\u4e3a\u5708\u590d\u6742\u5ea6\u9ad8\u800c\u88ab\u6263\u5206\u3002\u90a3\u4e48\uff0c\u600e\u4e48\u624d\u80fd\u5199\u7684\u4e00\u624b\u53ef\u8bfb\uff0c\u53ef\u6269\u5c55\uff0c\u53ef\u7ef4\u62a4\u7684\u597d\u4ee3\u7801\uff1f\u672c\u6587\u4f5c\u8005\u5c1d\u8bd5\u7ed3\u5408\u5728\u56e2\u961f\u5185\u90e8\u7684\u5b9e\u8df5\uff0c\u5206\u4eab\u4e0b\u8fc7\u7a0b\u4e2d\u5fc3\u5f97\u3002<br \/><img decoding=\"async\" referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/remote\/1460000042333300\" alt=\"\u56fe\u7247\" title=\"\u56fe\u7247\" loading=\"lazy\"><br \/>\u4f5c\u8005 | \u9648\u80dc\u5229(\u674e\u6e14)\u6765\u6e90 | \u963f\u91cc\u5f00\u53d1\u8005\u516c\u4f17\u53f7\u7f51\u4e0a\u6709\u4e2a\u6bb5\u5b50\uff0c\u8bf4\u5efa\u7b51\u5de5\u7a0b\u5e08\u4e0d\u4f1a\u8f7b\u6613\u7b54\u5e94\u4f1a\u7ed9\u6469\u5929\u5927\u697c\u589e\u52a0\u4e00\u4e2a\u5730\u4e0b\u5ba4\uff0c\u4f46\u4ee3\u7801\u5f00\u53d1\u5de5\u7a0b\u5e08\u5374\u7ecf\u5e38\u5728\u5e72\u8fd9\u6837\u7684\u4e8b\uff0c\u5e76\u4e14\u603b\u6709\u4eba\u4f1a\u5bf9\u4f60\u8bf4\u201c\u8fd9\u4e2a\u9700\u6c42\u5f88\u7b80\u5355\u201d\u3002\u5230\u571f\u91cc\u57cb\u4e2a\u96f7\uff0c\u8fd9\u786e\u5b9e\u4e0d\u590d\u6742\uff0c\u4f46\u6211\u4eec\u5f80\u5f80\u9762\u4e34\u7684\u771f\u5b9e\u573a\u666f\u5176\u5b9e\u662f\u201c\u5728\u4e00\u7247\u96f7\u533a\u7684\u571f\u91cc\u57cb\u4e00\u4e2a\u96f7\u201d\u3002\u800c\u96f7\u533a\u91cc\u54ea\u91cc\u6709\u96f7\uff0c\u4efb\u4f55\u4eba\u90fd\u4e0d\u77e5\u9053\u3002\u56de\u5230\u6211\u4eec\u65e5\u5e38\u7684\u5199\u4ee3\u7801\u7684\u573a\u666f\uff0c\u6211\u4eec\u4e00\u76f4\u5728\u8bf4\u7cfb\u7edf\u5f88\u590d\u6742\uff0c\u90a3\u5230\u5e95\u4ec0\u4e48\u662f\u7cfb\u7edf\u590d\u6742\u5ea6\u5462\uff1f\u6700\u8fd1\u51e0\u4e2a\u6708\uff0c\u8682\u8681\u4ee3\u7801\u529b\u5e73\u53f0\uff08\u6ce8\uff1a\u662f\u8682\u8681\u7684\u4ee3\u7801\u8bc4\u4ef7\u5e73\u53f0\uff09\u8fdb\u5165\u5927\u5bb6\u89c6\u91ce\uff0c\u5f88\u591a\u540c\u5b66\u5f00\u59cb\u5173\u6ce8\u8d77\u81ea\u5df1\u4ee3\u7801\u529b\u7684\u5f97\u5206\u60c5\u51b5\u3002\u4f5c\u4e3a\u56e2\u961f\u7684\u7a33\u5b9a\u6027\u5e95\u76d8\u8d1f\u8d23\u4eba\uff0c\u4e5f\u7ecf\u5e38\u548c\u5927\u5bb6\u63a2\u8ba8\u4e3a\u4ec0\u4e48\u4f1a\u56e0\u4e3a\u5708\u590d\u6742\u5ea6\u9ad8\u800c\u88ab\u6263\u5206\u3002\u90a3\u4e48\uff0c\u600e\u4e48\u624d\u80fd\u5199\u7684\u4e00\u624b\u53ef\u8bfb\uff0c\u53ef\u6269\u5c55\uff0c\u53ef\u7ef4\u62a4[\u6ce81]\u7684\u597d\u4ee3\u7801\uff1f\u672c\u6587\u4f5c\u8005\u5c1d\u8bd5\u7ed3\u5408\u5728\u56e2\u961f\u5185\u90e8\u7684\u5b9e\u8df5\uff0c\u5206\u4eab\u4e0b\u8fc7\u7a0b\u4e2d\u5fc3\u5f97\uff0c\u5e0c\u671b\u5bf9\u5927\u5bb6\u7684\u4ee3\u7801\u5708\u590d\u6742\u5ea6\u6cbb\u7406\u63d0\u4f9b\u5fae\u5f31\u7684\u5e2e\u52a9\u3002\u4ec0\u4e48\u662f\u5708\u590d\u6742\u5ea6\u5148\u770b\u770b\u5708\u590d\u6742\u5ea6\u7684\u901a\u7528\u7684\u5b9a\u4e49\uff0c\u5708\u590d\u6742\u5ea6\uff08Cyclomatic complexity\uff0c\u7b80\u5199CC\uff09[\u6ce82]\u4e5f\u79f0\u4e3a\u6761\u4ef6\u590d\u6742\u5ea6\/\u5faa\u73af\u590d\u6742\u5ea6\uff0c\u662f\u4e00\u79cd\u4ee3\u7801\u590d\u6742\u5ea6\u7684\u8861\u91cf\u6807\u51c6\u3002\u7531\u6258\u9a6c\u65af\u00b7J\u00b7\u9ea6\u51ef\u5e03\uff08Thomas J. McCabe, Sr.\uff09\u4e8e1976\u5e74\u63d0\u51fa\uff0c\u7528\u6765\u8868\u793a\u7a0b\u5e8f\u7684\u590d\u6742\u5ea6\uff0c\u5176\u7b26\u53f7\u4e3aVG\u3002\u5b83\u53ef\u4ee5\u7528\u6765\u8861\u91cf\u4e00\u4e2a\u6a21\u5757\u5224\u5b9a\u7ed3\u6784\u7684\u590d\u6742\u7a0b\u5ea6\uff0c\u6570\u91cf\u4e0a\u8868\u73b0\u4e3a\u72ec\u7acb\u73b0\u884c\u8def\u5f84\u6761\u6570\uff0c\u4e5f\u53ef\u7406\u89e3\u4e3a\u8986\u76d6\u6240\u6709\u7684\u53ef\u80fd\u60c5\u51b5\u6700\u5c11\u4f7f\u7528\u7684\u6d4b\u8bd5\u7528\u4f8b\u6570\u3002\u8bf4\u4eba\u8bdd\uff0c\u5708\u590d\u6742\u5ea6\u5173\u7cfb\u5230\u8d28\u91cf\u540c\u5b66\u6700\u5c11\u9700\u8981\u8bbe\u8ba1\u591a\u5c11\u7528\u4f8b\u624d\u80fd\u8986\u76d6\u4f60\u7684\u4ee3\u7801\u5206\u652f\u3002\u600e\u4e48\u8ba1\u7b97\u5708\u590d\u6742\u5ea6\u8682\u8681\u5e7f\u76ee\u5e73\u53f0\u7ed9\u51fa\u4e86\u6bd4\u8f83\u8be6\u7ec6\u7684\u8bf4\u660e\uff0c\u8fd9\u91cc\u76f4\u63a5\u5f15\u7528\uff0c\u7f51\u4e0a\u4e5f\u53ef\u4ee5\u67e5\u5230\u7c7b\u4f3c\u5185\u5bb9\u3002\u8282\u70b9\u5224\u65ad\u8ba1\u7b97\u516c\u5f0f\u4e3a\uff1aV (G) = P + 1 \u6ce8\uff1a\u9664\u4e86\u8282\u70b9\u5224\u65ad\u6cd5\uff0c\u8fd8\u6709\u5176\u4ed6\u65b9\u6cd5\uff0c\u5982\u70b9\u8fb9\u5224\u65ad\u6cd5\uff0c\u8fd9\u91cc\u53ea\u9009\u4e00\u4e2a\u7528\u4e8e\u8bf4\u660e\u3002\u5176\u4e2dP\u4e3a\u6761\u4ef6\u8282\u70b9\u6570\uff0c\u6761\u4ef6\u8282\u70b9\u7c7b\u578b\u4e3a\uff1aa.\u6761\u4ef6\u8bed\u53e5if\u8bed\u53e5while\u8bed\u53e5\uff08\u5305\u542bdo&#8230;while&#8230;\u8bed\u53e5\uff09for\u8bed\u53e5\uff08\u5305\u542bforeach\u8bed\u53e5\uff09switch case\u8bed\u53e5try catch\u8bed\u53e5b.\u6761\u4ef6\u8868\u8fbe\u5f0f\uff08\u4e8c\u5143\u6216\u591a\u5143\uff09&#038;&#038; \u8868\u8fbe\u5f0f|| \u8868\u8fbe\u5f0f\u4e09\u5143\u8fd0\u7b97\u7b26\u4e3e\u4f8b\u5982\u4e0b(\u90e8\u5206\u4ee3\u7801\u7701\u7565\u540e\u7528xxx\u4ee3\u66ff)\uff1a\/\/\u6848\u4f8b1\uff0c\u5708\u590d\u6742\u5ea6V(G) =  1(if) + 1(catch) + 1 = 3<br \/>public String myMethod1(){<\/p>\n<pre><code>if(xxx){\n    try {\n        \/\/xxx;\n    } catch (IOException e) {\n        \/\/xxx;\n    }\n}else{\n     xxx;\n}\nreturn xx;<\/code><\/pre>\n<p>}<\/p>\n<p>\/\/\u6848\u4f8b2\uff0c\u5708\u590d\u6742\u5ea6V(G) =  2(if)  + 1(&#038;&#038;) + 1 = 4  <br \/>public String myMethod2() {<\/p>\n<pre><code>if (xxx) {\n    \/\/xxx;\n} else {\n    if (xxx &amp;&amp; xxx) {\n        \/\/xxx;\n    } else {\n        \/\/xxx;\n    }\n    xx();\n}\n\nreturn xx;<\/code><\/pre>\n<p>}\u00a0\u4e3a\u4ec0\u4e48\u8981\u5173\u6ce8\u5708\u590d\u6742\u5ea6\u597d\u4e86\uff0c\u4e86\u89e3\u4e86\u5708\u590d\u6742\u5ea6\u7684\u5b9a\u4e49\u4e4b\u540e\uff0c\u6211\u4eec\u57fa\u672c\u53ef\u4ee5\u5f97\u51fa\u4e00\u4e2a\u7ed3\u8bba\uff0c\u5708\u590d\u6742\u5ea6\u5927\u8bf4\u660e\u7a0b\u5e8f\u903b\u8f91\u590d\u6742\uff0c\u4e0d\u5229\u4e8e\u4ee3\u7801\u7684\u9605\u8bfb\uff0c\u7ef4\u62a4\uff0c\u548c\u540e\u7eed\u6269\u5c55\u3002\u5982\u679c\u9700\u8981\u770b\u61c2\u4e00\u4e2a\u5708\u590d\u6742\u5ea6\u9ad8\u7684\u65b9\u6cd5\uff0c\u9700\u8981\u5c0f\u5fc3\u7ffc\u7ffc\u6574\u7406\u6240\u6709\u7684\u5206\u652f\u60c5\u51b5\uff0c\u800c\u6539\u52a8\u8fd9\u7c7b\u4ee3\u7801\u66f4\u50cf\u8e0f\u5165\u96f7\u533a\u4e00\u6837\u3002\u4e0b\u9762\uff0c\u6211\u4eec\u6765\u770b\u4e00\u6bb5\u4ee3\u7801\u6848\u4f8b\uff08\u90e8\u5206\u5185\u5bb9\u5df2\u7701\u7565\uff09public XXresult doSave( XXDTO newScriptDTO) {<\/p>\n<pre><code>\nString type = Enums.ScriptType.CUSTOM;\nBoolean containsTryCatch = StringUtil.contains(content, &quot;try&quot;)\n    &amp;&amp; StringUtil.contains(content, &quot;catch&quot;);\nif (StringUtil.isBlank(scriptName)) {\n    baseOperationResult.setMessage(&quot;XXX&quot;);\n    return baseOperationResult;\n}\n\nif (!scriptName.matches(&quot;^[(\/\/d)|_|a-z|A-Z]+$&quot;)) {\n    baseOperationResult.setMessage(&quot;XXX&quot;);\n    return baseOperationResult;\n}\n\nNewScript tempScript = null;\ntry {\n    tempScript = newScriptManager.findByName(StringUtil.trim(scriptName));\n} catch (Exception e) {\n    baseOperationResult.setMessage(&quot;XXX&quot;);\n    return baseOperationResult;\n}\n\nif (StringUtil.isBlank(id)) {\n    if (tempScript != null) {\n        baseOperationResult.setMessage(&quot;XXX&quot;);\n        return baseOperationResult;\n    }\n} else {\n    Integer editScriptId = Integer.parseInt(id);\n    if (null != tempScript) {\n        if (!editScriptId.equals(tempScript.getId())) {\n            baseOperationResult.setMessage(&quot;XXX&quot;);\n            return baseOperationResult;\n        }\n    }\n}\n\nif (!Enums.NewScriptTypeEnum.XX.contains(scriptType)) {\n    baseOperationResult.setMessage(&quot;XX&quot;);\n    return baseOperationResult;\n}\n\nBoolean needSubtypeMode = true;\nif (StringUtils.equals(scriptType, Enums.XX.XX)\n    || StringUtils.equals(scriptType, Enums.XX.PRE)) {\n    needSubtypeMode = false;\n}\n\nNewScript script = new NewScript();\nscript.setScriptType(scriptType);\nif (StringUtil.isNumeric(status)) {\n    script.setStatus(Integer.parseInt(status));\n}\n\nif (StringUtil.isNotBlank(scriptCategory)) {\n    script.setScriptCategory(ScriptCategory.getByCode(scriptCategory));\n}\nString subType = &quot;&quot;;\nif (needSubtypeMode) {\n    if (StringUtil.isBlank(subtypeandtip)) {\n        baseOperationResult.setMessage(&quot;XXX&quot;);\n        return baseOperationResult;\n        \n    }\n}\n\nif (needSubtypeMode) {\n    List&lt; NewScript&gt; allActiveAndTestRunScripts = newScriptManager\n        .findAllActiveAndTestRunScripts();\n    List&lt; String&gt; allActiveAndTestRunSubTypeList = new ArrayList&lt;&gt;();\n    for (NewScript activeAndTestRunScript : allActiveAndTestRunScripts) {\n        List&lt; String&gt; subTypeListEveryScript = Arrays\n            .asList(Optional.ofNullable(activeAndTestRunScript.getSubType())\n                    .orElse(new String()).split(&quot;,&quot;));\n        for (String subTypeTemp : subTypeListEveryScript) {\n            if (StringUtil.isNotBlank(subTypeTemp)) {\n                allActiveAndTestRunSubTypeList.add(subTypeTemp);\n            }\n        }\n    }\n    try {\n        JSONArray subtypetipsArray = JSON.parseArray(subtypeandtip);\n        \n        if (StringUtil.isBlank(id)) {\n            for (Object object : subtypetipsArray) {\n                JSONObject subtypetipsObject = (JSONObject) object;\n                String subtypeSingle = subtypetipsObject.getString(&quot;subtype&quot;);\n                if (StringUtil.isBlank(subtypeSingle)) {\n                    baseOperationResult.setSuccess(false);\n                    return baseOperationResult;\n                }\n                if (CollectionUtils.contains(allActiveAndTestRunSubTypeList.iterator(),\n                                             subtypeSingle)) {\n                    baseOperationResult.setSuccess(false);\n                    return baseOperationResult;\n                }\n            }\n        } else {\n            if (&quot;1&quot;.equals(status) || &quot;2&quot;.equals(status)) {\n                for (Object object : subtypetipsArray) {\n                    \/\/\u7701\u7565\u90e8\u5206\u5185\u5bb9XXX;\n                    if (StringUtil.isBlank(subtypeSingle)) {\n                        baseOperationResult.setSuccess(false);\n                        return baseOperationResult;\n                    }\n                    \n                    for (NewScript oldNewScript : allActiveAndTestRunScripts) {\n                        if (oldNewScript.getId().equals(Integer.parseInt(id))) {\n                            continue;\n                        }\n                        \/\/\u7701\u7565\u90e8\u5206\u5185\u5bb9XXX;\n                        if (CollectionUtils.contains(filtered.iterator(), subtypeSingle)) {\n                            baseOperationResult.setSuccess(false);\n                            return baseOperationResult;\n                        }\n                    }\n                }\n            }\n        }\n        for (Object object : subtypetipsArray) {\n            if (1 == script.getStatus() || 2 == script.getStatus()) {\n                SubtypeTips subtypeTips = null;\n                subtypeTips = subtypeTipsManager.findBySubtype(subtypeSingle);\n                if (subtypeTips == null) {\n                    subtypeTips = new SubtypeTips();\n                }\n                subtypeTips.setSubtype(subtypeSingle);\n                subtypeTips.setInternalTips(innertips);\n                subtypeTips.setExternalTips(externaltips);\n                subtypeTips.setShareLink(shareLink);\n                subtypeTips.setStatus(1);\n                subtypeTipsManager.save(subtypeTips);\n            }\n            \n        }\n        subType = StringUtil.substring(subType, 0, subType.length() - 1);\n    } catch (Exception e) {\n        baseOperationResult.setSuccess(false);\n        baseOperationResult.setMessage(&quot;XXX&quot;);\n        return baseOperationResult;\n    }\n}\n\nboolean needCreateTestRunScript = false;\nif (StringUtils.isNotBlank(id)) {\n    script.setId(Integer.parseInt(id));\n    NewScript orgin = newScriptManager.findById(Integer.parseInt(id));\n    if (null != orgin &amp;&amp; 1 == orgin.getStatus() &amp;&amp; &quot;1&quot;.equals(status)) {\n        if (StringUtil.isNotBlank(orgin.getContent())) {\n            String originContentHash = CodeUtil\n                .getMd5(StringUtil.deleteWhitespace(orgin.getContent()));\n            String contentHash = CodeUtil.getMd5(StringUtil.deleteWhitespace(content));\n            if (!StringUtil.equals(originContentHash, contentHash)) {\n                needCreateTestRunScript = true;\n            }\n        }\n    }\n} else {\n    script.setSubmitter(user.getLoginName());\n}\nSet&lt; String&gt; systemList = new HashSet&lt; String&gt;();\nif (StringUtil.isNotBlank(systems)) {\n    String[] systemArray = systems.split(&quot;,&quot;);\n    for (int i = 0; i &lt; systemArray.length; i++) {\n        systemList.add(systemArray[i]);\n    }\n}\nif (needCreateTestRunScript) {\n    if (needSubtypeMode) {\n        content = replaceContent(content, subType);\n        String testScriptSubType = &quot;&quot;;\n        List&lt; String&gt; subTypeList = Arrays.asList(StringUtil.split(subType, &quot;,&quot;));\n        for (int i = 0; i &lt; subTypeList.size(); i++) {\n            testScriptSubType += this.UPDATE_SCRIPT + subTypeList.get(i);\n            if (i != subTypeList.size() - 1) {\n                testScriptSubType += &quot;,&quot;;\n            }\n        }\n        \n        subType = testScriptSubType;\n    }\n    \n    scriptName = this.UPDATE_SCRIPT + scriptName;\n    NewScript oldUpdateScript = newScriptManager.findByName(scriptName);\n    if (null != oldUpdateScript)\n        script.setId(oldUpdateScript.getId());\n    else {\n        script.setId(null);\n    }\n    baseOperationResult.setNeedAudit(true);\n}\nif (StringUtil.isBlank(fileSuffix)) {\n    \/\/\u5982\u679c\u5168\u7a7a\u7684\u8bdd \u9ed8\u8ba4\u5168\u626b\n    script.setSuffix(&quot;.*&quot;);\n} else {\n    script.setSuffix(fileSuffix);\n}\nscript.setName(scriptName);\nif (StringUtil.equals(allPath, &quot;Y&quot;)) {\n    script.setAllPath(&quot;Y&quot;);\n} else {\n    script.setAllPath(&quot;&quot;);\n}\nscript.setEnvTag(tenantScope);\nscript.setNeedAutoScan(needAutoScan);\nif (StringUtil.isNotBlank(scopes)) {\n    for (String each : StringUtil.split(scopes, &quot;,&quot;)) {\n        each = StringUtil.replace(each, &quot; &quot;, &quot;&quot;);\n        script.addScope(each);\n    }\n}\n\nif (StringUtil.isNotBlank(content)) {\n    BaseOperationResult preLoadResult = syntaxCheck(script);\n    if (!preLoadResult.isSuccess()) {\n        baseOperationResult.setMessage(preLoadResult.getMessage());\n        return baseOperationResult;\n    }\n}\n\nif (StringUtil.contains(content, &quot;new Bug&quot;)) {\n    baseOperationResult.setSuccess(false);\n    return baseOperationResult;\n}\n\ntry {\n    Result&lt; NewScript&gt; result = newScriptManager.saveCustomScript(script);\n    if (result.isSuccess()) {\n        \n        if (EnvUtil.isProdEnv() &amp;&amp; EnvUtil.isLinux()) {\n            if (!needCreateTestRunScript) {\n                \/\/\u7701\u7565\u90e8\u5206\u5185\u5bb9XX\n                } else {\n                \/\/\u7701\u7565\u90e8\u5206\u5185\u5bb9XX\n                }\n            \n        }\n        \n        Boolean hasOldScript = processOldEngineRule(scriptName);\n        \n        if (containsTryCatch) {\n            if (hasOldScript) {\n                \/\/\u7701\u7565\u90e8\u5206\u5185\u5bb9XX\n                } else {\n                \/\/\u7701\u7565\u90e8\u5206\u5185\u5bb9XX\n                }\n        } else {\n            if (hasOldScript) {\n                baseOperationResult.setMessage(&quot;XXX&quot;);\n            } else {\n                baseOperationResult.setMessage(&quot;\u4fdd\u5b58\u6210\u529f!&quot;);\n            }\n        }\n        baseOperationResult.setId(script.getId());\n        processTenantRelation(script.getId(), tenantIdList, user.getLoginName());\n        if (!needCreateTestRunScript &amp;&amp; needSubtypeMode\n            &amp;&amp; (StringUtil.equals(Enums.XX.COMMON, script.getScriptType())\n                || (StringUtil.equals(Enums.XX.SCRIPT,\n                                      script.getScriptType())))) {\n            JSONArray subtypetipsArray = JSON.parseArray(subtypeandtip);\n            for (Object object : subtypetipsArray) {\n                \/\/\u7701\u7565\u90e8\u5206\u5185\u5bb9XX\n            }\n        }\n    } else {\n        baseOperationResult.setSuccess(false);\n        return baseOperationResult;\n    }\n} catch (Exception e) {\n    baseOperationResult.setMessage(&quot;XX&quot;);\n}\nreturn baseOperationResult;\n<\/code><\/pre>\n<p>}\u539f\u4ee3\u7801\u5927\u6982400\u884c\u4ee5\u4e0a\uff0c\u590d\u6742\u5ea669\uff0c\u618b\u4e86\u4e00\u53e3\u957f\u6c14\u624d\u8bfb\u5b8c\u3002\u5982\u679c\u8ba9\u4f60\u6765\u63a5\u624b\u8fd9\u6bb5\u4ee3\u7801\uff0c\u662f\u4e0d\u662f\u611f\u89c9\u5f88\u5934\u75bc\uff1f\u9700\u8981\u68b3\u7406\u91cc\u9762\u5404\u79cd\u5206\u652f\u903b\u8f91\uff0c\u5f04\u6e05\u695a\u4e3b\u5e72\u8109\u7edc\u3002\u90a3\u4e48\u4ec0\u4e48\u6837\u7684\u4ee3\u7801\u624d\u5bb9\u6613\u8bfb,\u5bb9\u6613\u4e0a\u624b\u5462\uff1f\u4e00\u822c\u4e1a\u754c\u8ba4\u4e3a\u4ee3\u7801\u53ef\u8bfb\u6027\uff0c\u53ef\u6d4b\u8bd5\uff0c\u7ef4\u62a4\u6210\u672c\u548c\u5708\u590d\u6742\u5ea6\u6709\u5f88\u5927\u5173\u7cfb\uff0c\u5177\u4f53\u5982\u4e0b\uff1a<br \/><img decoding=\"async\" referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/remote\/1460000042333301\" alt=\"\u56fe\u7247\" title=\"\u56fe\u7247\" loading=\"lazy\"><br \/>\u6211\u8be5\u600e\u4e48\u505a1.\u3010\u77e5\u5df1\u77e5\u5f7c\uff0c\u4e86\u89e3\u81ea\u5df1\u4ee3\u7801\u590d\u6742\u5ea6\u3011\u8fd9\u4e2a\u6bd4\u8f83\u7b80\u5355\uff0c\u6709\u4ee5\u4e0b\u51e0\u79cd\u65b9\u5f0f\uff1aa.\u81ea\u5df1\u6570\u4e0b\u5224\u5b9a\u8282\u70b9\uff08if while for catch case and or\u7b49\uff09\u5927\u6982\u5c31\u77e5\u9053\u5708\u590d\u6742\u5ea6\u662f\u591a\u5927\u4e86\uff0c\u53c2\u8003\u4e0a\u9762\u600e\u4e48\u8ba1\u7b97\u5708\u590d\u6742\u5ea6\u7ae0\u8282\u3002b.\u5728\u8682\u8681\u5185\u90e8\u4f7f\u7528\u7684\u5e7f\u76ee\u5e73\u53f0\uff0c\u4e5f\u53ef\u4ee5\u67e5\u770b\u5230\u65b0\u63d0\u4ea4commit\u8bb0\u5f55\u91cc\uff0c\u54ea\u4e9b\u65b9\u6cd5\u5708\u590d\u6742\u5ea6\u6bd4\u8f83\u9ad8\u3002<br \/><img decoding=\"async\" referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/remote\/1460000042333302\" alt=\"\u56fe\u7247\" title=\"\u56fe\u7247\" loading=\"lazy\"><br \/>c.\u5728\u4ee3\u7801\u63d0\u4ea4\u4e4b\u524d\uff0c\u81ea\u5df1\u7528idea\u5c0f\u63d2\u4ef6\uff08Metrics Reloaded\u63d2\u4ef6\uff09\uff0c\u4e00\u6b21\u6027\u626b\u63cf\u81ea\u5df1\u8d1f\u8d23\u7684\u7cfb\u7edf\u6240\u6709\u65b9\u6cd5\u7684\u590d\u6742\u5ea6\u3002<br \/><img decoding=\"async\" referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/remote\/1460000042333303\" alt=\"\u56fe\u7247\" title=\"\u56fe\u7247\" loading=\"lazy\"><br \/>\u7ea2\u8272\u90e8\u5206\u6807\u8bc6\u5708\u590d\u6742\u5ea6\uff0c\u6570\u5b57\u8d8a\u5927\u590d\u6742\u5ea6\u8d8a\u9ad8\u30022.\u3010\u5bf9\u75c7\u4e0b\u836f\uff0c\u964d\u4f4e\u590d\u6742\u5ea6\u3011\u7f51\u4e0a\u6709\u5f88\u591a\u65b9\u6cd5\uff0c\u6211\u603b\u7ed3\u4e86\u4e0b\uff0c\u5927\u6982\u6709\u4ee5\u4e0b\u51e0\u79cd\u65b9\u6cd5\u4e00\uff1a\u62bd\u53d6\u51fa\u72ec\u7acb\u903b\u8f91\u7684\u5b50\u65b9\u6cd5\uff0c\u628a\u590d\u6742\u903b\u8f91\u62c6\u5206\u6210\u51e0\u4e2a\u72ec\u7acb\u6a21\u5757\uff0c\u518d\u53bb\u8bfb\u4ee3\u7801\uff0c\u5c31\u4f1a\u611f\u89c9\u6e05\u6670\u5f88\u591a\u3002\u4ee5\u4e0a\u9762\u4e3e\u4f8b\u7684\u590d\u6742\u5ea669\u7684\u65b9\u6cd5\u4e3a\u4f8b\uff0c\u6211\u4eec\u505a\u4e86\u5982\u4e0b\u7684\u65b9\u6cd5\u62c6\u5206\uff0c\u662f\u4e0d\u662f\u611f\u89c9\u6e05\u6670\u4e86\u5f88\u591a\uff1fpublic XXresult doSave( NewScriptDTO newScriptDTO) {<\/p>\n<pre><code>\n  \/\/0.\u6784\u9020\u7ed3\u679c\n  XXresult result=new XXresult() ;\n  \n  try{\n        \/\/1.\u811a\u672c\u540d\u68c0\u67e5\n        scriptNameCheck(newScriptDTO); \n        \n         \/\/2.\u811a\u672c\u52a0\u8f7d\n        loadScript(newScriptDTO); \n        \n         \/\/3.\u811a\u672c\u4fdd\u5b58\n        saveScript(newScriptDTO); \n        \n    }catch(XXException e){\n        result.setSuccess(false)\n        result.setMessage(&quot;XXX&quot;);\n        return result;\n    }catch(Exception e){\n        result.setSuccess(false)\n        result.setMessage(&quot;XXX&quot;);\n        return result;\n    }\n    \/\/\u64cd\u4f5c\u5b8c\u6210\n            result.setSuccess(true)\n    result.setMessage(&quot;XXX&quot;);\n    return result\uff1b\n<\/code><\/pre>\n<p>}<br \/>\/<em>*\u68c0\u67e5\u811a\u672c\u540d<\/em>\/<br \/>private void scriptNameCheck(NewScriptDTO newScriptDTO){<br \/>  xxx<br \/>}<br \/>\/<em>*\u52a0\u8f7d\u811a\u672c<\/em>\/<br \/>private void loadScript(NewScriptDTO newScriptDTO){<br \/>  xxx<br \/>}<br \/>\/<em>*\u4fdd\u5b58\u811a\u672c<\/em>\/<br \/>private void saveScript(NewScriptDTO newScriptDTO){<br \/>  xxx<br \/>}\u65b9\u6cd5\u4e8c\uff1a\u4f18\u5316\u903b\u8f91\u5224\u65ad\uff0c\u901a\u8fc7\u63d0\u53d6\u9891\u7e41\u51fa\u73b0\u7684\u6761\u4ef6\uff0c \u6216\u8005\u8c03\u6574\u5224\u65ad\u987a\u5e8f\u7b49\u65b9\u5f0f\u8fbe\u5230\u7b80\u5316\u4ee3\u7801\u76ee\u7684\u3002\/\/\/\/\/\/\/\/\/ \u6848\u4f8b1\uff0c\u62bd\u53d6\u9891\u7e41\u51fa\u73b0\u7684\u6761\u4ef6a\/\/\/\/\/\/\/\/\/<br \/>\/\/\u4fee\u6539\u524d<br \/>if (\u6761\u4ef61)<br \/>{<\/p>\n<pre><code>if (\u6761\u4ef6a)\n{\n    \/\/ \u6267\u884ca\u903b\u8f91\n}<\/code><\/pre>\n<p>}<br \/>else if(\u6761\u4ef62)<br \/>{<\/p>\n<pre><code>if (\u6761\u4ef6a)\n{\n    \/\/ \u6267\u884cb\u903b\u8f91\n}<\/code><\/pre>\n<p>}<br \/>if (\u6761\u4ef6a)<br \/>{<\/p>\n<pre><code>\/\/ \u6267\u884cc\u903b\u8f91<\/code><\/pre>\n<p>}<br \/>\/\/\u4fee\u6539\u540e<br \/>if (\u6761\u4ef6a)<br \/>{<\/p>\n<pre><code>if (\u6761\u4ef61)\n    {\n         \/\/ \u6267\u884ca\u903b\u8f91\n}\nelse if(\u6761\u4ef62)\n{\n         \/\/ \u6267\u884cb\u903b\u8f91\n}    \/\/ \u6267\u884cc\u903b\u8f91<\/code><\/pre>\n<p>}<br \/>\/\/\/\/\/\/\/\/\/ \u6848\u4f8b2\uff0c\u4f18\u5316\u903b\u8f91\u5224\u65ad\u987a\u5e8f\/\/\/\/\/\/\/\/\/<br \/>\/\/\u4fee\u6539\u524d<br \/>if\uff08\uff08\u6761\u4ef61 &#038;&#038; \u6761\u4ef62\uff09|| !\u6761\u4ef61\uff09{<\/p>\n<pre><code>return true;<\/code><\/pre>\n<p>}else{<\/p>\n<pre><code>return false;<\/code><\/pre>\n<p>}<br \/>\/\/\u4fee\u6539\u540e<br \/>if(\u6761\u4ef61 &#038;&#038; \uff01\u6761\u4ef62){<\/p>\n<pre><code>return false;<\/code><\/pre>\n<p>}<br \/>return true;\u65b9\u6cd5\u4e09\uff1a\u9002\u5f53\u4f7f\u7528java\u65b0\u7279\u6027\uff0c\u964d\u4f4e\u5927\u91cf\u7684if\u5224\u65ad\u3002\u4e0b\u9762\u662f\u6765\u81ea\u56e2\u961f\u4e00\u6dcf\u540c\u5b66\u7684\u63d0\u4f9b\u7684\u4f18\u5316\u6848\u4f8b\/\/\u4fee\u6539\u524d<br \/> List list = XXX;<br \/> if (CollectionUtils.isEmpty(list)) {<br \/>   for (XX item : list) {<\/p>\n<pre><code>  if (item==null){\n    return;\n  }else{\n    \/\/ \u903b\u8f91a\n  }<\/code><\/pre>\n<p>}<\/p>\n<p>\/\/\u4fee\u6539\u540e<br \/>  List list = XX;<br \/>  list = Optional.ofNullable(list).orElse(new ArrayList&lt;&gt;());<br \/>  list.stream().filter(Objects::nonNull).forEach(item-&gt;{<\/p>\n<pre><code> \/\/\u903b\u8f91a<\/code><\/pre>\n<p>});<\/p>\n<p>}\u5f53\u7136\uff0c\u53ea\u8981\u7528\u5fc3\u94bb\u7814\uff0c\u964d\u4f4e\u590d\u6742\u5ea6\u8fd8\u6709\u5f88\u591a\u65b9\u6cd5\uff0c\u8fd9\u91cc\u4e0d\u4e00\u4e00\u5217\u4e3e\u4e86\u3002\u603b\u7ed3\u4e0b\u601d\u8def\uff1a\u4e00\u4e2a\u65b9\u6cd5\/\u7c7b\u4e0d\u8981\u5199\u5927\u6bb5\u5927\u6bb5\u7684\u4ee3\u7801\uff0c\u628a\u5185\u5bb9\u5c01\u88c5\u5728\u903b\u8f91\u72ec\u7acb\u7684\u5b50\u7c7b\u548c\u5b50\u65b9\u6cd5\u91cc\u3002\u91c7\u7528\u6709\u610f\u4e49\u7684\u7c7b\u540d\uff0c\u65b9\u6cd5\u540d\uff0c\u8ba9\u4f7f\u7528\u8005\u89c1\u540d\u601d\u610f\uff0c\u6613\u4e8e\u4e0a\u624b\u3002\u903b\u8f91\u8868\u8fbe\u4e0a\uff0c\u4f18\u5316\u5224\u65ad\u903b\u8f91\u6210\u6700\u7b80\u5f62\u5f0f\u3002\u9002\u5f53\u4f7f\u7528\u7f16\u7a0b\u6280\u5de7\uff0c\u5408\u5e76\u5224\u65ad\u65b9\u5f0f\u3002\u00a0\u7ed3\u8bed\u4f5c\u4e3a\u8682\u8681\u5de5\u7a0b\u5e08\u7684\u6211\u4eec\uff0c\u5f00\u53d1\u4ee3\u7801\u4e5f\u5e94\u8be5\u50cf\u521b\u4f5c\u4e00\u4e2a\u827a\u672f\u54c1\uff0c\u6df1\u601d\u719f\u8651\uff0c\u7cbe\u96d5\u7ec6\u523b\uff0c\u7ecf\u8fc7\u4ea7\u54c1\u7684\u4e0d\u65ad\u5347\u7ea7\u8fed\u4ee3\uff0c\u4ecd\u7136\u80fd\u591f\u4fdd\u6301\u987d\u5f3a\u7684\u751f\u547d\u529b\uff0c\u5c31\u50cf\u4ee3\u7801\u56db\u5c42\u5883\u754c[\u6ce83]\u91cc\u9762\u8bf4\u7684\u7b2c\u56db\u5c42\uff0c\u7ecf\u8fc7\u4e86\u65f6\u95f4\u5386\u7ec3\u201c\u6211\u7684\u4ee3\u7801\u8fd8\u5728\u7528\u201d\u3002\u5f15\u7528\uff1a[\u6ce81]\u5bf9\u4ee3\u7801\u7684\u9886\u609f\u4e4b-\u9ad8\u8d28\u91cf\u4ee3\u7801\u6709\u4e09\u8981\u7d20\uff1a\u53ef\u8bfb\u6027\u3001\u53ef\u7ef4\u62a4\u6027\u3001\u53ef\u6269\u5c55\u6027 \uff1a<a href=\"https:\/\/link.segmentfault.com\/?enc=AFaidBbdOvxVA3VwXthVdA%3D%3D.B5P9S3uL9Bau7PRAJDhc188fmyeF6l8b2ifvkbTYlDoZiWnn5%2BsZVh%2BpdXbU5Ck0BsvcqESRLXgiUcv%2B771zDZPfPrAJTUZEa2DzkJVddGk%3D\" rel=\"nofollow\">https:\/\/wenku.baidu.com\/view\/&#8230;<\/a>[\u6ce82]\u8be6\u89e3\u5708\u590d\u6742\u5ea6\uff1a<a href=\"https:\/\/link.segmentfault.com\/?enc=SLRwEs9jr%2B%2BgbnHvLCcTNg%3D%3D.pGY9bxaY8XZWKSyErE1puZ4cLtVWD6jUxRW9uUSs816lOdEI1sQQFwNIWNkpVlpGSo4MB440ZsM40YRQwg7OQ6VI2%2FI%2F9I3goBfDHjCcpdI%3D\" rel=\"nofollow\">https:\/\/baike.baidu.com\/item\/&#8230;<\/a>[\u6ce83]\u4ee3\u7801\u7684\u56db\u5c42\u5883\u754c\uff1a<a href=\"https:\/\/link.segmentfault.com\/?enc=ZX36SAC0ZHlouo3S9L70Xw%3D%3D.QbLsBtlbjOmEkZhlu5Na15IdIkyZXxVOIVpa76DvBNLrjMrtPwsX2HcEgYAxbMFL\" rel=\"nofollow\">https:\/\/www.sohu.com\/a\/238434&#8230;<\/a>\uff0c \u7b2c\u4e00\u5c42\u201c\u6211\u7684\u4ee3\u7801\u5199\u5b8c\u4e86\u201d\uff0c\u7b2c\u4e8c\u5c42\u201c\u6211\u7684\u4ee3\u7801\u5199\u597d\u4e86\u201d\uff0c\u7b2c\u4e09\u5c42\u201c\u6211\u7684\u4ee3\u7801\u80fd\u8dd1\u4e86\u201d\uff0c\u7b2c\u56db\u5c42\u201c\u6211\u7684\u4ee3\u7801\u8fd8\u5728\u7528\u201d\u00a0\u963f\u91cc\u4e91\u4ea7\u54c1\u8bc4\u6d4b\u2014\u963f\u91cc\u4e91\u5bb9\u5668\u955c\u50cf\u670d\u52a1 ACR\u00a0\u514d\u8d39\u8bd5\u7528\u4f53\u9a8c\u9762\u5411\u5bb9\u5668\u955c\u50cf\u3001Helm Chart \u7b49\u7b26\u5408 OCI \u6807\u51c6\u7684\u4e91\u539f\u751f\u5236\u54c1\u5b89\u5168\u6258\u7ba1\u53ca\u9ad8\u6548\u5206\u53d1\u5e73\u53f0\uff0c\u53d1\u5e03\u4f60\u7684\u8bc4\u6d4b\u66f4\u6709\u673a\u4f1a\u83b7\u5f97\u5343\u5143\u673a\u68b0\u952e\u76d8\uff0c\u9650\u91cf\u5b9a\u5236\u793c\u54c1\u3002\u70b9\u51fb\u8fd9\u91cc\uff0c\u67e5\u770b\u8be6\u60c5\u3002\u539f\u6587\u94fe\u63a5\uff1a<a href=\"https:\/\/link.segmentfault.com\/?enc=yWL1qA29rjhaM8wgxZOlXA%3D%3D.jbA6U%2Bw4jfjVo3d1YAV0s%2FhDyfnMk7FgkJgNEu4uTHI5O6NSkgNf1YlC52Ju7pmf\" rel=\"nofollow\">https:\/\/click.aliyun.com\/m\/10&#8230;<\/a>\u672c\u6587\u4e3a\u963f\u91cc\u4e91\u539f\u521b\u5185\u5bb9\uff0c\u672a\u7ecf\u5141\u8bb8\u4e0d\u5f97\u8f6c\u8f7d\u3002<\/p>\n<p><a href=\"https:\/\/segmentfault.com\/a\/1190000042333298\">https:\/\/segmentfault.com\/a\/1190000042333298<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u7b80\u4ecb\uff1a\u00a0\u6211\u4eec\u4e00\u76f4\u5728\u8bf4\u7cfb\u7edf\u5f88\u590d\u6742\uff0c\u90a3\u5230\u5e95\u4ec0\u4e48\u662f\u7cfb\u7edf\u590d\u6742\u5ea6\u5462\uff1f\u4f5c\u4e3a\u56e2\u961f\u7684\u7a33\u5b9a\u6027\u5e95\u76d8\u8d1f\u8d23\u4eba\uff0c\u4e5f\u7ecf\u5e38\u548c\u5927\u5bb6\u63a2\u8ba8\u4e3a\u4ec0\u4e48\u4f1a [&hellip;]<\/p>\n","protected":false},"author":0,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[],"tags":[],"class_list":["post-10006234","post","type-post","status-publish","format-standard","hentry"],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/posts\/10006234","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/itmax.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=10006234"}],"version-history":[{"count":0,"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/posts\/10006234\/revisions"}],"wp:attachment":[{"href":"https:\/\/itmax.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=10006234"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/itmax.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=10006234"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/itmax.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=10006234"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}