ワクワクV039回目FSO解説(2021-05-08)

1
ほえほえ@スプシマン @hoehoe1234

ワクワクV039回目FSO解説(2021-05-08) FSOを始めとした複数のクラス群の動きを理解するにはクラス図を書くことを推奨しています。クラス図はクラスの静的な関係を、シーケンス図は一面を切り取った動的な関係を表します。クラスとインスタンスという側面もあります。書き方はUMLに準拠します。 pic.twitter.com/F1F7m0eSlr

2021-05-25 00:36:36
拡大
ほえほえ@スプシマン @hoehoe1234

ただ、理解のためにクラス図を書き起こすので、設計とは違い、簡易的な書き方で良いと思います。クラスは四角、関連は矢印、おもなプロパティとメソッドあたりでしょうか。VBAでは継承はないのでその当たりは省略します。この図を書くことにより全体像をイメージできるようになります。

2021-05-25 00:38:10
ほえほえ@スプシマン @hoehoe1234

線には、生成する、呼び出す、保有する・・・いろいろありますがとりあえずはなにか関連があれば線を引いておく程度でよいかと思います。 クラスを書くときのポイントは「このクラスは何を表すのか?」をイメージ、言語化することだと思います。 pic.twitter.com/vBb69ocmcy

2021-05-25 00:39:50
拡大
ほえほえ@スプシマン @hoehoe1234

まず関連するクラスを書き出します。そして各クラスは「なにを表しているのか?」を想像します。これができると実際に使うときに、このメソッド、プロパティ(以下簡単のためにメソッド、プロパティはメソッドと表記します)どこにあるんだろう?という当たりが突くようになります。

2021-05-25 00:41:15
ほえほえ@スプシマン @hoehoe1234

これがオブジェクト指向の使う側からの大きなメリットです。クラスが何を表すかを想像できれば、やりたいことはそのクラスのメソッドを探せばたいがいはでてきます。覚える必要がないんですね。オブジェクト指向では詳細は調べながらコードする。で十分だと思います。

2021-05-25 00:42:38
ほえほえ@スプシマン @hoehoe1234

もちろん、レンジなどでは、想像できないようなメソッドがたくさんありますので、事前にクラスのメソッドは一通り眺めておいたほうがよいです。

2021-05-25 00:44:38
ほえほえ@スプシマン @hoehoe1234

とはいえ、①呼び出す関係(他インスタンスのメソッドを使用する)と②コレクション(他を複数保持している)と③生成(newして返す)程度の違いは把握しておいたほうがよいかとおもいます。 図右にあるように、getFolderではFolderオブジェクトが取得できます。FolderオブジェクトのFilesコレクション

2021-05-25 00:45:39
ほえほえ@スプシマン @hoehoe1234

では複数のFileオブジェクトを取得することができます。各フィアルはopenすることにより関連づけられたファイルの入出力を担当するTextStreamオブジェクトを取得できます。こにょうに線には多くの意味がありますがとりあえず線を引けばよいと思います。

2021-05-25 00:46:59
ほえほえ@スプシマン @hoehoe1234

主要クラスを書いたら次に各クラスのメソッドのうち、他のクラスに関係のあるもの(生成するもの、すなわちメソッドの戻り値が他クラスであるもの、プロパティで他クラスを持つもの)を結んでみます。

2021-05-25 01:14:01
ほえほえ@スプシマン @hoehoe1234

関連の線を赤色でひいてみました。FSOはファイルシステム、folderはフォルダー、Fileはファイルということはある程度自明かとおもいます。FolderがFilesで複数のフィアルを持つことも分かります。 pic.twitter.com/Z3JJGPaqA3

2021-05-25 01:16:07
拡大
ほえほえ@スプシマン @hoehoe1234

ファイルシステムオブジェクトのイメージはむずかしいしかもしれませんね。ファイルシステムとはなにか?という知識が必要になります。簡易的にはフォルダとファイルの入れ子で構成されたエクスプローラでみれるC:\配下の木構造のそのもの。でよいかと思います。

2021-05-25 01:17:20
ほえほえ@スプシマン @hoehoe1234

ファイルシステムはディレクトリとファイルの再帰的な木構造で構築されていますが、その「木全体をフィアルシステム」と呼ぶイメージで良いかとおもいます。裏には木を構成するデータ構造が裏にありますがとりあえずはそんな感じで良いかと思います。

2021-05-25 01:18:56
ほえほえ@スプシマン @hoehoe1234

①ファイルシステム フォルダとファイルで構成される木構造全体のこと ②フォルダ フォルダ。フォルダは複数のフォルダと複数のファイルをもつことができる ③ファイル いわゆるファイル でよいかと思います。

2021-05-25 01:20:13
ほえほえ@スプシマン @hoehoe1234

TextStreamの概念は少し難しいですね。これはファイルに対する1バイトずつの読み書きを提供するオブジェクトです。実際にどのファイルに関連付けられているかはこのTextStreamオブジェクトを作成したコードはしっていますが、TextStreamからはそれがどこに関連付けられているかはわかりません。 pic.twitter.com/lCCCETSRo4

2021-05-25 01:38:45
拡大
ほえほえ@スプシマン @hoehoe1234

これが抽象化ですね。抽象化とは「共通の性質をみつける」というこです。プログラミングでは共通の性質はクラス、メソッドして実装されます。なのでTextStreamオブジェクトは1バイトづつ読んだり書いたりできるオブジェクトなんですね。

2021-05-25 01:40:32
ほえほえ@スプシマン @hoehoe1234

これはunixでいうopenシステムコールでファイル記述子(小さな整数)が返ってくるのと同じですね。unixの場合はこの番号で読み書きします。FSOの場合はこれがTextStreamになっているのですね。なのでこの例でいえばVBAコードは抽象的に記述ができます。

2021-05-25 01:42:21
ほえほえ@スプシマン @hoehoe1234

この場合のコードの中心は「読んで、書き出す」ということになります。ですから、ファイルを風呂桶にたとえると風呂桶に開けた穴オブジェクトのようなイメージなんですね。どこにつながっているかは関心がありません。

2021-05-25 01:43:39
ほえほえ@スプシマン @hoehoe1234

演習問題です。copy/moveのパターンは図右下のように4パターンしかありませんね。VBA、FSOではパスの最後の区切り記号(\)を付けてフォルダで有ることを明示するインタフェースがあり当初は混乱しましたがなれると便利ですね。フォルダとファイルをパス記法により区別できますので。 pic.twitter.com/V4H8oHR1Vm

2021-05-25 02:25:05
拡大
ほえほえ@スプシマン @hoehoe1234

もともとはパスはフォルダまたはフィアルへのパスであり、パスの最後の要素がフォルダであるかファイルであるかでした。dir関数なのでは最後に"\"があるかどうかで挙動が変わりますね。これは慣れの問題ですね。

2021-05-25 02:26:58
ほえほえ@スプシマン @hoehoe1234

FSOの全体図です。特徴的なのはオブジェクトの階層構造以外にも、各クラスから「パス」を使ってのショートカットがある点ですね。ですから同じことがFSO+パスでも、Folder->Fileとたどっていってもどちらでも実現できる場合が多くあります。

2021-05-25 02:29:49
ほえほえ@スプシマン @hoehoe1234

もともとはFolderとFileは同じものですし、TextStremaはオープンした記述子相当なのでFSO+パスで多くのことが記述できるのですね。もちろん、Folder/Fileオブジェクトを使わなければ実現できない処理もあります。 pic.twitter.com/jOoCPrUHmi

2021-05-25 02:31:22
拡大
ほえほえ@スプシマン @hoehoe1234

ほえDX塾では、確固たる根拠があるわけではないのですが、FSO+パスのショートカット記法で実現できる処理はそちらを選択してよいでしょうということにしています。というか、たぶん、そのためのパスによるショートカットでしょうから。ですから単にファイルの中身を読みたいのであれば

2021-05-25 02:32:45
ほえほえ@スプシマン @hoehoe1234

FSO+ファイルのパスでOpenTextFileメソッドを呼び出し、直接TextStreamオブジェクトを取得することを推奨しています。推奨というか、それで十分ということですね。

2021-05-25 02:34:52
ほえほえ@スプシマン @hoehoe1234

固有のクラスを使う必要がある処理は、たとえば、Folder配下にある複数のファイルとフォルダの一覧を取得するなどの「複数形」とDateCreatedなどの「詳細情報系」になるかなとおもいます。ショートカットは便利ですが使い分けに悩みますね。

2021-05-25 02:37:10
ほえほえ@スプシマン @hoehoe1234

ということで時間をとって、生徒の皆さんにクラス図をかいてもてもらっています。FSOに限ってのはなしですがパスによるショートカットとオブジェクトをたどる2つの方法があることに注意してほしいと思います。 pic.twitter.com/NOoGdH4rja

2021-05-25 02:58:48
拡大