整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          從零開始C語言-02 命名方式and基本數據類型

          從零開始C語言-02 命名方式and基本數據類型

          命名方式

          任何程序員都應該保持一個良好的編碼習慣,以便于以后的維護

          常見的命名方式分別有

          駝峰命名法、匈牙利命名法、帕斯卡命名法和下劃線命名法,其中前三種是較為流行的命名法

          1. 駱駝式命名法就是當變量名或函數名是由一個或多個單詞連結在一起,而構成的唯一識別字時第一個單詞以小寫字母開始;從第二個單詞開始以后的每個單詞的首字母都采用大寫字母,如:myFirstName、myLastName,這樣的變量名看上去就像駱駝峰一樣此起彼伏,故得名。
          2. 匈牙利命名法。廣泛應用于象Microsoft Windows這樣的環境中。Windows 編程中用到的變量(還包括宏)的命名規則為匈牙利命名法,這種命名技術是由一位能干的 Microsoft 程序員查爾斯-西蒙尼(Charles Simonyi) 提出的。如:m_lpszStr
          3. 帕斯卡(pascal)命名法。與駝峰命名法類似,二者的區別在于:駝峰命名法是首字母小寫,而帕斯卡命名法是首字母大寫,如:DisplayInfo(); string UserName;

          基本數據類型

          1. char為一個字節
          2. short為兩個字節
          3. int為4字節
          4. float為4字節
          5. double為8字節
          6. long為4字節
          7. long long 為8字節
          8. __int32為4字節
          9. __int64為8字節
          int main()
          {
          	char ch='h';
          	short sh=5;
          	int n=10;
          	float lf=3.14f;
          	double dbl=9.65000;
          	long l=1016;
          	long long ll=10647;
          	__int32 i32=45;
          	__int64 i64=8963210;
          	printf("ch=%c and siezof=%d\r\n", ch,sizeof(ch));
          	printf("sh=%d and sizeof=%d\r\n",sh,sizeof(sh));
          	printf("n=%d and sizeof=%d\r\n", n, sizeof(n));
          	printf("lf=%lf and sizeof=%d\r\n", lf, sizeof(lf));
          	printf("dbl=%f and sizeof=%d\r\n", dbl, sizeof(dbl));
          	printf("l=%d and sizeof=%d\r\n", l, sizeof(l));
          	printf("ll=%lld and sizeof=%d\r\n", ll, sizeof(ll));
          	printf("i32=%d and sizeof=%d\r\n", i32, sizeof(i32));
          	printf("i64=%I64d and sizeof=%d\r\n", i64, sizeof(i64));
          	return 0;
          }


          程序運行結果

          printf可以留著明天學啦。


          在我們平時刷題的時候,你可能會寫過很多諸如

          int a,b,c
          int [] arrays=new int arrays[10];
          if((numbers > 10 && flag=='true') || flag=='false')

          這種代碼,對于我們自己練習編程或者解決一個算法題,當然沒有問題。但是如果是在一個工程中,尤其是幾十上百人維護了幾年的工程中,還使用這種寫法,傾瀉自己天馬行空的才華,保證leader不打死你哦。

          所以,對于代碼的整潔性,可讀性,自古以來就有很多大神做出過總結,比如這本《clean code》,中文名叫做《代碼整潔之道》,今天,我們就來看看吧。

          命名

          命名思想

          首先就是命名,命名可以說是一切程序的基礎,如果用三個字來形容那就是——“有意義”。

          你要做到,當一個人看到你的命名,就知道這個變量/函數是干什么的

          來看這一段代碼:

          public List<int[]> getThem() {
            List<int[]> list1=new ArrayList<int[]>();
            for (int[] x : theList)
              if (x[0]==4)
                list1.add(x);
            return list1;
          }

          這段代碼非常簡潔,但是非常模糊,我們不知道theList到底是什么,為什么x==4作為判斷,list1又是什么?

          現在我們來改一改:

          public List<int[]> getFlaggedCells() {
            List<int[]> flaggedCells=new ArrayList<int[]>();
            for (int[] cell : gameBoard)
            if (cell[STATUS_VALUE]==FLAGGED)
            flaggedCells.add(cell);
            return flaggedCells;
          
          復制代碼

          從上面的代碼中,我們可以馬上看出來,flaggedCells表達的是標致cell,而cell位于gameBoard中,就是一個游戲面板,只需要再通過文件名,知道這是一個【掃雷游戲】,那么cell就是每一個格子,if語句中就是判斷每一個格子是否被點擊過,如果是,就添加到flaggedCells中,我們顯然知道他想要干什么——搜集玩家點擊過的格子并返回。

          但是,上面的代碼嗎使用的是 int 數組,比如int[] cell,每一個數組內部的數表示cell的狀態,可是cell并不需要那么多狀態,而且這樣導致每次使用這個狀態的時候都要重新定義數組,狀態是cell的一個屬性,所以,完全可以定義一個cell的類,將他的狀態封裝進入。

          public List<Cell> getFlaggedCells() {
            	List<Cell> flaggedCells=new ArrayList<Cell>();
              for (Cell cell : gameBoard)
              if (cell.isFlagged())
              flaggedCells.add(cell);
              return flaggedCells;
          }

          這樣子很清晰看出,gameBoard由Cell組成,從gameBoard中取出標記過的cell放入flaggedCells中,這樣的代碼是不是感覺渾然天成,自然而然呢?

          命名規范

          通過以上事例,你應該理解在寫工程項目時,諸如數組,鏈表,字典這些底層結構應該要封裝在User,Cell,Address這種類中,使用的時候直接使用這些類即可,這是一種大局觀的思維,現在我們來做一些較為細節的落地規范。對于什么駝峰命名,匈牙利命名我相信你不會陌生,但是我在這里再強調兩個地方。

          • 類名 類作為一個對象,需要的是名詞或者名詞短語,gameBoard,Ueser都是如此,不要使用模糊名詞(就是概念很大的名詞),比如Data,因為可以細分為UserData,MoneyData等,對于可以細分的模糊名詞,一定要用名詞短語。 類名都是第一個字母大寫的名詞組合。
          • 方法名 方法作為具體干事的執行者,當然是使用動詞或者動詞短語了,同樣注意的是,不要使用模糊動詞,和上面不一樣的是,解決模糊名詞的方法是增加名詞修飾,而解決模糊動詞的方法是【換更精準的動詞】 比如getInformation,就不好,因為get太大了,你的information是pull過來的還是clone過來的?是被動接受的還是主動去取的?Information這個詞也很模糊,所以可以根據情況拆分為直接取用戶數據——fetchUserData,上傳新數據再取用戶數據——uploadAndfetchUserData。 不是不能用get,是說如果有更好的選擇,盡量用更精準的動詞。 注意方法名第一個字母小寫。

          函數

          第一原則

          短小

          如果還有第二原則,那還是短小。

          短小到什么程度,最多20~30行吧,

          所以要求,一個函數,只做一件事情

          什么叫做只做一件事情呢?

          就拿處理數據來說,我們說【處理用戶數據】是一件事,你也可以說是做了三件事:

          1. 取數據
          2. 處理數據
          3. 返回數據

          當然,這個例子有點抬杠的意思,不過反映的現實是,代碼中各種邏輯往往你中有我,我中有你,到底一件事情的邊界在哪里?

          這個因人而異,我只能提出書中的方法。

          1. 同一抽象級 剛才那個取數據,就是在同一抽象級下完成的事情,就可以看做是一件事,如果再來一件——保存用戶數據,顯然,可以歸到前面,還是一件事,如果再來一件——取車輛數據,顯然,就是另外一個抽象的東西了。
          2. 分割判定與處理 這個好理解,就是立法與司法的分割,比如: if (set("username", "unclebob")) ... 復制代碼就讓人迷惑,他表達的意思是不是如果unclebob成功賦值給username就返回true呢?還是說如果username為null時就用unclebob 賦值進入呢?username到底是屬性還是碰巧一個字符串叫做username呢?隨便猜。 但是我們這樣修改: if (attributeExists("username")) { setAttribute("username", "unclebob"); ... } 復制代碼如果有username這個屬性,就賦值,非常清晰,也就是說,判定與處理要分隔開。

          你可能會說,對于像if,while,switch這種語句,往往動輒十幾行,短不了啊!

          首先,這個原則不是鐵律,實在太長也沒辦法

          其次,對于這些語句,完全可以講里面的邏輯做一個封裝,比如這種:

          public static String renderPageWithSetupsAndTeardowns(
            PageData pageData, boolean isSuite) throws Exception {
            if (isTestPage(pageData))
              includeSetupAndTeardownPages(pageData, isSuite);
            return pageData.getHtml();
          }

          if 語句之后做了一件includeSetupAndTeardownPages的事情,不僅極大增強了可讀性,而且代碼短了不少。

          關于參數

          當你看jdk源碼或者是android源碼的時候,你會發現他們經常做調用,尤其是同名的方法重載,在看《算法》這本書的時候,也是,比如關于快速排序的:

          public static void quickSort(int [] arrays){
            quickSort(arrays,0,arrays.length-1);
          }
          private static void quickSort(int [] arrays,int left,int right){
            ...
          }

          我在一開始接觸的時候,覺得雖然好看,但未免麻煩,隨著經驗的提升,這是一種非常好的編程習慣。

          首先,對于用戶來說,他想要進行快排,想傳的只有數組,左右邊界都包含進去了,你為什么要他多傳參數?同時第一個方法使用的是public,就表示這是暴露給用戶的。

          其次,第二個方法在第一個方法中被調用,用private保護了起來,避免了無數麻煩

          所以,越是業務層的邏輯,越要寫參數少的代碼,如果參數必須要很多,那就用一個private的函數封裝起來,你讓用戶擁有一百個參數輸入,對他來說,那不是自由,那是災難。

          蘋果和微信的使用體驗就是將這種哲學貫徹到極致的代表。

          注釋

          最好的注釋,就是代碼本身

          用代碼能解釋清楚的事情,盡量少用注釋,如果注釋太多,只能證明代碼寫得爛……

          不過有些地方還是有必要寫代碼的。

          位置

          最好寫在方法頂部,不插入到實際代碼中,比如那個面試幾乎必問的String中的equals方法,源碼如下:

           ... 
           * @see  #compareTo(String)
           * @see  #equalsIgnoreCase(String)
           */
          public boolean equals(Object anObject) {
              if (this==anObject) {
                  return true;
              }
              if (anObject instanceof String) {
                  String anotherString=(String)anObject;
                  int n=length();
                  if (n==anotherString.length()) {
                      int i=0;
                      while (n-- !=0) {
                          if (charAt(i) !=anotherString.charAt(i))
                                  return false;
                          i++;
                      }
                      return true;
                  }
              }
              return false;
          }

          警示的注釋

          這里可以寫一些告誡他人的代碼,讓后來的接盤俠能夠引起重視。

          //When I wrote this, only God and I understood what I was doing
          //Now, God only knows

          簡單說就是,下面的代碼一定有用,但是我也看不懂了,你別碰O(∩_∩)O哈哈~

          在知乎上看到還有這樣的。

          //如果這段報錯,你在機器上裝一個360安全衛士,相信我我
          以為是開玩笑,結果裝了就真的好了。這個是前人留給我的。
          //這個服務有問題的話,你可以問某某某,這段是他寫的。
          這個是在我離職交接時寫的,出賣了未離職的一個同事。
          //執行成功后發送一條通知短信,穩定后注釋掉
          手機號是寫死的,我看到這段的時候還沒有注釋,這一年每天凌晨他都能收到短信。

          這些人水平怎么樣另說,但是對于后人還是用心的。

          TODO注釋

          這個就不說了,很常用。


          看完了有用的注釋,我們來看看沒用的注釋

          多余的

          // Utility method that returns when this.closed is true. Throws an exception
          // if the timeout is reached.
          public synchronized void waitForClose(final long timeoutMillis)
            throws Exception
            {
          		if(!closed)
          	{
            wait(timeoutMillis);
            	if(!closed)
            		throw new Exception("MockResponseSender could not be closed");
            }
          }

          這就是把代碼做了什么又描述一遍,沒有任何意義。

          被注釋掉的代碼

          InputStreamResponse response=new InputStreamResponse();
          response.setBody(formatter.getResultStream(), formatter.getByteCount());
          // InputStream resultsStream=formatter.getResultStream();
          // StreamReader reader=new StreamReader(resultsStream);
          // response.setContent(reader.read(formatter.getByteCount()));

          相信很多人都有這樣的行為,在自己寫算法題的時候用來測一測沒有任何問題,但是對于后來者來說,他該怎么辦?

          他一定會想:也許是有用的呢?不然為什么之前要寫。

          但是他又看不懂或者覺得沒必要看,于是就留了下,然后這樣的代碼就會越來越多,最終成為傳說中的祖傳代碼。

          不用心

          注釋要清楚,如果注釋還要寫注釋來解釋,根本沒有意義。

          比如下面這個,為什么要用200?

          /*
          * start with an array that is big enough to hold all the pixels
          * (plus filter bytes), and an extra 200 bytes for header info
          */
          this.pngBytes=new byte[((this.width + 1) * this.height * 3) + 200];

          小結

          對于多數人來說,命名函數與注釋基本上就是程序的主要組成部分,能夠處理好這三樣就能寫出非常好的代碼了,當leader看到你的提交的時候,看到的是如此優雅的代碼,我想,他也會覺得是一種享受吧,就和詩歌一樣。

          作者:神鷹夢澤

          鏈接:https://juejin.im/post/5f14043b6fb9a07e802055ce

          來源:掘金

          ello,大家好,暖寶給大家帶來js新的干貨,覺得文章不錯,點擊右上角關注暖夕H2

          ECMAScript和Dom和Bom的區別

          ECMAScript是一種由Ecma國際(前身為歐洲計算機制造商協會,英文名稱是European Computer Manufacturers Association)通過ECMA-262標準化的腳本程序設計語言。這種語言在萬維網上應用廣泛,它往往被稱為JavaScript或JScript,但實際上后兩者是ECMA-262標準的實現和擴展。它是一種翻譯核心解釋器,ECMAScript實際上是一種腳本在語法和語義上的標準。

          Dom文檔對象模型(Document Object Model,簡稱DOM),是W3C組織推薦的處理可擴展標志語言的標準編程接口,它是操作Html的一種能力。

          Bom BOM(Browser Object Model) 是指瀏覽器對象模型。

          undefined的情況定義

          1》未定義

          2》變量定義為空

          parseInt()與parseFloat()

          parseInt()用來轉整數,parseFloat()用來轉小數

          隱世類型轉換

          “==”先轉換類型后比較

          “===”不轉換類型,直接比較

          舉例:

          作用域

          局部變量在定義的函數里使用,全局變量在任何地方都能夠使用

          閉包:子函數可以使用父函數的局部變量

          舉例:

          變量命名規則

          變量的命名規則為可讀性,易看懂,規范性。

          匈牙利命名法是由匈牙利程序員Charles Simonyi發明的一種編程語言中對變量進行命名的規范。基本原則是:變量名=屬性+類型+對象描述,其中每一對象的名稱都要求有明確含義,可以取對象名字全稱或名字的一部分。要基于容易記憶容易理解的原則。保證名字的連貫性是非常重要的。

          舉例:表單的名稱為form,那么在匈牙利命名法中可以簡寫為frm,則當表單變量名稱為Switchboard時,變量全稱應該為 frmSwitchboard。這樣可以很容易從變量名看出Switchboard是一個表單,同樣,如果此變量類型為標簽,那么就應命名成lblSwitchboard。可以看出,匈牙利命名法非常便于記憶,而且使變量名非常清晰易懂,這樣,增強了代碼的可讀性,方便各程序員之間相互交流代碼。

          好了,今天干貨到這里了,記得關注暖夕H2,更多好的技術干貨帶給你。


          主站蜘蛛池模板: 一区二区三区免费视频播放器 | 成人精品一区二区三区不卡免费看| 亚洲韩国精品无码一区二区三区| 日韩精品一区二区三区中文| 无码人妻久久一区二区三区免费丨| 国产精品熟女视频一区二区| 中文字幕不卡一区| 国产韩国精品一区二区三区久久| 精品一区二区三区免费毛片| 中文字幕一区二区三区在线观看| 国产伦精品一区二区三区免费迷 | 国产精品一区二区三区久久| 亚洲一区精品无码| 亚洲国模精品一区| 日韩精品久久一区二区三区| 奇米精品视频一区二区三区| 一区二区三区无码高清| 日韩人妻一区二区三区免费 | 一区二区三区人妻无码| 狠狠色婷婷久久一区二区三区| 亚洲午夜一区二区三区| 美女毛片一区二区三区四区| 中文字幕人妻丝袜乱一区三区| 男人的天堂亚洲一区二区三区| 亚洲av成人一区二区三区在线播放| 中日av乱码一区二区三区乱码| 中文字幕日本一区| 好看的电影网站亚洲一区| 一区二区三区人妻无码| 亚洲制服丝袜一区二区三区| 91一区二区三区四区五区| 色妞色视频一区二区三区四区 | 欧美亚洲精品一区二区| 亚洲综合av一区二区三区| 加勒比无码一区二区三区| 麻豆va一区二区三区久久浪| 日韩免费无码一区二区视频| 午夜福利国产一区二区| 国产在线观看一区精品| 久久伊人精品一区二区三区| 无码乱码av天堂一区二区|