Swiftはstaticメンバーをクラス内で呼ぶときに、C#のようにメンバー名だけでは呼べなくてclassName.memberName
のように書かなくてはいけない。これが馴染めない。タイプ数を問題にしているのではない。
クラスの内側でクラス名が出てくると遠近が混乱して頭に余計な負荷がかかる。クラス名は外側の名前なのに、内側で出てくると他の内側の構成要素の語彙と馴染まない。固有名詞を出す必要のない場面で固有名詞が登場する。代名詞で十分である。
あまりいいアイデアとも思えないけど、いい方法が見付かるまでの次善の策を思いついた。
クラス名に外側の意味を持たない別名を付ける。下の例だとType
だけど、これはStatic
でも、Class
でもなんでもいい。
typealiasは実行時コストがゼロ(?)だから、純粋に表現の問題として扱える...はず。
staticメンバーにアクセスするインスタンスメンバーを用意する方法もあると思う。そちらもコンパイル時の最適化によってコストゼロになりそうだけど、今の自分では判断ができなかったので避けた。
こういう POSOがあったとして
struct Supercalifragilisticexpialidocious {
var dateStr = ""
}
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
が今のスコープの外側のモノという錯覚が生れる。
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は誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?
コメント