UMLモデルをどうやってC言語に落とし込むか

http://www.atmarkit.co.jp/fembedded/robocon/etrobo06/road03/road03a.html

デスマーチの作り方.

C言語は手続き指向のプログラミング言語であり、オブジェクト指向プログラミング言語ではありません。

その通り.*1

機能分割によりシステムを整理する構造化手法で考えたものをプログラミングするのに適した言語です。基本的にはデータと処理は分けて整理します。

書き方については難ありだけど,概ねその通り.

単に,C言語は良くも悪くもアセンブラに近いレベルで記述することのできる高級言語ってだけなんだけどね.C言語の長所も短所もこれに尽きる.

このためC言語では、クラス、継承、ポリモルフィズムといったオブジェクト指向の概念がプログラミング言語レベルでサポートされていません。従って、UMLモデルをC言語で実装する場合には、(C++言語ではサポートされている)これらの概念を実現する仕組みを明示的に実装する必要があります。

ということまで分かっていながら,なんでUMLに拘るのだろう.

なぜC++などという『欠陥言語』*2が作られたのか,その歴史的経緯を見ればこれがいかに愚かなことか分かりそうなものなのだが.


C言語OOPには不向きで,そのままでは生産性が低下する.そこでOOPにも対応できるように拡張されたC言語としてC++が作られた.ただ当初はOOPに対する理解も不十分だったし,なによりC言語OOPとの親和性がすごく悪い.「C言語互換」というC++の制約がそのままOOPとの親和性の悪さに繋がってしまった.また「必要な機能は全て入れる」という方針をとってきたがために言語仕様が肥大化し,誰にとっても使いにくい巨大言語となってしまった.

そのC++でもOOP言語としては問題があると言われているのに,非OOP言語であるC言語OOPモドキをやることは無謀以外の何物でもない.

ここで「ラインをトレースする」と書いてある5%の部分が,工数の80%を占める最重要部分になる.*3残りの20%のほとんどがUML図から無意味で役立たずな雛形作りに使用される.*4


なおJavaなんかでも,「UMLモデルから言語へ落とし込む」なんてバカな真似はやらないよ.そんなことをすればデスマーチになること受け合い.

加筆:

で、痛烈に思い知ったこと。超メンドクサイ。C++で書くときの3倍くらい書かなきゃいけない。本質のアルゴリズムを書いている部分が、OOPを実現するためのコードに埋もれてる。
http://d.hatena.ne.jp/methane/20060704/1151964303

当たり前のようにフルアセンブラなんですが、メインプログラマが先進的すぎてOOPで組んだためバグがとりきれずバグバグだったそうな……。
http://d.hatena.ne.jp/Isoparametric/20060704#1151998228

*1:普通は「手続き」かな.

*2:C++の『欠陥』は,当時の時代背景を考えるとやむを得ない側面もある.今から見ると欠陥だが,当時は次善の策だったのだ.

*3:こういう「頭でっかち」なクラス設計はOOPの特徴というわけではなく,OOP初心者やUMLモデラーがやる典型的な失敗の一つ.

*4:デバイスドライバやOSなどは既にあるものとする.もし無かった場合はその部分の工数が一番大きくなるだろう.