甲府方重信Blog

...Shigenobu Koufugatas Blog

  • Increase font size
  • Default font size
  • Decrease font size
Error
  • Unable to load Cache Storage: database
  • Unable to load Cache Storage: database
  • Unable to load Cache Storage: database
  • Unable to load Cache Storage: database
  • Unable to load Cache Storage: database
  • Unable to load Cache Storage: database
  • Unable to load Cache Storage: database
  • Unable to load Cache Storage: database
Home 業務日誌 Adaプログラミング Adaチュートリアル セクション18.1 - サンプルプログラムSmall(導入)

Adaチュートリアル セクション18.1 - サンプルプログラムSmall(導入)

E-mail Print PDF

セクション 18.1 - サンプルプログラムSmall(導入)

さて、私たちはAda 95プログラミング言語の様々な部分を見てきました。数行以上のプログラムを作成する時が来たようです。このプログラムは、Adaの多くの異なった機能を一度に使用します。そこで、プログラマーはそれらがお互いにどのように働くかを見ることが出来るわけです。私は、すべての決定のすべての詳細についてお話することは出来ません。しかし、そのハイライト部分を通じて、出来るだけ説明していこうと思います。

私たちが作るプログラムは、小さなテキストベースのアドベンチャーゲームです。このプログラムは、小さな世界をシミュレートします。ユーザーには現在の状況が提示されます。ユーザーは、そこでなにかを起こすためにコマンドをタイプすることができます。(「look」とか、「get key」などです) 最初に、私たちは「look」と「quit」コマンドを実装しましょう。その次に、私たちは「get object」と「drop object」コマンドを追加します。そして、その次に、「go direction(northとか、southとか)」コマンドを追加します。私たちは、そのほかのコマンド(「open」のような)を容易に追加できるよう、フレキシブルでありたいと望んでいます。そして、異なった操作は異なった事象を起こすのです。(例えば、あなたはいくつかのオブジェクトを入手できるけれども、そのほかは出来ないといったように)。

これらのシンプルなリクエストが与えられたら、基本的なプログラムのデザインはどのようにあるべきでしょうか。まず、論理的なグルーピングにブレークダウンしてみましょう。アドベンチャー・ゲームは、異なったもの、異なってはいるが関連したもの、異なっているが関連した型、同じコマンドが与えられたときに恐らく異なったアクションをする操作などを含んでいます。この種類の問題に、オブジェクト指向アプローチは適しているように聞こえます。そこで、私たちは、異なったオブジェクト型定義の集合を持ちます。私たちは、いっぺんにこれらを定義する方法を明らかにしていきますが、まずは、これらの異なったものの「root」型を定義する必要があるでしょう。そして、それらは、恐らく、多くの操作を共有することになるはずです。しばらくの間、私たちは「Things」と呼ばれるパッケージを定義すると仮定し、Thingと呼ばれるタグ付き型rootを定義します。:

 package Things is
type Thing is tagged ...; -- We'll figure this out later.
type Thing_Access is access all Thing'Class; -- Usual OO definition.
-- Operations to be determined ...
end Things;

私たちは、また、テキスト行と取り、それを実行しようとする必要があります。私たちは、そのほかの理由に対しても機能を必要とするかもしれません。 (例えば、オブジェクトは複数のテキスト行を取り実行することができるかもしれません。あるいは、モンスターがコマンドを受け付けるかもしれません)。そこで、一つのパッケージThingsの内部で協調して動作するというよりも、分離したパッケージに機能を分離していきましょう。そこで、「Parser」と呼ばれるパッケージと、「Execute」と呼ばれる、その内部でのプロシージャーを作成します。Executeは、引数を一つ取り(一行のテキスト)、行を解析し、それを実行します。:

 package Parser is
procedure Execute(Command : in Unbounded_String);
end Parser;

最後に、私たちは、この全体のプログラムを起動する必要があります。そこで、私たちは全体を起動するメイン・プロシージャーを作成しましょう。一般的に、メイン・プロシージャーは、smallに関連していると良いです。; この場合は、メイン・プロシージャーは、単純なループを実行します。 - 入力に対して待ち、そして入力をコマンドを実行するためにExecuteに送ります。メイン・プロシージャーは、「Small」と呼ぶことにしましょう。(これがプログラムに相当します)。というには、これが小さなテキスト・アドベンチャー・ゲームだからです。:

 procedure Small is
begin
-- Repetitively get a command, then send it to Parser.Execute.
end Small;

私たちは既に、もうひとつの「Ustrings」と呼ばれるパッケージ、これは、テキストラインからUnbounded_Stringヘの変換のルーチンを提供します。; これは、プロシージャーSmallを実装するのに対して役に立つでしょう。

しかし、ちょっと待ってください。メイン・プロシージャーは、「quit」が入力されたときにどのように知ればよいのでしょうか。プレイヤーがゲームを停止するほかの理由がある場合もあります。(例えば、プレイヤーが「殺された」場合など) おそらくExecuteは、論理値を返すべきでしょう。これは、コマンドが受け付けられたかどうかを伝えるものです。そこで、私たちはExecuteに戻って、変更を加えます。:

  procedure Execute(Command : in Unbounded_String; Quit : out Boolean);

この特定の変更は、多くの変更の一例に過ぎません。 - 私は実際、この例を何回か、設計をしたときに、再構築しました。これは、一般的なことです。プログラマーは、システムを分解していくべきです。そして、注意深くコンポーネント間のインターフェースにおいて、漏れを直すべく設計を見直すべきです。プログラマーは、一般的な構造を持つように努力すべきです。というのも、プログラマーは複数回の変更によって、予測しやすくすることが出来、取り扱いも容易になるのです。

私たちは、主要なデザイン・コンポーネントについてのみ気をつけていればよいのであって、それらのインターフェースがそのジョブに対して十分であることを確かにしなければならないことに注意してください。Adaにおいては、このことはプログラマーが一般的に、パッケージ宣言(仕様)を最初に定義することを意味しています。そして、プログラマーが(基本的に)パッケージ宣言が正しいと考えたならば、プログラマーはパッケージ本体を実装していきます。プログラマーは、私がまたいかなる本体部も書いていないことに気づくでしょう。 - なぜわざwざ、私はまだプログラムの基本的構造の作業をしているのでしょうか。 プログラマーは、仕様部が正しければ、本体部を実装するのが容易であることが分かります。

出典: http://www.adahome.com/Tutorials/Lovelace/s18s1.htm

Last Updated on Tuesday, 01 January 2013 06:30  

ニュース速報

リナックスアカデミーでのLinuxセキュリティの4回目。

内容は、

1、CentOS 4.8のネットワークインストール

2、サーバーの構築。ただし、セキュリティに考慮したものにする。

手順が簡略化されているので、とまどっている様子。

PCによっては、CD-ROMが認識されないものがある。