
Java技術棧
www.javastack.cn
優秀的Java技術公衆号
你見過最無可奈何的代碼是什麼?
今天,棧長就來總結一下我遇到過的一些神邏輯代碼,不一定很全,但我真心寫不出,真心讓我自歎不如啊!
1、耍猴的最佳手段
還記得 XX 手機的搶購活動麼,搶購按鈕的代碼類似是這樣的:
<a href="javasript:alert('搶購結束!')">立即搶購</a>
活動還沒開始就結束了。。
後面有人挖出來這段神邏輯,大家真是哭暈在廁所了,還好,搶購買手機這種我從來不參加。。
就是在前端寫死代碼造成搶購結束的假象,其實請求壓根沒有發送到伺服器,或者休眠幾秒直接跳轉到搶購結束頁面,良心點的,點 10 次有一次發到伺服器就不錯了,這樣耍猴是不是太好玩了?
衆所周知,為了提高伺服器的承載能力,現在各類 APP、網頁等都會或多或少加入前端緩存,但上面這種耍猴的代碼也太無恥了。
2、豬一樣的隊友
大家有沒有見過這樣的代碼:
<!-- 原價 180 元,現在活動價 228 元,活動結束後恢複原價 -->
...
這上面的活動價比原價還貴,真是哭笑不得……
類似這樣的代碼,一些程式員在注釋中說明活動的内容,又或者是把一些生産上環境的 IP、端口、使用者名、密碼等敏感資訊把在注釋中,好随時能切換……
真是豬一樣的隊友,這樣的程式員不開除麼!?定時炸彈啊!
3、最牛逼的排序算法
據說是一個月薪 9K 的 Java 程式員,因老闆讓他寫一個排序算法,然後他就寫了一段屌炸天的休眠排序算法,接着他就被老闆開除了……
排序算法代碼大概是這樣的:
這段代碼的完整版解釋請看這篇文章:
剛寫完排序算法,就被開除了…排序排成這樣,不開除你,開除誰?
4、休眠的最高境界
/**
* 擷取未來幾天的日期
* @param days 指定的天數
* @author 微信公衆号:Java技術棧
* @return
*/
public static Date getNextDays(int days){
try {
// 休眠指定的天數
Thread.sleep(days * 24 * 60 * 60 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 休眠結束後傳回日期
return new Date();
}
擷取指定日期用休眠?寫完,已笑暈在廁所。。。
完整版的解釋請看這篇文章:
剛寫完這段代碼,就被開除了……。
想離職找不到借口?
那還不容易,哥送你這段加強版,複制這段代碼,送出打包測試上線,坐等開除。
5、真就是假,假就是真
1.
boolean isBoy = user.isBoy() == true ? true: false;
if (isBoy){
...
} else {
...
}
布爾值可以直接拿來用,你硬要寫個三元表達式?年底績效考核了,代碼量有 KPI 麼?
還有類似這樣的:
if (xx1 == true && xx2 != true){
...
} else {
...
}
還有這樣的:
1.if (xx1 > xx2){
return true;
} else {
return false;
}
寫得太優雅了!
6、循環循環循環
for (int i = 0; i < 1; i++){
...
}
一個循環也用循環,曾經就遇到過這麼一段,不知所雲了,要改這段代碼,還要把他叫在旁邊坐着,看着改才行。。
1.
for (;;){
...
}
死循環這麼寫,我們就看不出來了麼?
7、魔法值的真谛
曾經檢查代碼時,發現代碼中很多魔法值,叫同僚要定義成公共常量,結果來了這麼一段:
private final static int ZERO = 0;
private final static int ONE = 1;
private final static int TWO = 2;
...
看到上面的常量定義,我真想打人,雖然魔法值是沒了,但又定義了一些沒有意義的常量,完全沒有了解修改魔法值的真谛,這和脫褲子放屁有什麼差別?
上面還隻是一個簡單的示例,實際審查情況遠比你想象的糟糕。
8、看花眼的參數
Order order = new Order(orderNo, 1678.13, "CNY", 1, 3, "wx", 5, "1", 0, "8", 0, 1, new Date());
看到這樣的代碼,我也是醉醉的了。
我就見過同僚寫出這樣的代碼,是趕時間呢,還是真的不會設計模式,一個構造函數參數能寫這麼多,且不說魔法值,這麼長,看一眼都覺得頭大。
9、消失的異常
try {
...
} catch (Exception e) {}
程式捕捉了異常,卻不列印。
1.try {
...
} catch (Exception e) {
e.printStackTrace();
}
錯誤是輸出來了,但沒有輸出到日志檔案。
1.try {
...
} catch (Exception e) {
logger.info("...", e);
}
日志級别用的不對,去錯誤日志檔案裡面死活找不着錯誤日志。
上面的種種不規範的寫法,在生産環境出現問題時,一方面導緻排查問題艱難,另一方面,監控系統也不能及時地監控到異常。
10、神奇的if
最後一個了,壓軸了。。
來,我們一起賞析下這段神奇的 if 代碼:
if(user.getFirstName() != null)
if(user.getMiddleName() != null)
if(user.getLastName() != null)
if(user.getNickName() != null)
if(user.getShortName() != null)
if(user.getFullName() != null)
if(user.getFamilyName() != null)
if(user.getEnglishName() != null)
...
return true;
return false;
這段代碼夠奇葩了吧,一個 if 能搞定的非要寫這麼長,還縮進得這麼有層次感。。
小結
寫神邏輯代碼的人才這麼多,找問題、解決問題真是太難了。
你見過最爛的代碼寫成什麼樣?歡迎留言分享~