はじめに
Caché(キャシエ)は、オブジェクト指向の開発環境を提供しますが、その構成要素には、データベースエンジンを含んだオブジェクト指向言語のCaché ObjectScriptとスタジオなどの開発ツール、および今回紹介するクラスライブラリがあります。
クラスライブラリをうまく利用することにより、アプリケーションの開発を楽にすることができます。現在では、Cachéの機能のかなりの部分がクラスライブラリの形で提供されていますが、今後ともさまざまな機能がクラスライブラリとして提供されていきます。
Cachéクラスライブラリの概要
Cachéが提供するクラスライブラリは多岐に渡り、ここですべてを紹介することはできません。
提供しているクラスライブラリの詳細は、Cachéドキュメントのクラスライブラリから参照することができます。次のように、キューブからドキュメントを選択し、ブラウザに表示されたドキュメントホームページからクラスリファレンス情報を選択してください。
ここでは、プログラミング上の有用性という観点からいくつか便利なクラスライブラリを紹介します。
%SYSTEMクラスライブラリ
システムが提供するさまざまな機能をクラスメソッドの形態で提供します。このクラスライブラリが提供する機能は、比較的単純で、単体での利用が可能なものが多数含まれます。
以下は、バージョン情報を提供するクラスの利用例です。
>write ##class(%SYSTEM.Version).GetVersion()
また、%SYSTEMクラスライブラリは、特殊変数$SYSTEM
を使用して、##class構文を省略することが可能です。上記と同等のことを$SYSTEM
変数を使用すると、次のように記述できます。
>write $SYSTEM.Version.GetVersion()
%Fileライブラリ
各種デバイスへの入出力処理は、Cachéの入出力コマンド(Open、Use、Read、Write、Close)で実現可能ですが、デバイスごとの特性に応じて処理を実行していかなければならず、プログラミングが煩雑になりがちです。
利用機会の多いファイルの入出力処理に関しては、%Fileライブラリを使用することにより、より簡単で分かりやすい入出力処理を実現することができます。
ここでは、%Fileライブラリを使用した簡単なシーケンシャルファイルへの入出力を紹介します(以下のコード例は、変数の値割り当てなどの処理を省略しているため、このままでは、動作しません)。
if ##class(%Library.File).Exists(file) { set fs=##class(%Library.FileCharacterStream).%New() set fs.Filename=file while 'fs.AtEnd{ set x=fs.ReadLine() set F1=$piece(x,$c(09),1) set F2=$piece(x,$c(09),2) set ^test(F1,F2) = "" } }
Set fs = ##class(%File).%New(file) Do fs.Open("WSN") Set tab = $Char(9) For i = 1:1:count { set title = $List(titlelist,$R($LL(titlelist))+1) set author = $List(authorlist,$R($LL(authorlist))+1) set publish = $List(publishlist,$R($LL(publishlist))+1) set amount = $R(1000) * 100 set record = title_tab_author_tab_amount_tab_publish Set status = fs.WriteLine(record) }
%Netライブラリ
インターネットの世界には、TCP/IPをベースにしたさまざまなプロトコルがあります。
もちろんCachéのTCP/IPソケットデバイスの入出力機能を使用して、それらのプロトコルを実装することは、技術的には可能ですが、煩雑なプログラミングを行なわなければなりません。
Cachéの%Netライブラリでは、それらのプロトコルの中で、よく使用されるものを抽象化してライブラリの形で提供し、簡単にその機能を実現できるようにしています。
ここでは、アプリケーションの組み込み機能として利用機会の多いメール機能の実装例を紹介します。
Set s=##class(%Net.SMTP).%New() Set s.smtpserver="xxxx.xxxx.com" Set auth=##class(%Net.Authenticator).%New() Set auth.UserName="xxxx" Set auth.Password="xxxxx" Set s.authenticator=auth Set m=##class(%Net.MailMessage).%New() Set m.Charset="iso-2022-jp" Set m.From="xxxx@xxxx.com" Do m.To.Insert("xxx@xxxx.com") Set m.Subject="Cach[&:eacute;] Solution Page" Set crlf=$C(13,10) Do m.TextData.WriteLine( "このたびは、Cache'ソリューションページへのユーザーご登録") Do m.TextData.WriteLine("誠にありがとうございます。") Do m.TextData.WriteLine( "お客様のユーザー名、パスワードは、次のようになっています。") Do m.TextData.WriteLine("ユーザー名: "_Username) Do m.TextData.WriteLine("パスワード: "_Password) Do m.TextData.WriteLine("今後ともCache'をご愛顧いただきますよう、") Do m.TextData.WriteLine("よろしくお願い申し上げます。") Do m.TextData.WriteLine("インターシステムズジャパン株式会社") Do m.TextData.WriteLine( "※本メールの一部、または全部の無断転載を禁じます。") Set status=s.Send(m) If $$$ISERR(status) Quit $System.Status.GetErrorText(status)
まとめ
クラスライブラリを利用すると、自分で実装すると非常に煩雑なことが、非常に簡単に実現できることがよくあります。
何かを実装する前に既にクラスライブラリで似たようなことが実現されていないか、ぜひ探索してみてください。