Ftxa クラス図

目的は以下の通り。


1985 年製の RFC から FTP のモデルを抜粋

   2.3.  THE FTP MODEL

      With the above definitions in mind, the following model (shown in
      Figure 1) may be diagrammed for an FTP service.

                                            -------------
                                            |/---------\|
                                            ||   User  ||    --------
                                            ||Interface|<--->| User |
                                            |\----^----/|    --------
                  ----------                |     |     |
                  |/------\|  FTP Commands  |/----V----\|
                  ||Server|<---------------->|   User  ||
                  ||  PI  ||   FTP Replies  ||    PI   ||
                  |\--^---/|                |\----^----/|
                  |   |    |                |     |     |
      --------    |/--V---\|      Data      |/----V----\|    --------
      | File |<--->|Server|<---------------->|  User   |<--->| File |
      |System|    || DTP  ||   Connection   ||   DTP   ||    |System|
      --------    |\------/|                |\---------/|    --------
                  ----------                -------------

                  Server-FTP                   USER-FTP


それぞれの部分についてクラス化する方向でよさそう。
継承、サブクラスはあまり好きじゃないので、役割とインターフェイスを中心に考えていく。


コマンドライン入力の例とその結果

入力
(Linux bash)
ftxa --protocol=ftp --upload /path/to/file
(Windows)
ftxa /PROTOCOL ftp /UPLOAD C:\path\to\file
 ↓FTP によるアップロード処理↓
結果
(Linux 系)
/path/to/file にファイルがアップロードされる。
(Windows)
C:\path\to\file にファイルがアップロードされる。

CUI の仕様とファイルシステムのパスが違うことが分かる。
これを分解して、次のようにクラスを配置する。

class Ftxa(object):

    """プログラム上での操作インターフェイス。"""

    def __init__():
        """今のところ何もしない。"""
        pass

    def setProtocol(type):
        """使用するプロトコルを指定する。

        Keyword arguments:
            type 使用するプロトコル
                 FtxaProtocol オブジェクト、もしくは
                 FtxaProtocol オブジェクトを生成するための引数。
        """
        pass

    def setLocalFileSystem(type):
        """ローカルのファイルシステムを指定する。

        Keyword arguments:
            type 使用するプロトコル
                 FtxaFileSystem オブジェクト、もしくは
                 FtxaFileSystem オブジェクトを生成するための引数。
        """
        pass

    def setRemoteFileSystem(type):
        """リモートのファイルシステムを指定する。

        Keyword arguments:
            type 使用するプロトコル
                 FtxaFileSystem オブジェクト、もしくは
                 FtxaFileSystem オブジェクトを生成するための引数。
        """
        pass

    def setInterface(type):
        """CUI を設定する。

        Keyword arguments:
            type 使用するプロトコル
                 FtxaInterface オブジェクト、もしくは
                 FtxaInterface オブジェクトを生成するための引数。
        """
        pass


class FtxaProtocol(type):

    """プロトコルを抽象化したインターフェイス。

    FtxaFTP や FtxaWebDAV などの実装がある。
    FtxaProtocol("ftp") もしくは FtxaProtocol.factory("ftp") で生成する。
    """
    pass


時間がなくなったのでここまで。
__metaclass__ 、 __new__ のまとめが必要だな。