it-swarm-ja.com

Swiftのインスタンスメソッドでオプションの 'self'参照をスタイルの問題として使用する

Swiftでは、selfを使用して、現在のオブジェクトインスタンスへのメソッド呼び出しおよびプロパティ参照のオプションのプレフィックスを付けることができます。これらのプレフィックスを削除すると、コードが整理されますが、メソッドの長さ、パラメーターとローカル変数の数によっては、変数のスコープが曖昧になる場合もあります。

おそらく答えは、より小さなクラスとメソッドにリファクタリングすることですが、それが常に実用的であるとは限りません。一般的な例は、UIViewControllerサブクラスやカスタムviewDidLoad()実装、UIGestureRecognizerサブクラスの複雑なアクションハンドラーなどです。 SwiftでiOSアプリの開発に飛び込んで以来、これについて少し考えてきましたが、まだフェンスの中にいます。私の理想的な答えは次のとおりです。

  1. selfを参照しない場合、実用的な欠点があります。

  2. selfへの暗黙的参照と明示的参照を混在させる方が、どちらか一方に固執するよりも悪いかどうか(私はyesに傾いています)。

  3. 読みやすさに重点を置いた全体的なスタイルの懸念。

  4. あいまいさを軽減するためのインスタンス変数の命名スタイルとローカル変数の命名スタイル。

  5. 他の言語での同様の問題への参照。

5
A. R. Younce

これはスタイルの問題に過ぎないと私は思います-「読みやすさの測定」(これは常に個人的なものです)はここであなたを助けることができません。

先に進む前に、これについてお話ししましょう。チームで作業している場合は、スタイルの選択が何であれ、チーム全体が遵守しなければならない明確な基準を定義します。コードの可読性を低下させ、読むときに異なるスタイルの選択に追いつく必要があります。

しかし今、主な主題に:多くのOO言語で存在するように、selfthisまたはmeは、おおよそ以下の機能を備えています。理由:

  1. 現在のオブジェクトのインスタンスを他の人に渡すことができる;
  2. Javaの反射プロパティthis.classなど、他の方法では利用できない特別なプロパティへのアクセス。
  3. それ以外の場合は競合する名前をローカルスコープで使用できるようにします。

OO言語(vtablesなど))を使用するときに抽象化される他の多くの詳細と同様に、selfも非表示にすることができます上記の理由のため。

したがって、私のopinionは、上記のようにnecessaryの場合にのみ使用する必要があるということです。もちろん、このアイデアは、小さなクラスとメソッドを作成する慣行に沿ってのみ機能します。そうしないと、ローカルスコープとグローバルスコープの両方が非常に大きくなるため、常に混乱を招き、リーダーがコード内を上下に移動して定義を探す必要があります。しかし、私はこれらの場合、あなたを救うのはスタイルの一貫性ではないと言いたくなります。

5
MichelHenrich

Selfを使用しないと、変数を使用するたびに2度考えてしまいます。私見でクリーンなコードを書くことはスタイルの問題です。 Objective-Cのスタイルは、プロパティでselfを使用することです。 Swiftプログラマーの大多数はObj-C出身なので、このスタイルを維持する必要があります。

2
brainray

特にSwiftの場合、コンパイラーから明示的に要求されない限り、selfを省略することにはいくつかの利点があると思います。

  1. selfを必要な場所のみ(つまり、自己がキャプチャされるクロージャ内)で使用すると、自己への参照が不適切に保持される可能性がある状況を簡単に特定できます。

  2. 私は興味深い問題に遭遇し、警告メッセージが表示されないようにselfを使用しているように見えます。

class MyObject {
    var myRange: Range‹Int›? {
        willSet {
            // This line has a warning that you are operating on a property that is about to change
            myRange?.startIndex = 2
            // This line does not show any warning
            self.myRange?.endIndex = 3
        }
    }
}

これはバグだと主張するかもしれませんが、警告の場合のみ、selfが一部の式の処理方法を変更することが重要だと思います。

1
bjtitus