2024年10月
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    
無料ブログはココログ

 

« 今日届いたもの | トップページ | 普通にうまくのはヤバイ! »

2009年10月 5日 (月)

C言語の#defineでマクロを定義するにも限度があるさ

また、極論ですよー。

たぶん一番初めのマクロはアセンブリ言語で定数、文字列に名前を付けた物(マジックナンバーを抽象化したもの)だと思われる。
C言語の#defineで定義されたマクロでは、定数や文字列以外にも関数形式マクロもある。
簡単に言うとマクロは抽象化を行うものである。(具体的な数値、文字、処理を隠ぺいして、特定の名称で表す)

定数、文字列の展開を想定したマクロは、マジックナンバーの抽象化ということで許せる。もちろん分かりやすい名前にすることが必要だし、マクロであることを分かるようにする必要もある(全て大文字英数字を使うとか)。
だが、関数形式マクロで凝ったものを作られると途端に訳が分からなくなる。
処理の抽象化ということになるのだろうけれど、ただ文字列として展開されるだけなので、正直アウトローな存在になってしまう。どこの責任で持つ処理なのかが言語仕様では設定できない。どこからでも呼べる抽象的な隠ぺいされた処理・・・。ちょっとした計算なら意味があるだろうが、処理というほど大きくなった無節操なものをコントロールできるのだろうか?
オブジェクト指向言語では、どこでその抽象的な処理を持つかハッキリしなくてはならないので、使用者に限定的で分かりやすい処理を伝えられる。つまりマクロ関数はオブジェクト指向では使うべきではない。

また、オブジェクト指向言語では、戻り値や引数に定数を使うときも、#defineによるマクロを使うべきではない。なぜなら、戻り値だろうが定数だろうが、それを使うべきクラスが有るわけで、そのクラスで管理する責任があるからだ。つまり、使うべきクラスで定数(クラスで持つenumなりstaticでconstな変数)を宣言すればよい。クラスにまたがって共通の定数を使いたいなら、定数用のクラスに切りだせば良いのだ。
クラスが多くなるっていやだという方は、そこら辺は設計で頑張ってくださいってことになるんだけれど・・・。

マクロにしかできない技巧的に凝った物が有るじゃないかという話も出てくるかもしれないけれど、ステップ数が少なくなったとしても誰も理解できないマクロを作ったら保守できないジャンと言ってしまえばお終い。
要は、分かりやすくするためにあるマクロを、技巧的に凝って分かりにくいものを作ったら本末転倒だろってことさ。
世の中、天才ばかりじゃない。馬鹿ばかりと思って分かりやすく作った方がナンボもマシ。時が流れると忘れ去られてどう作ったかわからなくなるもんだ。プログラムを作る時は忘れることも考慮して作らんとアカンよ。(そこら辺を分かっていない人が多い)

« 今日届いたもの | トップページ | 普通にうまくのはヤバイ! »

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: C言語の#defineでマクロを定義するにも限度があるさ:

« 今日届いたもの | トップページ | 普通にうまくのはヤバイ! »