何故突っ走ってプログラムを書くと上手く行かないのか?
春休みに入ってからプログラミング関係のサイトを巡ってみたりしてます。授業のある期間は遊んじゃってばかりだったので、時間のある今こそ勉強しなくては…って感じです。
そんな中で見つけたのが「アルゴリズム+データ構造=プログラム」? 本当に?という記事です。つい最近授業で「データ構造とアルゴリズム」についてやったり、プログラミング言語論でこの話題を扱ったりしたので、是非他の人にも読んで欲しいと思ったので取り上げてみました。
このエントリーのタイトルである「何故突っ走ってプログラムを書くと上手く行かないのか?」と言う問題ですが、まさにその答えがここにあると思います。必要なデータ構造も決まってるし、これで動く筈というアルゴリズムも分かってるのに、いざ組んでみると上手く形に出来ないと言う事があると思うのですが(少なくとも僕はプログラミング経験の浅い頃に良くやってました…)、問題は何かと言えば「インターフェースがないから」であると思うのです。
むやみにプログラムを組み始める前にちょっと待ってみて下さい。そのプログラム、インターフェースも設計出来てますか?
コメント
インターフェース、重要ですね。授業中は全然そんなこと考えもしませんでしたけど。『データ構造+アルゴリズム』と、そのセット同士をとりもつ『インターフェース』ってところでしょうか。しかしまたタイムリーな話題ですねw
投稿者: DSLer | 2006年02月06日 01:49
こんにちは
>「インターフェースがないから」
それは有り得ないと思います
例えば A/B=Cの式を例に
データ構造は、入力A,B
アルゴリズムは、A/B=C
インターフェイスは
入力値 A,B
出力値 C
インターフェイスに付いて見れば
A,B,Cの属性(整数?、実数?、有効桁数?)
0割はどうする?
オーバーフォローは?
外部に公開されるのはインターフェイスです
しかし、それらは多分にアルゴリズムとデータ構造の基本設計に依存します
動かないのは、プログラムが間違っているんです
と、おじさんは思います
投稿者: しんのすけ | 2006年02月07日 16:25
しんのすけさん こんにちは。
学生のつぶやきにコメントがいただけるとは思ってなかったので、驚くと共に大変嬉しく思います。
突っ走ってプログラムを書いた時には、1関数・1クラス単位では大抵上手く動きます。問題はそれらを繋げてプログラムとして動かそうとした時に、後から追加で出力が必要になったりしてインターフェースがごちゃごちゃになり、最終的に破綻するという経験が多かったのでこの記事を書きました。
それは確かにアルゴリズムやデータ構造が間違っていた、という見方も出来ると思います。しかし、プログラムで主となる部分同士を繋ぐ部分のアルゴリズムやデータ構造はインターフェースと呼んで区別した方が、プログラム制作の指針となって良いのではないでしょうか?
投稿者: ねげ[管理人] | 2006年02月07日 17:32
度々すみません
ここで1点
>アルゴリズムやデータ構造はインターフェースと呼んで区別
とありますが
モジュールは、機能を提供します
モジュールを利用する為に第三者に必要なのが、インターフェイスです
基本的に、アルゴリズムとデータ構造は、モジュール内に隠蔽されるべきです
つまり、モジュールはブラックボックスである事が前提です(API関数などまさにそのものです。機能説明とインターフェイスしか見えません)
インターフェイスにおいて必要な条件は、その機能を利用する為に必要なアトリビュートや引数が適切に用意されているかです(これが一番厄介です)
モジュールに実装されて一度公開されたインターフェイスは絶対に変えてはいけません(インターフェイス不変の法則)それが設計のルールです
動いているものを変える(壊す)から動かなくなる(これを改修でなく、改悪と呼びます)
あとは、プログラムをボトムアップで作っていくと言われているような問題に多々直面します
トップダウンで概要を良く練ってから、機能の設計をして、細部の条件を詰めていくとコーディングの前に余計な物が排除されて見通しの良いインターフェイスが出来ると思います
と、おじさんは思います
投稿者: しんのすけ | 2006年02月07日 18:02
大変為になるお話をありがとうございます。
僕の挙げたような例では単純にプログラミングの基本が出来ていなかったと言う事ですね…。それにインターフェースという物の定義も間違っていたようで…勉強不足ですね。頑張ります。
話は少し変わるのですが、モジュールを結合した物をプログラムと呼ぶならば、
・アルゴリズム+データ構造=プログラム
・プログラム+インターフェース=モジュール
・モジュール+モジュール+…=プログラム?
とか考えてる内に訳が分からなくなってきてしまいました…。
投稿者: ねげ[管理人] | 2006年02月07日 20:22
こんにちは
モジュールは、部品です
モジュールAとモジュールBを組み合わせた物=>モジュールCは、部品です
とするならば
アルゴリズムAとアルゴリズムBを組み合わせて計算する=>アルゴリズムC
も同じになります
>アルゴリズム+データ構造=プログラムとは
データ構造=問題の状況など詳細なデータ =>何を
アルゴリズム=問題解決の手法 =>どうしたら
プログラム=問題解決の道具 =>問題は解決する
この式のような文章を、数学のような公式で解釈しようとしても
無理だと思います。伝えたいのは問題解決への発想の転換じゃないでしょうか?
インターフェイス、コンセントに例えればプラグの形状や電圧の規格です
これが合わなければ使い物になりません
誰でもどこでも使えることが求められます
つまり、インターフェイスには汎用性と標準化が求められます
これはチームで開発を行なう場合とても重要なキーワードです
また、インターフェイスには曖昧さは許されません
「そんな変な値を渡す方が悪い、渡す方がバクってるからだよ」なんてのは許されません
要求される機能(モジュール)と、使いやすさ(インターフェイス)の内側に
解決すべき問題の構造(データ構造) と、その手法(アルゴリズム)が隠れています
と、おじさんは思います
投稿者: しんのすけ | 2006年02月16日 15:28
しんのすけさん こんにちは。
何度も丁寧に説明して頂いて本当にありがとうございます。
とても分かりやすい説明で頭の中がすっきりしました。後は実際に考え方を身につける為に、これからプログラムを組む時に意識してみようと思います。
投稿者: ねげ[管理人] | 2006年02月16日 17:03