顯示具有 Coding Style 標籤的文章。 顯示所有文章
顯示具有 Coding Style 標籤的文章。 顯示所有文章

2012年3月13日 星期二

C&C++: [問題] 新手發問"!!"的意思

!!
節錄部份

 作者  Barros (Leila)                                       站內  Programming
 標題  [問題] 新手發問 "!!"的意思
 時間  Thu Mar  8 21:11:04 2012
───────────────────────────────────────

看資料結構的書的時候,應該是用c寫的吧
發現code裡出現 !! 這個符號
煩請解惑感激不盡~

節錄部份code:

BinQueue
Merge(BinQueue H1, BinQueue H2)
{
  Bintree T1, T2, Carry=Null;
  int i j;

  if(H1->CurrentSize +H2->CurrentSize >Capacity)
    error("Merge would exceed capacity");
  H1->CurrentSize += H2->CurrentSize;
  for(i=0, j=1; j<= H2->CurrentSize; i++, j*=2)
  }
     T1=H1->TheTrees[i];T2=H2->TheTrees[i];

  switch( !!T1 + 2 * !! T2 + 4 * !! Carry)
  {
      case 0: /*no trees*/
      case 1: /*only H1*/
           break;



--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 219.84.2.1
→ Barros:因為google過了也找不到 只好來這裡發問了       219.84.2.1 03/08 21:12
→ tropical72:是長得像這樣嗎?int a=5; if(!!a)..    123.195.165.40 03/08 21:13
→ tropical72:簡單的說,a是非0的話,!!a會傳回1;否則  123.195.165.40 03/08 21:14
→ tropical72:傳回0。                               123.195.165.40 03/08 21:14
※ 編輯: Barros          來自: 219.84.2.1           (03/08 21:29)
→ s66449:加了兩個not 不就等同互相抵消了??          114.27.187.150 03/08 22:13
→ s66449:有加和沒加是一樣的?                       114.27.187.150 03/08 22:13
→ tropical72:不同唷,a=1,b=5而言 :                  123.195.165.40 03/08 22:19
→ tropical72:a+=b; --> a+=5 ---> a=6;              123.195.165.40 03/08 22:20
→ tropical72:a+=!!b ---> a+=!(!5)-->a+=!0-->a+=1   123.195.165.40 03/08 22:20
→ tropical72:--> a=2;                              123.195.165.40 03/08 22:20
→ tropical72:(T1!=0)|((T2!=0)<<1)|((C!=0)<<2)      123.195.165.40 03/08 22:26
→ Barros:了解了,謝謝                                219.84.58.43 03/08 22:47
→ MOONRAKER:真是神祕。                               61.231.8.206 03/09 08:46
推 yauhh:一個!將整數變成布爾值,但邏輯意思是反的,     180.206.52.95 03/09 18:42
→ yauhh:再加!就回來了.                              180.206.52.95 03/09 18:43
→ yauhh:他做二件事,一是將整數對應為0,1,二是將0,1   218.160.108.73 03/09 21:56
→ yauhh:(true,false)反過來當作數字來用. 但例子中   218.160.108.73 03/09 21:57
→ yauhh:看起來作法好怪,邏輯運算當數字運算用,數字   218.160.108.73 03/09 21:57
→ yauhh:運算卻當位元運算用.                        218.160.108.73 03/09 21:58


 作者  LPH66 (-858993460)                                   看板  Programming
───────────────────────────────────────

這是懶人用switch...

!! 是做兩次 boolean not

所以非零的會變成 1  是零的就還是 0

於是  !!T1 + 2 * !! T2 + 4 * !! Carry 這個算式

將三件事 (T1 != 0, T2 != 0, Carry != 0) 編碼成一個整數

若三者都為 0 則它會算出二進位的 000 = 十進位 0

若只有 T1 非 0 則它會算出二進位的 001 = 十進位 1

若只有 T2 非 0                    010 = 十進位 2

若只有 Carry 非 0                 100 = 十進位 4

等等

這樣就能以 switch 一次判斷三個條件的真假

你可以注意到這個 switch 裡的 case 有註解寫說這是什麼情況

就是這麼來的

※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.28.91

→ popcorny:我是覺得最起碼要用Macro包一下           114.32.239.120 03/11 14:20
→ popcorny:#define ISTRUE(x) (!!(x))               114.32.239.120 03/11 14:21
→ popcorny:可讀性跟你說的其實沒有那麼衝突          114.32.239.120 03/11 14:22


 作者  adrianshum (Alien)                                   看板  Programming
───────────────────────────────────────

不是覺得這種精簡寫法一定有錯,但同樣做法,真的要寫得那麼
非直覺嗎?為什麼不可以寫成:
int t = 0;
if (T1) t |= 1;
if (T2) t |= 2;       // 或寫成 t |= (1<<1);
if (Carry) t |= 4;    // t |= (1 << 2)

switch (t) {
  //..
}

再不然,寫成
int t = (T1? 1 : 0) | (T2 ? 2 : 0) | (Carry ? 4 : 0);
(以上 bitwise OR 可改用 +,看你自己喜好)

這樣單從 code 表面上就看得出是根據 T1, T2, Carry 來 turn-on
各個 bit。除非真的程式慢得連這一點點 performance 都要壓搾,
不然至少對我來說,上面的寫法比 !!T1 + 2 * !! T2 + 4 * !! Carry
看起來合理得多了

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 223.19.47.36

2011年3月31日 星期四

Re: [閒聊] Java的CheckStyle...

http://disp.cc/b/27-1u06
節錄部份


 ptt.cc
=============================================================
作者  hegemon (hegemon)      看板  Soft_Job

Java Code都要符合CheckStyle Plugin的標準.

tab跟四個space,括號前後space,或是變數大小寫

一個method不能超過一百五十行,一個method不能代入超過七個變數.

========================================================================
作者: newjoy (職業格鬥家) 看板: Soft_Job



<軟體建構之道>(code complete)裡面就有提到
"人腦所能掌握的物件個數大約在七個左右, 所以變數跟參數最好不要超過7"

掌握設計時真正的想法, 才能循線把整個設計實作出來
設計師把衣服的設計圖畫好, 材質選好, ......然後送給中國大陸去製造
然後成品就整個毀了...
由於製作的工人完全不能體會設計者的用心, 作出來的成品自然參差不齊.

========================================================================

根據統計, 只要一個method超過這個行數, 可能就要思考一下另行的作法了
另一方面也是為了code可讀性的關係.

所以, 當參數個數太多的時候, 你可能要考慮一下是不是要把這些參數包成一個
private的class, 然後user看class name就大概能知道這裡面的參數是什麼用途.
ex :

菜刀
覘板
牛肉


的參數可以包在一個叫做"晚餐材料"的class裡面傳遞給method.

==========================================================================

一個method 不能超過 150行, 也是為了怕沒經驗的coder把一堆有的沒的全部寫在
同一個method裡面, 造成可讀性&複用性差(而且會這樣通常是copy & paste造成的).
通常如果幾行code描述一件事, 那最好就用一個method把這件事包起來.
比如說 :

脫外褲;
脫內褲;
大便;
沖水;
穿內褲;
穿外褲;

看的人可能要一直讀到一個段落才能了解你的意思, 那乾脆就直接包成一個叫
"去上大號"的method, 清楚多了

=========================================================================

因為就你所說的情況, 很明顯是因為整個程式整體架構的問題,
現行有ORM比如引入Hibernate可以減少SQL行數的問題,
反正絕對不是幾個小coder敲敲鍵盤全手工打造 + check style
就能在一兩個月內解決的, (這是架構問題, 應該是project leader要解決的)
在沒整體修改架構前, 反而會為了要遵守這個check style而產生更多問題.

另外, 一支優秀的API, 註解比code多很多才能讓user用得很安心
這個150行的限制竟然包含註解絕對是錯的
這豈不是鼓勵大家為了就範而產生大量無註解的爛code嗎?

=========================================================================

如果不清楚原因跟相對應的OO寫作技巧
而硬是要去遵守150行限制, 會產生一大堆沒有內聚力的
classA-1
classA-2
classA-3
這是OO典型的anti-pattern阿! 它本來是想解決code難以閱讀維護的問題,
但是方法沒用對, 反而造成更大的問題. (比全部寫在同一隻code還難trace)

2011年3月11日 星期五