手探りSwift: Staticメンバーをクラス内で呼ぶときにクラス名を書かなくちゃいけない

Swiftはstaticメンバーをクラス内で呼ぶときに、C#のようにメンバー名だけでは呼べなくてclassName.memberNameのように書かなくてはいけない。これが馴染めない。タイプ数を問題にしているのではない。

クラスの内側でクラス名が出てくると遠近が混乱して頭に余計な負荷がかかる。クラス名は外側の名前なのに、内側で出てくると他の内側の構成要素の語彙と馴染まない。固有名詞を出す必要のない場面で固有名詞が登場する。代名詞で十分である。

あまりいいアイデアとも思えないけど、いい方法が見付かるまでの次善の策を思いついた。 クラス名に外側の意味を持たない別名を付ける。下の例だとTypeだけど、これはStaticでも、Classでもなんでもいい。

typealiasは実行時コストがゼロ(?)だから、純粋に表現の問題として扱える...はず。 staticメンバーにアクセスするインスタンスメンバーを用意する方法もあると思う。そちらもコンパイル時の最適化によってコストゼロになりそうだけど、今の自分では判断ができなかったので避けた。

こういう POSOがあったとして

struct Supercalifragilisticexpialidocious {
    var dateStr = ""
}

Before

import Foundation

extension Supercalifragilisticexpialidocious {

    private static var df = ISO8601DateFormatter()

    var date: Date? {
        get {
            return Supercalifragilisticexpialidocious.df.date(from: dateStr)
        }
        set {
            dateStr = Supercalifragilisticexpialidocious.df.string(from: dateStr)
        }
    }
}

DateFormatterのインスタスをstatic変数dfにキャッシュしておく。プロパティdateでは、dfを使って文字列と日付を変換する。dfはprivate変数であり内側の構成要素なのだけど、Supercalifragilisticexpialidociousと書かれていることでdfが今のスコープの外側のモノという錯覚が生れる。

After

import Foundation

extension Supercalifragilisticexpialidocious {
    fileprivate typealias `Type` = Supercalifragilisticexpialidocious

    private static var df = ISO8601DateFormatter()

    var date: Date? {
        get {
            return Type.df.date(from: dateStr)
        }
        set {
            dateStr = Type.df.string(from: dateStr)
        }
    }
}

自クラスをTypeという代名詞で指せるようになった。 言語の上に、自分ルールを置くことによってコードを読むときのスコープが狭まって読みやすくなったと思う。ただしルールは増えたし、そのルールは自分しか知らない。


あぜち(おばあちゃん)
Crieitはαバージョンで開発中です。進捗は公式Twitterアカウントをフォローして確認してください。 興味がある方は是非記事の投稿もお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか
関連記事

コメント