一步步教你編寫不可維護的 PHP 代碼

来源:https://www.cnblogs.com/summerblue/archive/2018/06/08/9153694.html
-Advertisement-
Play Games

譯者註:這是一篇很棒文章,使用有趣的敘述方式,從反面講解了作為一個優秀的 PHP 工程師,有哪些事情是你不能做的。請註意哦,此篇文章羅列的行為,都是你要儘量避免的。 隨著失業率越來越高,很多人意識到保全自己的工作是多麼的重要。那麼,什麼是保住自己工作,並讓自己無可替代的好方法呢?一個很簡單的事實是只 ...


file

譯者註:這是一篇很棒文章,使用有趣的敘述方式,從反面講解了作為一個優秀的 PHP 工程師,有哪些事情是你不能做的。請註意哦,此篇文章羅列的行為,都是你要儘量避免的。

隨著失業率越來越高,很多人意識到保全自己的工作是多麼的重要。那麼,什麼是保住自己工作,並讓自己無可替代的好方法呢?一個很簡單的事實是只要你的代碼沒有人能夠維護,那麼你就成功保住了工作。編寫不可維護的代碼是一個特殊的技能,但奇怪的是,似乎對某些開發者來說是很自然的。不過對於剩下的開發者來說,這裡有一些技巧和提示來讓你開始寫不可維護的代碼。

首先要做的事情

第一步,從找工作開始。你應該尋找合適的公司,在那裡你可以盡情發揮並實現你那不可維護的潛力。 你不一定需要成為公司的 PHP 大牛如果是那更好。找工作時,如果工作描述提到需要從其它的遷移到 PHP (所以你知道你會做主),或者也可以搜索那種需要10年 PHP5 工作經驗的誤導性工作,再加上熟練使用 FrontPage 和 Netscape Composer 。

一旦你獲得這種千載難逢的機會,從第一天開始就要採取措施。在會議上發言,讓你的意見被聽到。大膽談論面向對象的架構設計,企業,改革方案,怎樣讓夠好變得更好,當然你也得做出相應的承諾。確保每個人在重要的編碼環節都咨詢你的意見。

不可維護的核心

靈感來源於優秀的文章 “Writing unmaintainable code” (想要保住工作的人一定會看的), 以下是你需要掌握和精通的兩個重要概念:

  1. 你應該讓別人無法輕易地修改任何東西,除非他破壞另外一些東西。

    維護人員沒有時間去理解你的代碼。 可維護的代碼意味著能夠在堆積如山的代碼中快速定位到特定的部分,能夠快速明白它是如何工作的並且在不破壞一些東西的情況下進行修改。你不能這樣做。 不能讓別人能輕易地搜索到某些東西或者在他們期待的地方找到。

  2. 你的代碼不能“看起來”不可維護(因為別人會懷疑的), 它必須“是”不可維護。

    代碼在維護人員看起來應該是正常的,但要在他們最意想不到的時候給他們一個驚喜。

最佳實踐

  1. 禁止代碼約定。 關於編碼和命名約定的對罵無窮無盡。這樣的情況絕不能在你優秀的組織中出現。你有牛逼的項目要做,你不可能花上無數的時間來討論用 tab 還是還是空格。再說了,約定就是限制。如果一個新人入職,並且他不習慣你的約定,他會很痛苦。不快樂的程式員是沒有效率的程式員。誰問你你就向他們解釋。讓每個人都用他們自己喜歡的風格寫代碼。至於你自己的代碼 - 變換你的約定。周一用 camelCase 小駝峰命名,周二用 all_lowercase 全小寫命名,周五混合著用,在每個 2 月 29 日 使用匈牙利命名法。
  2. 不寫註釋。 你的代碼很優美,它不需要註釋。如果有人不理解你的代碼,那麼很有可能他們不是那麼好的程式員。如果,有這個可能的話,你被強迫要求寫註釋,那麼直接誇張的寫。詳細描述最明顯和最不重要的代碼,跳過其它的。

        // 下麵這一塊代碼
        // 我們增加兩個變數:
        // 命名為變數 a 和變數 b
        // 兩個都是整數
    
        // 聲明變數 a
        // 並給它賦值整數 1
        $a = 1;
        // 聲明變數 b
        $b = 2;
        // 給變數 a 和 b 求和
        // 聲明和初始化見上面
        // 並且將結果賦值給
        // 一個新的變數 c
        $c = $a + $b;
    
  3. 使用記事本編碼。 或者使用其他沒有代碼縮進展示的編輯器。使得其他人忍受痛苦最終離開團隊。這樣你就不用總是聽他們的抱怨了。如果有人問你為什麼使用記事本,準備好解釋:因為它來自於 Windows (當今唯一一個,為富有創造性的程式員準備的操作系統),無需任何必要的培訓,也不需要花費任何代價。我相信你能在網上找到你可以使用任何程式的參考文獻,甚至包括 Word,來編寫你的網頁代碼,但是只有記事本才是真正的權威,畢竟,你們公司雇佣的人只有你才是權威。
  4. 拒絕單元測試。 向任何質疑你的人解釋,你是被雇佣過來編寫高質量並且沒有漏洞的代碼的(因此,無需測試)。為什麼會有頭腦正常的人會花時間來寫無關緊要的測試來證實代碼能否正常運行?有些事情在生活中就像-天空是藍色的,太陽從東方升起,你的代碼是能夠正常運行的,因此非常感謝。繼續(就像評論一樣,如果被迫接受測試,那麼準備好測試那些顯而易見的內容然後跳過其他的部分)
  5. 不使用模板引擎。 模板引擎能夠幫助你區分業務邏輯層與展示層。它可以保證代碼的可維護性所以你不能遵守這個規定。PHP 之父 Rasmus Lerdorf 說過:“PHP 就是模板引擎”。即使你迫不得已使用模板引擎,也要找到對應的方法濫用它,例如放一些業務代碼在模板中,或者是小心的將HTML(和 CSS 和 JavaScript)代碼混合在資料庫訪問層中。
    一般來說,儘可能在同一行代碼中的將你的 PHP,HTML,CSS 和 JavaScript 代碼理直氣壯地混合在一起。在 PHP 代碼中創建 JavaScript 和帶內聯樣式的 HTML 代碼。如果別人問到,告訴他們這種模式叫做“封裝”,你會對你的代碼負全部責任。

  6. 版本控制。 雖然這很難避免,但是使自己擺脫任何形式或版本控制很值得嘗試。你可以在討論的時候向大家證明這樣做提高了團隊成員之間的溝通,而不是去依賴冷血的版本控制軟體。如果你沒有說服任何人,請不要絕望。 你提交的時候可以不 commit all 。 在本地保留一些自己的代碼。這樣如果你以外的人試圖構建和部署的話,這些小而致命的代碼片段將會破壞這個項目。 如果被抓了,就辯解說這些代碼還不適合展示,畢竟,你提交了能夠教育初級團隊的高質量的代碼和優秀的解決方案。這些小男孩和小女孩將會仰望著你並充滿期待!
  7. 構建一個框架。 然後你不可避免地成為架構師,你的權威毋庸置疑。這樣你就可以添加一些秘密約定(當然其中大多數有時是自相矛盾的),即使是最有經驗的維護人員也察覺不出。 你的框架將負責所有的事情,不需要任何人費心地去理解它,大家會很開心因為你一個人讓開發變得更容易而且提高了整個公司的產能。不要以開源的方式發佈你的框架,因為 a) 這個框架是公司的資產而且公司投入了人大量的資金, b) 開源社區會嘲笑你,而且這將成為你虛張聲勢的結局。

命名相關

你的變數名應該起的神秘一些,最好只有一個字母。 這樣誰都無法通過簡單的搜索找到需要的內容。

類名和方法最好也使用一個字母來定義。如果你確實想定義一個正常點的名字,那就一直使用它吧 —— 記住,隱藏信息的最好方法就是頻繁的使用它。 當重覆使用相同名稱(稱為“面向對象的編程”)時,如果將圓括弧和花括弧放在新的一行,這將有助於提高代碼的可讀性,並且讓隊友在你的代碼中尋找任何東西時,都得重溫一下正則表達式。考慮一下吧:

    $noodles = 1;
    class
    noodles
    {
        var $noodles = 2;
        function
            noodles
            ()
        {
            $noodles['noodles'] = 'noodles';
        }
    }
    function
        noodles() {
            return new noodles;
        }
    $noodles = noodles();
    var_dump($noodles);

你也可以使用奇特的字元集來命名變數。西里爾字母就非常合適,因為有些字母看起來跟羅馬字母一樣, 但其實不是(所有這些:xopekacMEBCTAKXOPH)。那麼下麵的輸出是:

    $alert = 1;
    $аlert = 2;
    echo $alert;

2?如果第二個 alert以西里爾字母"a"開頭,則不可以!

引用相關

即使你非常正常的定義來一些東西,但並不意味著你不能以有趣的方式來使用它。主要的武器有:

  • eval()
  • 可變變數
  • 可變類,比如$strudels = "noodles"; $noo = new $strudels;
  • call_user_func()

基本上任何將代碼視為字元串的語言結構都是你的好朋友。

    // calling abc();
    $z = 'A';
    call_user_func($z .'bC');

大寫

字母例子,函數方法名不區分大小寫,濫用這個特點。

function abc(){
    echo "abc";
}
AbC();

另一方面,數組的健(key) 對大小寫敏感,也濫用這個特點。

$a['UseConvetionsOnlyTobreakThem'] = 1;
if (isset($a['UseConvetionsOnlyToBreakThem'])) {
    // ?? 大寫 B !!1!
}

重寫

在不期望的情況下重寫全局變數,尤其是超全局變數。儘早重寫$_GET數組中的屬性,多次重寫,$_POST亦是如此。在$_REQUEST上做一些不起眼的重寫作為點綴。如果是在WTF-ed上,你可以解釋是在防止用戶輸入的 XSS 攻擊、註入攻擊以及其他的病毒攻擊。

控制結構

使用、混合、匹配所有備選的ifwhileforforeachswitch語法。如果被問起來,所有的這些,請解釋說你正在培訓新員工學習真正的語言。

if ($a > 5):
  if ($a > 4) {
      while ($a > 0):
        echo --$a;
      endwhile;
  }
endif;

嵌套三元運算符,沒有比這個更好、更簡潔的代碼了。

// 猜猜這裡輸出什麼
echo true ? 'true' : false ? 't' : 'f';

for的迴圈體內,再次增加$i以保持所有人的註意。或者,通過不使用$i來實現迴圈增量的驚喜。從不。

嵌套迴圈、深入,然後突然跳出它們(迴圈)。像 break 2break 3 這樣的代碼存粹是為了娛樂,尤其是當混合了奇怪的縮進代碼時。

這是一個開始!

這就是今天的全部。我希望你相信你自己也能做到,你也可以編寫不可維護的代碼。現在你的未來就在你的手中!當然,你也可以編寫可讀性比較高的代碼,但是冒著被替代的風險。

更多現代化 PHP 知識,請前往 Laravel / PHP 知識社區


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 什麼是伺服器? 伺服器也是電腦,只不過是比我們的電腦配置更高的電腦,並且24小時不斷電,不關機的電腦 伺服器是專門用於存儲數據的電腦,訪問者可以訪問伺服器獲得伺服器上存儲的數據 伺服器一旦關機,訪問者就無法訪問 3.瀏覽器訪問網頁原理(理解) 所以綜合我們的第二點和第三點,我們得出一個結論,這些系 ...
  • body{ font family: SimSun,PingFang SC; } ubuntu搭建nodejs生產環境——快速部署手冊 為什麼不用CentOS而用Ubuntu作為生產環境的運行平臺?這個我也比較好奇,公司訂的只能沿用傳統,從使用成本的角度來說,此舉也是值得肯定的。 測試環境 騰訊雲 ...
  • 本書是Eric Evans對他自己寫的《領域驅動設計-軟體核心複雜性應對之道》的一本字典式的參考書,可用於快速查找《領域驅動設計》中的諸多概念及其簡明解釋。 其它本系列其它文章地址: [譯文]Domain Driven Design Reference(一)—— 前言 [譯文]Domain Driv ...
  • 約定 還記得上版本的第二十四篇的約定嘛?現在出來履行啦~ 為什麼要重製? 之前寫的專欄都是按照心情寫的,在最初的時候筆者什麼都不懂,而且文章的發佈是按照很隨性的一個順序。結果就是說,大家都看完了,都還對框架沒有一個感覺,感覺很亂。而現在,經過兩年多的摸索,筆者已經對框架的體系有了一個瞭解,所以希望再 ...
  • Eclipse作為軟體開發的常用工具,被很多的人所歡迎,尤其是豐富的快捷鍵,可以極大的提高編碼的效率,下麵將常用的快捷鍵做了整理,便於大家學習和使用。 Eclipse常用快捷鍵 1代碼提示 Alt+/; 2代碼複製 ctrl+alt+方向鍵(上下) 複製快捷鍵 3單行註釋 方式一:ctr+/ 方式二 ...
  • 轉自:https://my.oschina.net/editorial-story/blog/1808757 本文是學習大型分散式網站架構的技術總結。對架構一個高性能、高可用、可伸縮及可擴展的分散式網站進行了概要性描述,並給出一個架構參考。文中一部分為讀書筆記,一部分是個人經驗總結,對大型分散式網站 ...
  • Java開源生鮮電商平臺-定時器,定時任務quartz的設計與架構(源碼可下載) 說明:任何業務有時候需要系統在某個定點的時刻執行某些任務,比如:凌晨2點統計昨天的報表,早上6點抽取用戶下單的佣金。 對於Java開源生鮮電商平臺而言,有定時推送客戶備貨,定時計算賣家今日的收益,定時提醒每日的提現金額 ...
  • 本文基於 jdk 1.8 。 CountDownLatch 的使用 "前面的文章" 中說到了 volatile 以及用 volatile 來實現自旋鎖,例如 java.util.concurrent.atomic 包下的工具類。但是 volatile 的使用場景畢竟有限,很多的情況下並不是適用,這個 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...