ラベル bad programming の投稿を表示しています。 すべての投稿を表示
ラベル bad programming の投稿を表示しています。 すべての投稿を表示

2013年3月9日土曜日

ウンコードを鑑みる その2+3



フラグを逆にしたり変なifにしたり。
http://unkode-mania.net/view/51362449ff22d3ce02000000

複数のフラグやら、多段ifを多用する実装は、状態遷移をうまく表現できてないんだと思う。ただそもそもの話、C++に「BOOL型」は存在しないので、こういうことをやらかす人種は、enumに統一した方が無難じゃなかろか。

日本語メソッド名
http://unkode-mania.net/view/5029e1a9eef2c7f861000008

意見が真っ二つに別れてますが、肯定派にたいして「動けばいいと思ってるんじゃ」ってのも失礼な話でしょ。もちろん思ってませんよ。日本語の解りやすさを全面肯定してるだけです。

Javaから見れば特異なことかも知れませんが、tclにはフツーです。ひょっとしてlisp族でもできるんじゃないかな。だから「識別子が英単語でなければならない」は感覚が古いとは小生も思います。

更に、「要件定義者も、プログラムを書けた方がいいんじゃなかろか」という別の要件もあり、プログラム初心者にとっつきやすくなるネタは歓迎します。

http://unkode-mania.net/view/5133e630ff22d3b640000001

結構なベテランでもヤりますね。正直。Windows畑の人に多い気がする。ええ、偏見です。
引数の省略を全部指定してるところを見ると、C++/Javaからの移行組で、オーバーロード?に対しての、引数の省略を誤って理解してるんじゃないかと思います。

http://unkode-mania.net/view/502e55df81376aba02000003

このプログラムの本質的問題は、

  • flagと言いながら実は多値
  • get_flag_2010_04()の戻り値と比較してしか判定できない。
多値の値をもつものをフラグと呼んでは断じていけません。倒したり立てたりするから「旗」なのです。まあそんなミクロな話はおいといて。
このプログラムの意図は、flagの値をデコードすることの様ですね。そこまで鑑みると、これはC/C++の、intを色々兼用する言語での、生活の知恵に見えてこないでもないです。折角const定義しても、使わなければ元の木阿弥です。それよりは、このケッタイナ実装の方がまだ「値の理由が判るかもしれない」。

http://unkode-mania.net/view/5131df75ff22d3be40000007
なんでコレが駄目なのか判らない。統一のメカニズムですべてのページが表示できたほうが楽でしょう?それがフレームワークでは?

http://unkode-mania.net/view/5129aaaeff22d35204000000
短くしようという「意志」はなくすべきではありません。断言しますが、まったく同じ処理をするためのものであるなら、短いプログラムは、長いプログラムより優れています。
マズイのはやはり"flag"。この名前が出てくるプログラムは大抵マズイです。flag=trueなら、sizeを4倍するとか、意味判りません。上位関数はなにをやってるのか?
これはひょっとして、2番めの引数は"size"じゃなくて”length"で、※つまりバイト数指定じゃなくて「容積」指定3番目の引数は"flag"じゃなくて"is_long"なのでは? ※つまり1個あたりのサイズの切り替え
って言うかbufferSizeをダンプしてみりゃ判るでしょ。もしかして組み込みなのか?単体テストもしないでブッつけ本番?

2013年1月14日月曜日

ウンコードの殆どは、実は言語仕様に問題がある。と思う

代入と比較の取り違え
http://unkode-mania.net/view/5055e449a753b5d160000008

代入演算子と、比較演算子の取り違えはよくありますが、テストすりゃ判る。それはその通り。

式の中で、代入と比較を混在できるのも、よくよく考えればヤバイ。とは言え、これは手続き型言語の鬼門とも言えますな。本来は言語仕様レベルでなんとかするべきでしょう。この点考慮してるのは、pascal系ぐらい?しかも流行ってません。この間違えた誰かさんはpascal育ちなのでは無いでしょうか?そんなに馬鹿にしたものではないかもよ。

そもそも字面が1文字違いってのもヤバいです。イコール1個忘れたら動かないわけですよ?むしろ間違えるなって方が無理。よくよく見ても判りません。小生、乱視が酷くてですね。

そういう意味では、Java族のgetter/setterはその反省といえるのかも知れませんが、1文字違いなのは解決してないという。

クラス初期化にmemset
http://unkode-mania.net/view/5019208444f2527722000000

Cまではメモリ管理がプログラマ任せでしたから、その調子でC++を書けば、こんなことは起こるでしょう。intで宣言したら0入れて、char[]で宣言したらmemsetで、ってそんな馬鹿正直に書くより、全部memsetしちゃったほうが賢い。悪いのは仮想関数の機構、および、初期化しませんっていう、C/C++ランタイムのサボリです。

forの2段目のコピペ間違え
http://unkode-mania.net/view/50177f11fc12b2e54a000000

これは古典的Cのfor構文が悪い。ネタでは2段ループの2段目を間違えました。ってオチですが、実はこれ。1段でも起こります。

古典for構文では、制御変数を3回書かなければならない。故に、後発の軽量言語では大抵foreachが使えます。極力ソレを使うべき。なにより、「ループの意図」を明確にできます。

逆に、古典forの3ブロックの式で、すべて別の変数をイジることはできるわけですが、むしろ小生としてはそっちの方が有用だと思ってます。

  • ループの前に必ずやること、
  • ループの終了条件、
  • ループの最後に必ずやること、


という3点を明記できますから。

初期化ブロックとかを空にして無限ループとかいう小細工も横行してますが、小生の感覚では、これは裏技です。コンパイラを騙してる感がします。

2013年1月5日土曜日

2段以上のifを書いたら負け ( ウンコード )

ウンコ確定のコードを勝手にレビューして、勝ったつもりになる企画です。

しかし、ウンコはPHPが多いかと思ったけど、Javaも多いんだなー。
これで、「オレJavaプログラマだから単価高いぜー」とか粋がってる奴が多いんだよな。※主に2chだが

http://unkode-mania.net/view/50a1018a61fd523468000000
これは、完全に「真偽値を返す」が目的になってしまったケース。
小生の数少ないサンプリングでは、16bitの時代からやってる人は、checkって付けたがる。
そして、コメントも「○○をチェックする」とか書いちゃうんですよね。
「真偽値を返す」は手段であって、目的ではありません。

http://unkode-mania.net/view/503cf8bd81ce286163000001
かなりベテランでもこういう多段ifを書く人はいますね。
なんか、「大雑把なエラーケースは、大雑把なifで最初に括りたい」という俺ルールがあるらしい。
それ自体は判らんでもないが。

ただし、これをうまく折りたたむのはかなりコツが要ります。
正直、免許皆伝レベルでしょう。
それが出来る人なら、大抵の要件で、大概美しく書けることでしょう。

小生、「2段以上のifを書いたら負け」っていう独りルールを課して仕事してます。
え、だって、同じ条件式が何度も出てくるって、恥ずかしいでしょう?

出稼ぎ先の皆さんにも課してしまいたい。正直。

http://unkode-mania.net/view/5035b6194525595031000024
これも目的と手段が逆転してるタイプ。
「3日だから」という「手段」しか頭にない。
もしくはネーミングセンスが壊滅的な人。
多分UtilとかMiscとかvalueとかやるに違いない。
「「3日」が何なのか」を変数名にするべき。

http://unkode-mania.net/view/5033834e57c8e41736000004
これはどっちかというと、delete()が失敗した時に、例外を吐くべき。
Javaのお作法なら、そっちのほうが正当だと思うのだが。

http://unkode-mania.net/view/50326320383b806b09000000
怖!

http://unkode-mania.net/view/5060461ea753b5a970000000
一個の関数に処理を全部ねじ込んで、mode=1 とかやりたがる人は結構居ますね。
「処理の違いが、数行だけなんです」というなら、判る。それでも辞めて欲しいけど。

明らかに「複数系統の処理が同居」しちゃってるのは、「カプセル化」が判ってない。
「カプセル化」ってのは、オブジェクト指向云々の話ではありません。処理の粒度の話ね。
えてして、こういうコーディングする人は、非常に改造しにくい実装をやらかすので
仕様変更の毎にゴネます。