你見(jiàn)過(guò)最爛的Java代碼長(zhǎng)什么樣子?
經(jīng)歷了的項(xiàng)目越多,看過(guò)的奇葩代碼也就越多。發(fā)現(xiàn)爛代碼的目的并不是抨擊和取笑,主要還是為了避免讓自己或者身邊的人寫(xiě)出類似的代碼。
碼云上面就有個(gè)熱門倉(cāng)庫(kù) bullshit-codes[1] 專門收集史上最坑爹的代碼片段。下面放幾個(gè)比較有意思的給大家看看:
1.一行代碼就可以搞定的,非要寫(xiě)的啰里啰嗦。不要給我扯什么可讀性,以下代碼一行的寫(xiě)法可讀性也更好。
- private boolean isEligible(int age) {
- boolean result;
- if (age > 18) {
- result = true;
- } else {
- result = false;
- }
- return result;
- }
2.前大廠程序員設(shè)計(jì)的智能 AI 客服系統(tǒng)
- Scanner sc = new Scanner(System.in);
- String str;
- // 待優(yōu)化
- while (true) {
- str = sc.next();
- // 測(cè)試環(huán)境,正式環(huán)境從數(shù)據(jù)庫(kù)中獲取
- str = str.replace("嗎", "");
- str = str.replace("?", "!");
- str = str.replace("?", "!");
- str = str.replace("不", "很");
- str = str.replace("你們", "我們");
- str = str.replace("有", "沒(méi)有");
- System.out.println(str);
- }
效果展示:
- 在嗎?
- 在!
- 你好!
- 你好!
- 產(chǎn)品有問(wèn)題啊
- 產(chǎn)品沒(méi)有問(wèn)題啊
- 你們的服務(wù)態(tài)度不好
- 我們的服務(wù)態(tài)度很好
在嗎?在!你好!你好!產(chǎn)品有問(wèn)題啊產(chǎn)品沒(méi)有問(wèn)題啊你們的服務(wù)態(tài)度不好我們的服務(wù)態(tài)度很好
3.只要我的代碼夠多,你就你很難看出有啥問(wèn)題
- /**
- * 三年前接手的一個(gè)政府網(wǎng)站項(xiàng)目,真假不知,據(jù)說(shuō)是一個(gè)兩年web開(kāi)發(fā)經(jīng)驗(yàn)的程序員寫(xiě)的, 用的spring系列還是3.x版本,前端還是jsp,可能是老項(xiàng)目。
- * 主要特點(diǎn)是:實(shí)體類中不寫(xiě)注釋,數(shù)據(jù)庫(kù)表中也沒(méi)有注釋,命名經(jīng)常使用英文拼音混合,而且還可能是簡(jiǎn)寫(xiě)(grzlChangeStatus:個(gè)人資料變更狀態(tài))
- *
- * 挖坑不填坑,菊花塞電燈
- */
- @Controller
- public class DemoController {
- /**
- * 這個(gè)方法一共有800多行,有30多個(gè)if或else if的條件判斷,只寫(xiě)代表性的幾個(gè)
- *
- * 具體方法名稱記不得,邏輯是這樣,前端jsp提交一個(gè)請(qǐng)求過(guò)來(lái),界面中除了一些必填信息外,還有有5個(gè)下拉框,后臺(tái)判斷各種組合,
- * 分別往request里面塞入不同的對(duì)象,返回的頁(yè)面視圖也可能不同。
- */
- @RequestMapping("/submit")
- public String template(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
- String param1 = request.getParameter("param1");
- String param2 = request.getParameter("param2");
- String param3 = request.getParameter("param3");
- String param4 = request.getParameter("param4");
- String param5 = request.getParameter("param5");
- // 你沒(méi)看錯(cuò),各種狀態(tài)全部存字串,而且判斷的時(shí)候不考慮空指針問(wèn)題
- if (param1.equals("已消毒")) {
- // 邏輯
- request.setAttribute("attr", "value");
- return "jsp1";
- } else if (param1.equals("已消毒") && param2.equals("1.8米以上")) {
- // 邏輯
- request.setAttribute("attr", "value");
- // 你沒(méi)看錯(cuò),可能又是另一個(gè)視圖
- return "jsp2";
- // 你沒(méi)看錯(cuò),還可能出現(xiàn)多個(gè)條件,|| 和 &&
- } else if (param1.equals("已消毒") && param2.equals("2米以上") || param3.equals("緬甸")) {
- // 邏輯
- request.setAttribute("attr", "value");
- return "jsp3";
- // 你沒(méi)看錯(cuò),因?yàn)樗臓顟B(tài)或選項(xiàng)沒(méi)有用數(shù)字類型,所以不能用 > < 之類的來(lái)判斷,要列舉所有狀態(tài)
- } else if (param1.equals("未進(jìn)站") || param1.equals("已進(jìn)站") || param1.equals("已消毒") && param2.equals("2米以上")) {
- request.setAttribute("attr", "value");
- return "jsp3";
- //你沒(méi)看錯(cuò),還會(huì)出現(xiàn) true==true 或false==false這樣的代碼
- }else if(param4.equals("禁止入境")==true && param5.equals("農(nóng)用車")) {
- request.setAttribute("attr", "value");
- return "jsp4";
- //你沒(méi)看錯(cuò),還會(huì)出現(xiàn)邏輯非,而且,要先判斷什么條件,從來(lái)不用括號(hào)包起來(lái),要理他的邏輯,還要先理?xiàng)l件判斷優(yōu)先級(jí)
- }else if(param1.equals("未進(jìn)站") || param1.equals("已進(jìn)站") || param1.equals("已消毒") && param2.equals("2米以上") && !param3.equals("緬甸")) {
- request.setAttribute("attr", "value");
- return "jsp5";
- }
- //省略剩下的30多個(gè)類似的判斷
- else {
- return "default";
- }
- }
- }
以上代碼的問(wèn)題:
- 空指針異常
- 邏輯混亂,部分 else if 根本進(jìn)不去
4.獲取一天后的日期:讓線程睡一會(huì)
- public static Date getAfterDate(int day) {
- try {
- Thread.sleep(day * 24 * 60 * 60 * 1000);
- } catch (Exception e) {
- e.printStackTrace();
- }
- return new Date();
- }
5.新上的項(xiàng)目的代碼命名,表示看不太懂
6.為了得到了一個(gè)用戶總?cè)藬?shù),把所有的 User 對(duì)象查詢出來(lái)。
- /**
- 統(tǒng)計(jì)用戶總數(shù),來(lái)源于N年前某個(gè)用戶抱怨執(zhí)行效率低,貼出類似邏輯的代碼.
- @author wendal
- */
- @IocBean
- public class CountUserTable {
- @Inject Dao dao;
- @Test
- public void test_user_count() {
- // 取出全部用戶對(duì)象(dao.query返回List<User>),然后取list大小就可以啦,是不是很機(jī)智
- int count = dao.query(User.class, null).size();
- System.out.println("用戶總數(shù)是" + count);
- }
- }
參考資料
[1]bullshit-codes: https://gitee.com/oschina/bullshit-codes