ソースコード読み会

 先日大学の方でソースコード読み会が行われました。この読み会は大学のオープンキャンパスで展示した展示物のコードを読み合うという会です。いろいろと自分のダメなところを発見できたいい読み会でした。

 具体的にどこがダメだったかというと、コードの書き方。人に読ませる気が全くないコードという評価を受けました。ではどんなコードなのか晒します。

  GameObject bullet = (GameObject)Instantiate(bulletPrefab,transform.position,transform.rotation);
  bulletVelocity = new Vector3(0, 0, fireBulletVelocity);
  bullet.transform.rigidbody.AddForce(bulletVelocity, ForceMode.VelocityChange);

  GameObject bullet = (GameObject)Instantiate(bulletPrefab,transform.position,transform.rotation);
  bulletVelocity = new Vector3(40, 0, fireBulletVelocity - 40);
  bullet.transform.rigidbody.AddForce(bulletVelocity, ForceMode.VelocityChange);

  GameObject bullet = (GameObject)Instantiate(bulletPrefab,transform.position,transform.rotation);
  bulletVelocity = new Vector3(-40, 0, fireBulletVelocity + 40);
  bullet.transform.rigidbody.AddForce(bulletVelocity, ForceMode.VelocityChange);

 ...はい。もう見ただけで気持ち悪いですね。長ったらしい同じようなコードが並んでます。いわゆる『コピペコード』というやつですね。准教授からは「これってプログラムって言えるの?」と言われちゃいました...。でこれを先輩の指導のもと手直ししたのがこちら

  ArrayList bulletAngles = new ArrayList();

  bulletAngles.Add(0);
  bulletAngles.Add(40);
  bulletAngles.Add(-40);

  foreach( int angle in bulletAngles ){
    fireBulletFunc(angle);
  }
・
・//中略
・
  public void fireBulletFunc(int firerotate){
    GameObject bullet = (GameObject)Instantiate(bulletPrefab, transform.position, transform.rotation);
    bulletVelocity = new Vector3(firerotate, 0, fireBulletVelocity - firerotate);
    bullet.transform.rigidbody.AddForce(bulletVelocity, ForceMode.VelocityChange);
  }

 さっきより断然見やすくなりましたね。まとめられる部分は関数化や抽象化を行って、同じコードは書かないようにと指導を受けました。こっちの方が後修正するときも書きやすいですし、関数の役割をコメントで説明してやれば他の人もコードを改善しやすいですね。といった具合に様々なダメ出しを受けたいいコード読み会でした。

 ...本当は読み会当日に記事を書こうと思っていたのですが、想像以上に自分のダメさに落ち込んでしまったようで。読み会の次の日にこの記事を書いています。でも自分のダメを早期に発見してそれを改善していくことが大切だと思いますのでこれからもどしどしダメだし募集中です。精進していきます。