クラスを使ってみる

投稿者: | 2016年2月8日
2017年2月7日追記
クラスの理解が間違っていたので訂正します。(まだ間違ってるかもしれないけど、少なくとも当初の内容の間違いは解消してると思う。。。)

cal機能の追加に先立って、Swift版calのオプションスイッチチェック部分をクラスで書き直してみます。

クラスというのは値(変数や定数)と関数とが一緒くたになっているもので、これを使ってインスタンスを生成することができます。クラスというテンプレートから生成されたインスタンスにはそれぞれ具体的な値があって、メソッド(関数)を使ってその値を操作することができます。

とまぁ、未だに正確な定義をよく理解できていませんが、今の時点でうんうん唸った結果このような理解に落ち着いています。

で、クラスを上手に使うとメインプログラムから処理を切り離すことができてプログラムの見通しが良くなるみたいなので、とりあえず簡単そうなところから手をつけてみました。

class checkOption {
  private var arguments: [String]
  private var calendarRaws: Int
  private var calendarCols: Int
  private var weekFormat: Bool
  private var startYear: Int
  private var startMonth: Int
  private var adjustMonth: Int
  init(arguments: [String], calendarRaws: Int = 1, calendarCols: Int = 1, weekFormat: Bool = false,
        startYear: Int = 0, startMonth: Int = 0, adjustMonth: Int = 0) {
    self.arguments = arguments
    self.calendarRaws = calendarRaws
    self.calendarCols = calendarCols
    self.weekFormat = weekFormat
    self.startYear = startYear
    self.startMonth = startMonth
    self.adjustMonth = adjustMonth
  }
  func checkSwitch() {
    if arguments.count != 1 {
      switch arguments[1] {
      case "-y":
        calendarRaws = 4
        calendarCols = 3
        startMonth = 1
        if arguments.count == 3 {
          startYear = Int(arguments[2])!
        }
      case "-m":
        if arguments.count == 3 {
          startMonth = Int(arguments[2])!
        }
        if arguments.count == 4 {
          startMonth = Int(arguments[2])!
          startYear = Int(arguments[3])!
        }
      case "-3":
        calendarCols = 3
        adjustMonth = -1
      case "+3":
        calendarCols = 3
      case "-w":
        weekFormat = true
      default:
        calendarRaws = 0
        calendarCols = 0
      }
    }
  }
  func getCalendarRaws() -> Int {
    self.checkSwitch()
    return calendarRaws
  }
  func getCalendarCols() -> Int {
    self.checkSwitch()
    return calendarCols
  }
  func getWeekFormat() -> Bool {
    self.checkSwitch()
    return weekFormat
  }
  func getStartYear() -> Int {
    self.checkSwitch()
    return startYear
  }
  func getStartMonth() -> Int {
    self.checkSwitch()
    return startMonth + adjustMonth
  }
}

関数の書き方に似ているけれど、funcの代わりにclassってつける。関数同様名前をつけたら処理を{}で括るのが決まり。

で、大まかに3ブロックに分けてみた。

  1. 2から18行目:値(プロパティ)の宣言と初期化部分
  2. 19から49行目:関数(メソッド)の記述
  3. 50から69行目:カプセル化

まずプロパティの宣言部分。変数宣言のvarの前にprivateをつけることで、基本的にクラスの中だけで使用する変数になります。クラスの外で同じ名前の変数があっても、別のものとして処理されるので、メインプログラムから処理を切り離すことができます。

その後init()内で変数の初期値を定義します。ここで初期値を与えない変数については、後でクラスを使用する際に値を指定しなければなりません。

さらにinit(){}内にてself.なんちゃらと書いていますが、これはもう「こんなもん」と思って面倒くさいけど漏れなくずらずらと書きましょう。

メソッドについては関数と同じ。変数名を変えたり”-w”オプションを追加したりしていますが、Swift版calの46から66行目と同じ内容です。

最後のカプセル化ですが、冒頭宣言したプロパティの値をクラスの外側から読み書きするための関数です。これも「こんなもん」と思って書きます。基本的にgetなんちゃらというのはプロパティの値を返す関数です。

これでなんとかオプションチェックの部分をメインプログラムから切り離すことができました。この部分の呼び出しについてはまた後ほど。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です