ここでは主にここでメソッドアクセスについて話していると言って、メンバーアクセスではなくクラスを最終的にマークすることで、これの前置きを述べます。
古い知恵
「正当な理由がない限り、非公開にしてください」
オープンソースが開発者ライブラリスペースとVCS /依存関係管理を支配する前に、それが書かれた日には理にかなっています。Github、Mavenなどのおかげで、ハイパーコラボレーティブになりました。当時は、ライブラリの利用方法を制限することで稼ぐこともできました。キャリアの最初の8年または9年は、この「ベストプラクティス」を厳守することに費やしたと思います。
今日、私はそれが悪いアドバイスであると信じています。メソッドをプライベートまたはクラスをfinalとマークするための合理的な議論がある場合がありますが、それは非常にまれであり、それでもおそらく何も改善していません。
これまでに:
- 継承と数行のコードで修正できるバグがあったライブラリなどに失望、驚いたり傷ついたりしたが、プライベート/ファイナルメソッドとクラスが原因で、公式パッチが来ることを待たされたのではないか。私が持っています。
- 作者が想像していたのとは少し異なるユースケースでライブラリを使用したいのですが、プライベート/ファイナルメソッドとクラスのために使用できませんでしたか?私が持っています。
- 拡張性に過度に寛容だった図書館などに失望、驚いたり傷つけられたりしていませんか?私はそうではありません。
これらは、メソッドをデフォルトでプライベートにマークするために聞いた最大の3つの合理化です。
合理化#1:それは安全ではなく、特定のメソッドをオーバーライドする理由はありません
私が書いた特定のメソッドをオーバーライドする必要があるかどうかについて、私が間違っていた回数を数えることはできません。いくつかの人気のあるオープンソースライブラリに取り組み、私は物事をプライベートにマークすることの本当のコストを難しい方法で学びました。多くの場合、予期しない問題やユースケースに対する唯一の実用的な解決策を排除します。逆に、16年以上の専門的な開発の中で、APIの安全性に関連する理由により、メソッドを非公開ではなく保護にマークしたことを後悔したことは一度もありません。開発者がクラスを拡張してメソッドをオーバーライドすることを選択するとき、彼らは意識的に「私は自分のしていることを知っています」と言っています。十分な生産性のために。限目。危険な場合は、クラス/メソッドのJavadocで注意してください。無意識にドアを閉めないでください。
デフォルトで保護されているマーキング方法は、現代のソフトウェア開発における主要な問題の1つである想像力の失敗を軽減します。
合理化#2:パブリックAPI / Javadocsをクリーンに保つ
これはより合理的であり、対象とする利用者によっては正しいことでさえあるかもしれませんが、APIを「クリーン」に保つためのコストが実際に何であるかを検討する価値があります:拡張性。上記の理由から、万が一に備えてデフォルトで保護されているものにマークを付ける方がおそらく意味があります。
合理化#3:私のソフトウェアは商用であり、その使用を制限する必要があります。
これも理にかなっていますが、消費者としては、制限の少ない競合他社(品質に大きな違いがないと想定)を毎回使います。
絶対とは絶対言うな
メソッドをプライベートとしてマークしないと言っているのではありません。より良い経験則は、「正当な理由がない限りメソッドを保護する」ことだと言っています。
このアドバイスは、モジュールに分割されたライブラリまたは大規模プロジェクトで作業している人に最適です。小規模またはモノリシックプロジェクトの場合、すべてのコードを制御し、必要に応じてコードのアクセスレベルを簡単に変更できるため、それほど重要ではありません。それでも、私は同じアドバイスをします:-)