パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

「世界一IQの低い」ソースコード」記事へのコメント

  • というわけで、「自分ならこう書く」具体例をどうぞ。
    • リフレクションを使えば、ってのがあまりリフレクションを使ったことがなくてピンとこなかったので、添削してもらうつもりで。

      String ret;
      Class clazz = KeyEvent.class;
      Field[] fields = clazz.getFields();
      for (Field field : fields) {
              try {
                      if (keyCode == field.get(null)) {
                              ret = field.getName();
                      }
              } catch (Exception e) {
              }
      }

      こんな感じ?或いは、今ならJava8だからlambdaで

      Class clazz = KeyEvent.class;
      List fields = Arrays.asList(clazz.getFields());
      String ret = fields.stream().filter(field -> {
              try {
                      return keyCode == field.get(null);
              } catch (Exception e) {
                      return false;
              }
      }).findAny().get().getName();

      こうとか?
      Field型の中身を取ってくるのに例外処理を書かなきゃいけなくて、全然簡潔にならなかったけど・・・。

      親コメント
    • by Anonymous Coward on 2014年08月05日 13時21分 (#2651360)
      親コメント
      • 本当に適切な代案はあるのか?
        代案コードの掲載に1pとして、代案コードの解説を残り3pで出来るのか?
        多分アホみたいに列挙したのは改造が簡単だからだろうと思われるのだが、
        そうする場合にどうするべきかについてまで説明はできるのか?

        具体的なコードを元に、その辺を話そうぜ、ってフリなんだけど?

        親コメント
      • by Anonymous Coward

        KeyName = KeyNameArr(enum.keycode001)
        KeyCode = KeyCodeArr(enum.keyname001)

        Javaは知らん素人ですが、分岐とかループなんか使わなくても
        こんな感じのマッピングで一発なんじゃ。

      • by Anonymous Coward

        HashMapはこの数だとパフォーマンス的に単純分岐のコードに負ける可能性があるし、
        65536のString配列はメモリの無駄だろうし。

        そもそもIDを文字に変換してどうするの? デバッグメッセージ用?
        まさか、文字列でIDを比較とかしないよね?
        要件がちゃんと分かればもっとよい代替案があるかもよ。

        • by Anonymous Coward

          そもそもIDを文字に変換してどうするの? デバッグメッセージ用?。

          SQLクエリの動的生成用、とか?

    • 素直なので、Excel でちゃんと本の通りのコードを生成してソースに貼り付けます。

      --
      マクロの基本は検索置換(by y.mikome)
      親コメント
    • by Anonymous Coward

      最初に考えるべきなのはアルゴリズムじゃなくてデータ構造だ、って、ばっちゃが言ってた
      (cf. 実装 [grepcode.com])

        • by Anonymous Coward

          > put( 8,"KEYCODE_1");

          "KEYCODE_1"のIDが本当に8でよいのかどのようにコードレビューしますか?

          • > "KEYCODE_1"のIDが本当に8でよいのかどのようにコードレビューしますか?
            ・ω・ 。o ( ドキュメントを見るんだ! )

            KeyEvent | Android Developers [android.com]

            public static final int KEYCODE_1
            Added in API level 1
            Key code constant: '1'
            key.Constant Value: 8 (0x00000008)

            親コメント
          • by Anonymous Coward

            http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.a... [grepcode.com]

            put( KeyEvent.KEYCODE_1,"KEYCODE_1");
            の方が良さそう

            • by Anonymous Coward

              でも、結局ずらずら書くのは一緒で、元のソースに比べて良いかと言われると微妙では

              • by Anonymous Coward

                結局のところこの話の問題点は以下の2点に集約出来る。
                1. メンバ変数(定数)の値とメンバ変数名の対応を全て列挙する作業が手作業であるという問題。
                2. 検索が線形検索になっていることによる検索コストがO(N)という問題。

                #2651418 [developers.srad.jp]について見てみると、
                1. は AWK スクリプトで自動生成しているのでクリア出来ている。ただし、実行環境の定数がコンパイル時と変わってしまっていた場合に不具合を生じる。せめて

              • by Anonymous Coward
                O(N)なのは何か問題あるの?キーコードなんてこの先増えることないんだから、O(N^2)だろうがO(N!)だろうが今の実装で仕様で要求される時間内に処理終わればいいだろ。逆にいかにO(1)でも実時間のキー判定に数秒もかかってたら意味ないわけで。
              • by Anonymous Coward

                あんまり核心付くとマイナス付けられますよ。
                Javaの世界では、コードやデータ生成のマクロ、なんて書いた日にはマイナスなんですから。

                #トピ主のリアルを観察したほうが楽しそうです。

              • by Anonymous Coward

                ベンチマークなしに闇雲に計算量のオーダーだけ減らしても意味ないと言う主張なら賛同だが、== の比較による単純な代入をするために if else 文が数ページの長さ続くのはちょっとおかしい。こういう場合は普通 Key-Value の対応にして、適切にコンテナを選ぶことで、実行速度を最適化するのが定石。

                ぶっちゃけ、開発時の動作確認のためだけに使うので、最小の労力で必要な出力が得られれば十分とか、正当な理由がついていて、CDやwebからコピーしろと指示があれば、目くじらを立てるコードじゃないけど、入門書で数ページも割くのは、ページの無駄使いと言われても仕方ない。

    • by Anonymous Coward

      自分のコードなら、別途辞書を作って1行で済ますの一択。
      ただ初心者向けのサンプルコードだったらどうかなぁ。

    • by Anonymous Coward

      よし。俺に任せろ。ここはswitchで..。

      case KeyEvent.KEYCODE_1:
              ret = "KEYCODE_1";
              break;
      case KeyEvent.KEYCODE_2:
              ret = "KEYCODE_2";
              break;
      ...

      隊長、大変です。4ページより長くなってしまいました。

    • by Anonymous Coward

      テーブルを使うといいのでしょうか?

      String[][] KeyEventTable = {{KeyEvent.KEYCODE_1, "KEYCODE_1"}, {KeyEvent.KEYCODE_2, "KEYCODE_"}, …};
      for (int i = 0 ;; i++) if (keyCode == KeyEventTable[i][0]) ret=KeyEventTable[i][1];

      2行で書けた ^^/

      • > 2行で書けた ^^/

        だが待って欲しい。
        それを2行と言うなら、原典は1つのif文だから1行ではないだろうか。

        keyCodeがsignedで負値だった場合への対応とか、想定外の値をとった場合の対応が必要そう。

        8bitの時は全パターン網羅しておくのも大した手間じゃなかったが、
        16bit以上で網羅は・・やったことはあるんだけどw

        親コメント
        • by Anonymous Coward

          色々突っ込みが入ったので直してみました。

          // keyCodeはintでKeyEventで定義される値以外が入ってはいけない。違反したときの戻り値は不定
          String[][] KeyEventTable = {{Integer.toString(KeyEvent.KEYCODE_1), "KEYCODE_1"}, {Integer.toString(KeyEvent.KEYCODE_2), "KEYCODE_2"}};
          for (int i = 0 ; i KeyEventTable.length ; i++) if (keyCode == Integer.parseInt(KeyEventTable[i][0])) ret=KeyEventTable[i][1];

          仕様を定義すればいいのですよね。
          1行増えてしまった(;_;)

          • あちこちで、「switch使え」とか「リフレクションって言ってるやつはわかってない」って言ってるのは、「線形探索するな」って意味だと思いますよ。せっかくソート済みのテーブルがあるなら、二分木探索しないと。

            親コメント
            • by Anonymous Coward

              なるほど。

              TreeMapとか

              if (keyCode 32767)
                      if (keyCode 16383)
                            if (…
              とかやればいいんですね。

          • by Anonymous Coward

            この例題だと、単に"KEYCODE_1"を返してるだけですが、教科書ということを踏まえれば
            あとあとには押されたキーに応じた処理をそこに埋め込むようになるのではないかと予想します。

            それならば、この単純な配列での実装は如何なものかと思うのです・・・・。

      • Eclipse: 129個のエラーがあります。

        --
        svn-init() {
          svnadmin create .svnrepo
          svn checkout file://$PWD/.svnrepo .
        }
        親コメント
      • by Anonymous Coward

        懲戒解雇通知書

        貴殿が2014年08月05日 11時33分に提示したプログラムは、当社就業規則第35条
        (当社品質基準に達しないプログラムの作成の禁止)に該当する違反行為であるとともに、
        あまつさえ「2行で書けた ^^/」などと、その行為を誇る様な言辞を弄する事は、
        当社就業規則第36条(違反行為の誇示及び正当化の禁止)に該当する違反行為であります。
        従いまして、当社就業規則第63462条の規則に基づき、2014年08月05日 12時04分付をもって、
        貴殿を懲戒解雇することとし、ここに通知いたします。

                       株式会社 まともなソフト屋
                       代表取締役 真朋祖太屋

        #2651220AC殿

        • by Anonymous Coward

          解雇ですか?
          ちゃんと直したのでお許しお。

      • by Anonymous Coward

        三項演算子を使えば1行だよ。

        ret = keyCode == KeyEvent.KEYCODE_1 ? "KEYCODE_1" : keyCode == KeyEvent.KEYCODE_2 ? "KEYCODE_2" : ...;

        分かりやすく書くと、下のようになるけど、自動生成するのが当たり前だから、1行で問題ないでしょ?

        ret = keyCode == KeyEvent.KEYCODE_1 ? "KEYCODE_1" :
              keyCode == KeyEvent.KEYCODE_2 ? "KEYCODE_2" :
              ...;

    • by Anonymous Coward

      定数同士の置き換えだから普通にマップで書く
      そもそも置き換え必要ないような。

    • by Anonymous Coward

      ret = KeyEvent.keyCodeToString(keyCode);

    • by Anonymous Coward

      恐らくページ数を楽して稼ぎたい、という意図だと思われるので、
      }else if ( key_code == KeyEvent.KEY_CODE1 ){
          ret = "KEY_CODE_1";
      }else if ( key_code == KeyEvent.KEY_CODE2 ){
          ret = "KEY_CODE_2";

      }
      else if ( key_code == KeyEvent.KEY_CODE1 ){
          ret = "KEY_CODE_1";
      }
      else if ( key_code == KeyEvent.KEY_CODE2 ){
          ret = "KEY_CODE_2";

      }
      else if ( key_code == KeyEvent.KEY_CODE1 )
      {
          ret = "KEY_CODE_1";
      }
      else if ( key_code == KeyEvent.KEY_CODE2 )
      {
          ret =

    • by Anonymous Coward
    • by Anonymous Coward

      こんなもんかと。
      https://twitter.com/vjroba/status/495245672975564800 [twitter.com]
      https://twitter.com/vjroba/status/495246734474215425 [twitter.com]

      定数の判定は変数名で判別すればもう4行削れます。
      初心者向けの本でリフレクション使うのが正しいとは思いませんが、
      そもそもリフレクション使わないとまともなコードにならないような課題を
      選んだことが間違ってると思います。

一つのことを行い、またそれをうまくやるプログラムを書け -- Malcolm Douglas McIlroy

処理中...