ロボットを動かす意図をプログラマーの頭からプログラムへ移す

ロボットを動かす意図をプログラマーの頭からプログラムへ移す

 では、どうしたら「(A)ロボットがラインの上にいないときは左に曲がり、ラインの上にいるときは右に曲がる」という意図をプログラムにも含めることができるでしょうか。コメントを書くという方法も、コードの意図がわかりやすくなるので良いでしょう。しかし、これではプログラムの全域において、

  //左に曲がる
  ecrobot_set_motor_speed(NXT_PORT_B, 50);
  ecrobot_set_motor_speed(NXT_PORT_C, 0);

というコードを書くことを意味します。これで良いでしょうか?ここでもう少し工夫してみましょう。できればコメントではなく、「左に曲がる」と語りかけるコードが良いでしょう。例えば、次のように書いてみます。

  turn_left();

 いかがですか?このコードなら、関数の名前そのものが(A)の情報を持っていますし、コメントと違って修正の影響はコンパイラがチェックしてくれるので、動いているロボットをうまく左に向けてくれると思います。

 turn_left関数の処理は次のようになります。実行効率を気にするのであれば、これをマクロで実現するという方法もあるでしょう。

void turn_left(void) {
 ecrobot_set_motor_speed(NXT_PORT_B, 50);
 ecrobot_set_motor_speed(NXT_PORT_C, 0);
}

プログラムの意図がコードだけで伝わるように工夫する

 同様にして、光センサーの値を判断している次のコードを見てみましょう。

 if(ecrobot_get_light_sensor(NXT_PORT_S3)
  < THRESHOLD){ ...

 字面どおり読めば「(B)3番ポートのライトセンサーの値がしきい値より小さいときは明るいときで、Bポートのモーターを出力50で正回転させ、Cポートのモーターは停止する。しきい値以上のときは暗いときで、Bポートのモーターは停止し、Cポートのモーターを出力50で正回転させる。」となります。

 しかし、このときロボットは、黒いラインの上なのかそうでないかを判定しているのですから、次のように書き換えてみたらどうでしょう。「!」は否定演算子です。「ラインの上にいるのでなければ……」と読んでみてください。

 if( ! isOnline() ){ ...

 このisOnline関数の処理は次のようになるでしょう。FALSE(0)とTRUE(1)は、nxtJSPが提供するtoppers_jsp/include/itron.hに定義してあります。

int isOnline(void) {
 if(ecrobot_get_light_sensor(NXT_PORT_S3)
  < THRESHOLD){
  return FALSE;
 }
 return TRUE;
}

 このような工夫をした結果、最初に示したライントレースのコードは、次のようなコードに変わるでしょう。わざとコメントを書かずにおきました。

 if( ! isOnline() ){
  turn_left();
 }else{
  turn_right();
 }

 「何だ、関数に分けただけじゃないか。」と思われるかも知れません。いえいえ、このコードにはそれ以上の価値があります。それは、「(A)ロボットがライン上にいないときは左に曲がり、ライン上にいるときは右に曲がる」という意図が、コードとして表現できているからです。

 コメントがなくても、コードだけで意図が伝わってきます。ほかの人にもコードだけで意図が伝わるのです。なぜでしょうか。それは、関数名に(A)を、関数の中身に(B)を書くことで「私たちの頭の中」に構築してあった(A)と(B)の関係を、「プログラムが表現する知識」として見えるようにしたからなのです。

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored

ClickHouse Cloudが実現した広告運用SaaS「ATOM」のデータ基盤革新、パフォーマンスを向上しながら、運用負荷とコストを削減 11月11日 6:20 AIで開発が加速する時代、品質保証はどう変わる? Tricentisが示すAIエージェント活用の実像 11月9日 6:45 悪用までの猶予が「1分」に迫るフロンティアAI時代に開発と本番を貫く脆弱性管理が必要 10月29日 8:30 欧州CRA対応とSBOM運用。AI生成コードのOSS混入問題の対策とは ――スニペット単位で検出する「FossID」「Insignary Clarity」によるSBOM運用 9月16日 6:40 PostgreSQLからTiDBへ、稼働中SaaSで進める段階的DB移行の実践と再設計への展望 9月7日 6:30 機能安全開発におけるGoogleTestの活用を支援!「Parasoft C/C++test CT」で実現する効率化&AI連携 4月14日 6:30 【CNDW2025】Grafanaが明かす「オブザーバビリティの哲学」ー最小限の労力で実用的なインサイトを得るには 1月23日 6:30 【CNDW2025】プロダクト急増に備える基盤刷新 ーウェルスナビがECSからEKSへの移行で得た知見とは 1月15日 6:30 【CNDW2025】250環境を5人で運用、構築時間は30分に ーKINTOテクノロジーズが語るインフラ基盤組織の作り方 2025年12月18日 6:30 新たな自動化で熱視線! AIエージェントの「推論能力」を支える2つのコンポーネントとは? 2025年11月28日 6:30