本シリーズは、プログラミングの複雑さと戦う人のためのコラム集です。
今でも現役で使われ続けているC言語やC++のTIPSを中心に、開発現場でチームワークを発揮するために役立つ考え方や心構えなどを紹介していきます。
記事の一覧を見るプロローグ〜プログラミングは複雑さとの戦い!
はぁ〜、難しい……
ん?どうしたのレオくん、何か分からないところでもあった?
あ、ユキ先輩!いや、別にそういうわけじゃないんです。(うわ、独り言聞かれちゃった恥ずかしい)
なんだか悩んでるみたいだったけど。
あ、はい。プログラミングって、すごく複雑な作業だよなって思ってただけです。
たしかにプログラミングはとても複雑な作業よね。「良いプログラミングとは何か」を定義することも難しいからね。
そうなんですよ!ほかの人が書いたプログラムだと、理解するのに結構時間がかかってしまって。それでなんとなくモヤモヤしてたんです。
プログラムを考えるのって、すごく個人的で精神的な側面のある活動だからね。規模の大きなプログラムほど多くの人が関わるし、開発が進むにつれて複雑さも増していく傾向があるから、戸惑うこともあるわよね。
はい。チームプレイが求められているのは分かるんですが、なんだか最近限界を感じていて。
なるほどね。チームワークを発揮するためには、プログラミングの複雑さと戦う必要があるのよ。
え?戦うって、一体どうすればいいんですかね?
そうね。経験を積んだソフトウェアエンジニアがどうやって複雑さを回避しているのか、観察してみるのがいいんじゃないかしら。
はぁ。(なんだかピンとこないな)
一つ例を挙げてみるわね。
関数名による抽象化
プログラミングをするときは、サブルーチン(または関数)を作る機会が多くあります。
サブルーチンを作る第1の目的は、同じような処理を1カ所にまとめることです。でも、それだけではありません。
もうひとつの重要な目的は「抽象化」です。
次のC++によるコードを、ざっと眺めてみてください。
#include <stdio.h>
#include <stdlib.h>
static bool IsSameString( const char *pcLHS, const char *pcRHS )
{
// 省略
}
int main()
{
if ( IsSameString( "abc", "def" ) ) {
puts( "Yes!" );
}
else {
puts( "No!" );
}
return EXIT_SUCCESS;
}
IsSameString()
というのがサブルーチン(関数)になっています。2つの文字列を比較して同じかどうかを判定し、同じならtrue
を返すというものです。
ちなみに、C言語には
strcmp()
という関数があるので、現実では上の例のようなサブルーチンを書く必要はありません。
ここで注目すべき点は、サブルーチンに、機能を的確に表す名前を付けているということよ。
「A is the same string as B.」ってことですね。
そう!サブルーチンに「その機能を表す名前」を付けて、「抽象化」しているというわけ。
これにより、呼び出し側(ここではmain()
関数)ではサブルーチンの実装が具体的にどうなっているのか気にすることなく、サブルーチンの名前からその機能を理解できます。
関数名による抽象化の仕組みを理解しているのと理解していないのとでは、どちらのほうが複雑さを軽減できる可能性があるでしょう?答えは明らかですね。
例えば、関数にf()
やfunc()
のような、まったく意味のない名前を付けた場合を想像してみてください。抽象化の仕組みを理解していないと的外れな設計をしてしまい、気付かぬうちに複雑さの餌食になってしまう恐れがあるのです。
ここがポイント!
名前による「抽象化」は、サブルーチンの重要な目的の一つ。抽象化でプログラミングの複雑さを軽減しよう!
大切なのは、プログラムが複雑になっていく前兆を素早くキャッチして、手後れにならないうちに何とかできる力を身に付けていくことよ。
抽象化のテクニックも、その一つというわけです。
そっか。今までもなんとなくそれっぽい名前は付けてたけど、「抽象化」をちゃんと意識していなかったかもしれないな。
プログラミングはとても奥深いものです。まずはその深みに身を投じてみて、先人たちの知恵を借りながら複雑さと戦う術を身に付けていきましょう。このシリーズでは、そのために役立つ考え方や心構えなどを紹介していきます。