使用boolean可能是邪惡的 ?

剛剛在DZone 看到這一篇:boolean arguments can be evil

DZone是個針對程式設計的digg-like網站, 訂閱了熱門書簽一陣子了,文章的質量還蠻不錯的。不過有個缺點,就是文章來的太多太快…orz,很容易來不及看…

阿 回到正題 , 這篇提到一般在幾種情形下使用boolean參數的情形,並說明為什麼可能是邪惡的(主要是語意不明的問題)。

1) 在一般的函式中使用(多參數)

作者認為在這種情形之下使用boolean是不好的,像是:

File[] withText = finder.find(root, “java", true);

這樣閱讀的人還要回頭去查手冊才知道true是什麼意思。 所以作者建議在這種情形之下可以把函式拆成兩組。

2) 在一般的函式中使用(單一參數)

ok 沒問題,可以這樣用。因為語意的問題已經由函式名稱說明了,像是:

window.setVisible(true);

3)在建構式中使用

一樣不好, 因為語意不明。

乍看之下不錯的建議,可是如果多參數的函式有好幾個boolean 像是: xxx(boolean,boolean,boolean),那函式不就要拆成2*2*2 = 8個 o_O!!!

所以我比較喜歡第一個迴響 的建議:

what about extracting a local variable (or a constant)?
Example:

boolean recursive = true;
boolean notRecursive = false;

File[] withText = finder.find(root, “java", recursive );

這樣應該好多了。

廣告

5 thoughts on “使用boolean可能是邪惡的 ?

  1. 如果是我的作法,在建構式裡我會採用像 jQuery 常用的參數方式,也就是參數物件:

    var test = new Test({
    attr1: true,
    attr2: false
    });

    PHP 則可以使用關連陣列:

    $test = new Test(array(
    ‘attr1’ => true,
    ‘attr2’ => false,
    // …
    ));

    Java 我不熟,不過應該也有類似的做法。

    用這樣的方式在寫程式時會比較容易瞭解,而且不用擔心參數順序。唯一麻煩的是,在處理參數上要多一道手續。

    參考看看 🙂

  2. 剛剛留的言不曉得為什麼不見了?

    如果是我的話,我會採用參數物件的作法,以 JavaScript 為例:

    var test = new Test({
    attr1: true,
    attr2: false
    });

    在 PHP 的話就用關連陣列:

    $test = new Test(array(
    ‘attr1’ => true,
    ‘attr2’ => false,
    ));

    (Java 我不熟,不過也許有類似的做法。)

    以上的做法在寫程式時就會比較清楚,也不用記參數的順序;不過缺點是要在函式裡多一道處理參數的手續,而且沒辦法確定參數的型態 (用 IDE 開發的話會很麻煩) 。

    參考看看 🙂

  3. Jaceju 大人:

    真是抱歉,wordpress居然將您的留言誤判成spam了。
    我會努力的鞭打他們 XD

    我記得java沒有這種語法呢! 本文作者在迴響中也提到了可以用模擬的方式,不過我覺得實在不是很好。

    不過老實說…我幾乎都不這樣用 =.= 可以的話 我應該要改一下我的習慣阿 😛 感謝 Jaceju囉

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s