2009/11/25

Procedural Programming

Object-oriented programmming(以下OOP)においてIndirectionは重要な要素になっている。

最大の特徴はコードを呼び出すという事だ。

そこで、説明のために用いていたサンプルコード「03.08 Shapes-Procedural」の解説に入ろうと思う。



まず始めに 、プログラム内部で使う構造体をenum型の列挙で宣言する。
kCircle, kRectangle, kOblateSpheroidの3つはShapeTypeという要素、kRedColor, kGreenColor, kBlueColorの3つはShapeColorという要素に含まれる。また、このプログラムでは使わないが、kCircleには0、kOblateSperoidには1といった番号が構造体に含まれる順番にバックグラウンドでは割り振られている。

次に、ShapeRectという構造体にはint型のX, Y, width, heightが含まれる。
このShapeRectや最後のShapeという構造体を宣言する時にenum型にしなかったのは、ShapeType型のtypeという変数のように、その内部で属性を持つ変数を定義するためである。


コードの手順とは異なるが、次はmain関数内の説明。


初めに、 Shape型のshapesという変数を3つ用意する。
ShapeRect型のrect0という変数に対して4つの値を代入する。これは先ほど宣言したint型のX, Y, width, heightに代入される事になる。
Shape[0].type = kRectangleとなっているように、構造体型の変数に対して"."をつけることでその構造体の中身を参照する事ができる。この場合はShape[0].typeということでShapeType型のtypeを参照しており、enum型のShapeTypeの中からkRectangleを参照している。




同様の処理をして行くと、main関数の中からdrawShapesというメソッドに飛ぶ。
ここの2つの引数shapesと3はShape型の変数shapes[]とint型の変数countに代入される。
drawShapesでは選択されたshapes[i].typeの値によって定義されている図形3つ分の処理を行う。


 
shapes[i].type = kCircleだった場合はdrawCircleというメソッドで宣言されているShapeRect型の変数boundsにshapes[i].bounds(=0, 0, 10, 30)が、ShapeColor型の変数fillColorにshapes[i].fillcolor(=kRedcolor)が与えられる。
同様の処理をdrawRectangleとdrawOblateSperoidにも行う。
すると、各メソッドでは以下のようなコードを実行してコンソールに実行結果を表示するのだが、ここでさらにcolorNameというメソッドが呼び出されている。



ここでは用意されているShapeColor型のShapeColorに対してfillColorという値を与えている。ここで与えられたfillColorの値がkRedColorなら@"red"を返すというように、fillColorの名用によってその色の名前をNSString型として返す。
すると、コンソールにはこのような表示がされる。





このように、メソッドの中から違うメソッドを呼び出すと行った繰り返しをすることで コードを細分化し、各処理の内容を分かりやすく表記している。
それがIndirectionがもたらす最大の副産物ではないかと思う。

0 件のコメント:

コメントを投稿