MODULE-ENDMODULE、CLASS-ENDCLASS

MODULE-ENDMODULE、CLASS-ENDCLASS

モジュール化、クラス化して、スクリプトを意味のあるグループにまとめます
MODULE
  CONST 変数
  PUBLIC 変数
  DIM 変数
  PROCEDURE モジュール名
  PROCEDURE 関数名()
  FUNCTION 関数名()
ENDMODULE
または・・・
CLASS
  CONST 変数
  PUBLIC 変数
  DIM 変数
  PROCEDURE クラス名
  PROCEDURE 関数名()
  FUNCTION 関数名()
ENDCLASS
MODULEもCLASSも同義

・CONST 変数・・・名前.変数名で外部からアクセス可
・PUBLIC 変数・・・名前.変数名で外部からアクセス可
・DIM 変数・・・外部からアクセス不可
・PROCEDURE モジュール名/クラス名・・・コンストラクタ
・PROCEDURE 関数名()
・FUNCTION 関数名()

変数、関数をセットにした1つのグループを定義する際に使用

例えば、HUMANというオブジェクトがあったとします。
このオブジェクトには、NAMEという変えられない定数、
FEELINGという変数、そしてSPEAKという関数や
WALKという関数が備わっているとします。
これらの定数、変数、関数をバラバラに定義することも可能ですが、
HUMANというオブジェクトの中に収め、意味のあるグループで
まとめるたほうがよい場合が多々あります。
※メンテナンスがしやすい
※スクリプトの可読性が高まる
※変更してよい変数、してはいけない変数が明確になり、改修や影響調査がしやすい
などなど
もしオブジェクト指向という情報技術の一分野を学ぶ際には、
こういった考え方を知っておくのは大変役に立つでしょう。
まずは上のHUMANというオブジェクトを組み立ててみましょう。

//まずは喋らせてみる
MSGBOX(HUMAN.SPEAK())

//気分を変えてみる
HUMAN.FEELING = "I feel so bad"

//もう一度喋らせてみる
MSGBOX(HUMAN.SPEAK())

//歩かせて見ます
HUMAN.WALK()
//もう一度歩かせて見ます
HUMAN.WALK()
//もう一度歩かせて見ます
HUMAN.WALK()
//もう一度歩かせて見ます
HUMAN.WALK()

//MODULE-ENDMODULEとしてもよい
CLASS HUMAN
 CONST NAME = "John"
 PUBLIC FEELING = "I'm Happy"
 DIM STEPS
 PROCEDURE HUMAN()
  THIS.STEPS = 10
 FEND 
 FUNCTION SPEAK()
  RESULT = "My name is " + THIS.NAME + " " + THIS.FEELING
 FEND
 PROCEDURE WALK()
  THIS.STEPS = THIS.STEPS + 1
  PRINT THIS.STEPS + "歩目を踏み出しました"
 FEND
ENDCLASS

使い方

たとえば、汎用的な作業を別ファイルに書き出すとします。
UWSCではCALLを使うことで、
外部スクリプトを呼び出せますので、
よくある処理をまとめておけば、再度開発する手間が省けます。
こういう場合に、同じ名前の変数(関数)を使った/作ってしまった、
というケースは割とあります。
また、変数や関数が意味もなく、羅列してあるので収集がつかなくなったり
スクリプトのメンテナンス性が著しく悪くなってしまったりするケースもあります。
こういう場合にMODULEやCLASSを導入することで、
名前の被り(MODULE名やCLASS名が異なれば、内部の変数は被っても大丈夫)
意味のない関数、変数の乱雑さを抑止することができます。
下記のスクリプトは先ほどのスクリプトに一つ一つコメントを入れたものです。
導入する際のメリットになれば幸いです。

この投稿の続きを読む »

タグ

2012年9月15日 | コメントは受け付けていません。 |

カテゴリー:構文・制御文

THREAD

THREAD

THREAD 関数名()

スレッドを生成し、指定した関数を実行する

並列で作業させたい場合に活用

THREADはコンピューターの処理単位の1つだと思ってください。
通常、コンピューターは上から順番に処理をして行きますが、
THREADを実行することにより、その関数は別プロセス(別スレッド)で立ち上がり
独自に処理されていきます。
簡単な例を下に記します。
実行させてみるとわかりますが、
最初のA部とB部は1つ1つ処理されますが、
後半のC部とD部は並行処理されます。

FOR A = 1 TO 5
 SLEEP(1)
 FUKIDASI("A:" + (5 - A),G_MOUSE_X,G_MOUSE_Y,0,20)
NEXT


FOR B = 1 TO 5
 SLEEP(1)
 FUKIDASI("B:" + (5 - B),G_MOUSE_X,G_MOUSE_Y,0,20)
NEXT

MSGBOX("AとBが順番に処理されました。続いてTHREADで実施します。")


THREAD ExecuteC()

FOR D = 1 TO 5
 SLEEP(1)
 FUKIDASI("D:" + (5 - D),G_MOUSE_X,G_MOUSE_Y,0,20)
NEXT


PROCEDURE ExecuteC()
 FOR C = 1 TO 5
  SLEEP(1)
  FUKIDASI("C:" + (5 - C),G_MOUSE_X + 50,G_MOUSE_Y + 50,0,20)
 NEXT
FEND

並列で処理させてみよう

以下のスクリプトでは、メモ帳を立ち上げ、片方には英語、もう一方には日本語を書き込みます。
THREADですので、同時に実行されます。

この投稿の続きを読む »

タグ

2012年9月9日 | コメントは受け付けていません。 |

カテゴリー:構文・制御文

EXIT

EXIT

関数を終了する
EXIT

自作関数を途中で終了する場合

ループを途中で終了するにはBREAKを使いますが
自作関数を途中で終了する場合はEXITを使います。

//自作関数HELLOはあいさつ文を返す
PRINT HELLO("CN")
//但し、存在しないパラメーターを渡した場合は終了する
FUNCTION HELLO(LANG="EN")
 HELLO = "UNKNOWN"
 SELECT LANG
   CASE "EN"
     HELLO = "Hello"
   CASE "JP"
     HELLO = "こんにちは"
   CASE "FR"
     HELLO = "Bonjour"
   DEFAULT
    EXIT
 SELEND
 //もしEXITがなければ最初に設定されたUNKNOWNが出る。けどもEXITで終了しているため出ない。
 RESULT = HELLO
FEND

再帰的な処理を表現してみよう

例えばある自作関数を宣言し、
その中で、その自作関数を再度呼び出します。
特に条件が無ければ、無限ループのように
ずっと再帰的に処理がされます。
ここで、終了条件とEXITを組み合わせて使い、
自作関数を完成させましょう。
スクリプトは以下のようになります。

この投稿の続きを読む »

タグ

2012年7月30日 | コメントは受け付けていません。 |

カテゴリー:構文・制御文

IF

IF

1行での条件分岐を行う
IF 式 THEN 真 [ELSE 偽]

・式・・・判定条件を入れます
・真・・・判定条件がTrueの時に実施する処理を入れます
・偽・・・判定条件がFalseの時に実施する処理を入れます

条件に一致したらある処理をする

IF-THEN-ELSEは1行で条件分岐を行う場合に使用します。
IFの後に判定条件を入力します。
その後のTHEN以降に、判定条件が真の時に行う処理を、
ELSE以降に、偽の時に行う処理を入力します。

//変数TESTに100を代入
TEST = 100
IF TEST > 50 THEN MSGBOX("50より大きい") ELSE MSGBOX("50以下")

上のスクリプトで変数TESTの値を判定条件としています。
TESTが50以上の場合は「50より大きい」というメッセージが出ます。
通常、IF-THEN-ELSEでは真偽それぞれ、1つずつ処理をします。
それ以外はIFB-ELSEIF-ELSEを使います。
どうしてもIF-THEN-ELSEで複数の処理を実行させたい場合は
下記のようにFUNCTIONPROCEDUREでも使いましょう。

この投稿の続きを読む »

タグ

2012年7月15日 | コメントは受け付けていません。 |

カテゴリー:構文・制御文

FUNCTION

FUNCTION

戻り値のある自作関数を定義する
FUNCTION 関数名( 引数 [,....] )
RESULT = 戻り値 処理
FEND

引数
・引数・・・定義した関数の呼び出し時に渡す変数を定義
・Var 引数・・・Varをつけると引数は参照引数となり、値が変更される
・引数[]・・・配列も利用可能。次元数分の[]を付ける。二次元配列は引数[][]
・引数=定数・・・値を代入する記述で定数にできる 戻り値
・RESULT・・・関数終了時の戻り値

自作関数を作成し、呼び出す

パラメーターの値を加算する自作関数を定義します。計算結果を戻り値として返します。

TOTAL = MYCALC(300,400)
//計算結果を出力
PRINT TOTAL
FUNCTION MYPROC(VAL1, VAL2)
 ADD = VAL1 + VAL2
 RESULT = ADD
FEND

PROCEDUREと同じく自作関数が定義でき、
なおかつ、戻り値を返すことができます。
同じ処理をするときも定義した関数を呼び出せばよく、
処理を修正する場合も自作関数内のみとなります。
とても便利で、プログラムの再利用性が高くなるので、
積極的に活用しましょう。

引数の意味は?

さて、PROCEDUREと同じようにFUNCTIONで自作関数を定義できますが、
その際に渡す定義に色々な種類があることが分かりました。
「引数」は分かるかもしれませんが、その他の
Var 引数
引数[]
引数=定数
という種類は初見の方には分かりづらいかもしれません。
が、このあたりはPROCEDUREで解説していますので、ご参照下さい。

長い処理も自作関数ですっきり

同じ処理も、その都度スクリプトに書くのではなく、自作関数を使うことで
コードの再利用が可能になります。
またWHILE-WENDなどのループ処理中の動作も自作関数で1つにまとめると、
コードの可読性も高まります。
簡単な例を以下にお見せしましょう。

この投稿の続きを読む »

タグ

2012年7月7日 | コメントは受け付けていません。 |

カテゴリー:関数一覧

script0007


script0007
自作関数を利用して消費税を得るスクリプト
参考:http://canal22.org/gyaku/function/

ダウンロードする

タグ

2012年6月4日 | コメントは受け付けていません。 |

カテゴリー:ツール

自作関数の定義

UWSCで自作関数を定義する方法です
PROCEDURE 関数名( 引数, Var 引数, 引数[], Var 引数[][], 引数=定数, …. )
    処理
FEND

FUNCTION 関数名( 引数, Var 引数, 引数[], Var 引数[][], 引数=定数, …. )
    処理
    RESULT = 戻り値    // Result に戻り値を入れる
FEND

Var 宣言を付けると引数を変更可能とする(参照引数)
配列変数には次元数分 []を付ける (2次元配列の場合 引数[][] )
= 定数 にてデフォルトパラメータを指定できる
(デフォルトパラメータ以降に通常引数を書く事はNG)

戻り値のあるなしで書式が変わるので注意が必要です。
関数はFUNCTIONS.UWSなどでまとめて、
Call関数で呼び出して利用するとスッキリして分りやすいです。

自作関数を利用して消費税を得るスクリプト
PRE_PRICE = INPUT("金額を入力してください<#CR>※数字のみ")
AFTER_PRICE = TAX(PRE_PRICE)
PRINT "税込み価格:" + AFTER_PRICE

FUNCTION TAX(PRICE)

	TAX_PRICE = PRICE * 1.05
	RESULT	= INT(TAX_PRICE)
FEND

タグ

2012年3月30日 | コメントは受け付けていません。 |

カテゴリー:逆引き関数

このページの先頭へ