しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

オペランドの原則とSwift

オペランドの原則というものを学んだので書いていきます。

オペランドの原則とは

オペランドの原則とは簡単に言うと「メソッドの引数にオプション的な値を入れない」という原則です。

下のようにテキストから文字列を検索するクラスを考えると、ignoreCaseはオプション的な値になります。
オペランドの原則の法則に従うと、ignoreCaseserarchの引数にせずインスタンス変数にする事になります。

class TextSearchManager {
    let text: String
    init(text: String) { self.text = text }
    
    func search(str: String, ignoreCase: Bool) -> [String] {
        // ...
    }
}

オペランドの原則の語源

オプション引数以外の引数をオペランド引数と呼びます。
オペランドの原則はそこから来ています。

オペランドの原則のメリット

オペランドの原則のメリットとしては下のものが挙げられます。

  • 引数が少ないので使う側が混乱しない
  • オプションを増やしたい時に他のクラスへの影響が少ない

しかしSwiftには「デフォルト引数を備えている」「最後の引数以外も省略できる」という性質があるので上記のメリットはSwiftでは感じる事がないかもしれません。

class TextSearchManager {
    let text: String
    init(text: String) { self.text = text }
    
    func search(str: String, ignoreCase: Bool = false, onlyFirst: Bool = false) -> [String] {
        // ...
        return [String]()
    }
}

let t = TextSearchManager("text")
t.search("str", onlyFirst = true)

Swiftオペランドの原則に従うべきか

個人的にはオペランドの原則の法則に従って行きたいと思っています。
というのも引数を省略できるとは言え、メソッド定義に何個も引数があるのは見栄え的に重いです。
大量のオプション付きでメソッドを呼び出す時に処理が長くなってしまうのも少しイマイチな気がしています。

コンストラクタのオプション引数

コンストラクタについてはオプション引数を付けるのはありのようです。
完全コンストラクタを使えるので、コンストラクタでの指定は良さそうです。

参考URL

オペランドの原則 - Strategic Choice
メソッドの引数はオペランドのみにする原則(メソッドの引数がクラス設計に影響する) - A Day In The Life