トップ «前の日記(2005-04-01) 最新 次の日記(2005-04-03)» 編集

日々の破片

Subscribe with livedoor Reader
著作一覧

2005-04-02

_ まとめサイトは作らないけど

3項演算子について、1人だけ嫌いと書いてる人を見たけど、「わからない」とか「わかりにくい」と書いてる人は見かけなかったな。そもそも論では本気でわからない人がもし存在したら何も言わずにif文を死ぬほどたくさんネストさせているという罠。使い方を教えてやってくれ。

とは言え、多重になっている場合についてはわかりにくいというのは僕を含めて2人いたから、規約的にはせいぜい「複雑にネストした3項演算子は使わないようにしましょう」くらいなものでしょう。

っていうか、ある言語を使ってプログラミングの仕事をするって話のときに、文法として存在しているものをわかりにくいとは何のことなんだろう? とか言うと、Cにはgotoがあるけど使うのか、とか全然関係無い話をしだしたりするんじゃなかろうか。

もちろん、使う。必要ならば。そして、使わせる、必要ならば。

本当にへたくそな人間がgotoを使わないとどういうコードを書くかみたことはあるまい。僕も再現はできないけど、こんな感じになるのだ。

int aflag = 0;
int bflag = 0;
int cflag = 0;
while (condition) {
  if (x) {
    ...
    if (xx) {
      aflag = 1;
    }
  }
  if (!aflag) {
    ...
    if (xx) {
      bflag = 1;
    }
    ..
    if (!bflag) {
    ...
    // ネストが深くなりすぎて元に戻していたり
  if (!aflag && !bflag && !cflag) {
    ...
    dflag = 1;
  }
  ...//本当は、a0からはじめてz999くらいまである
}

頼むからgotoを使ってくれ。これは読めない。と言うとけげんそうな顔をして、「でもgotoは使うなと教わりましたが何か?」とか。教えるなよ。教えるなら「gotoはif, while, for, do などの制御構造で以降の処理をスキップしたい場合に、制御構造の直下に配置したラベルに対して利用してください」と教えて欲しいものだ(追記:ああ、そうか。これだとbreak使えばすむから確かにちょっと違うな。でも思い出せないやというか思い出したくも無いというか)。何しろへたなんだから、whileの中をうまく構成することもできずに、次々とフラグを立てていって後続の処理をスキップさせていったりするのだ。であれば、とりあえずgotoを使わせてすっきりしたコードを書かせて、そこから少しずつ変えていったほうが効率が良い。

もし、そのプログラマがへたならば、制限させるととてつもなくへたな工夫をすることになる。だったら、制限なんてしないほうが良い。選択の余地がたくさんあると、本当にへたならば、どうしたらよいかわからなくなって聞きに来る可能性がある。その時、考え方を示せば良いだろう。そして、うまくやれる人間ならば、もちろん、余分な制限なんてないほうがうまくやれる。

規約の本質は、見てくれの雰囲気を合わせて、誰が誰のソースを見ても同じように見えるようにすることにあるんじゃないか? つまり日本語の文書であれば、「である」で統一とか「ですます」で統一とか。でも「非同期」という用語はわかりにくいから使用禁止とか、「推測」という漢語はわかりにくいから「と考えられます」と記述しろ、とか決めないと思うんだが。ある演算子を規約で利用させないってのは、そういう次元の馬鹿馬鹿しい話だ。結局、K&Rで行くか、GNUで行くか(勘弁して欲しいけど)、といった()や{}なんかの位置とインデント幅、そのくらいがあってりゃ十分だ。

_ 今更だが

ハッカーと画家 コンピュータ時代の創造者たち(ポール グレアム/Paul Graham/川合 史朗)

やっと、ハッカーと画家を読んだ。といっても相当部分はshiroさんのサイトで読んでいたりするわけだが。

で、P.201を読んでいてそりゃそう書くよなと思った(というか、こないだクロージャについて書いてあったのに反応してそう書くと書いてるし)あとに、「これは整数でしか動作しないという点で元のスペックに届いていない」と評されていて、あ、そうかと納得してしまったり。でもそれはなんかいんちきだな(追記:shiroさんのコメントと引用されているURL先を見て、読み直してみたら全然いんちきじゃない。P.198に「数n」という書き方をしているから、整数nに限定されてしまう時点で「元のスペックに届いていない」となるからだ。Javaだとそういう場合はObjectを使うしかないからこんな感じかな。1.5だともう少しすっきりと書けそうだ)。素直に単純ではないと書いたほうが良さそうだ。

本日のツッコミ(全6件) [ツッコミを入れる]
_ naka64 (2005-04-02 07:04)

ふつうならbreak文/continue文が出てくる箇所だし、そもそも別関数に出すし。<br>禁止令では人は賢くできませんなぁorz

_ arton (2005-04-02 09:47)

それは僕がうまく再現できなかったからで、breakでは無理(というかさすがにbreakはわかっている)だったんですよ。<br>>別関数にする<br>結局はこれにつきるんですけどね。

_ naka64 (2005-04-02 12:15)

すみません、確かにJavaの「break ラベル;」のようなケースだとgoto文が推奨でしょうね。<br>ただ、そこに行く前に見通しを求めて別関数化してしまいそうな。

_ shiro (2005-04-03 17:52)

「これは整数でしか動作しない…」というのは、「Lispなら動的型付けだから整数じゃなくてもOKよ」という意味ではなく、ジェネリックなものを一発で書けるかどうか、を問題にしているんではないでしょうか。すなわち、この条件はこの課題だけに留まらず、抽象型を自由に扱えるアルゴリズムが楽に書けるかどうかというテストにもなっているわけです。<br><br>例えばHaskellなら(monadを使うことにはなりますが) '+' が定義されている型全てに適用可能な版を一発で書けます。C++もテンプレートを使えば可能です:<br>http://www.paulgraham.com/accgen.html

_ arton (2005-04-03 19:23)

なるほど、言われてみればそうですね。<br>なんか口惜しいから作ってみました。いんちきかなぁ。

_ arton (2005-04-03 19:55)

すみません、上で「言われてみれば」とか書いていますが、読み直してみて納得しました。単に僕の読みそこないでした。


2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|

ジェズイットを見習え