クラスでprivateを使用するタイミングとprotectedを使用するタイミングに関するこの質問に、私は考えました。(この質問は関連しているため、最終クラスとメソッドにも拡張します。Javaでプログラミングしていますが、これはすべてのOOP言語に関連すると思います)
良い経験則は、すべてをできるだけプライベートにすることです。
- すぐにサブクラス化する必要がない限り、すべてのクラスを最終クラスにします。
- サブクラス化してすぐにオーバーライドする必要がない限り、すべてのメソッドをfinalにしてください。
- メソッドの本体内で変更する必要がある場合を除き、すべてのメソッドパラメーターを最終的なものにします。
これは非常に単純明快ですが、アプリケーションではなく主にライブラリ(GitHubのオープンソース)を書いている場合はどうでしょうか。
多くのライブラリとシチュエーションに名前を付けることができます。
- 開発者が考えもしなかった方法でライブラリが拡張されました
- これは、可視性の制約のため、「クラスローダーマジック」およびその他のハックを使用して行う必要がありました。
- ライブラリは構築されていない方法で使用され、必要な機能は「ハッキング」されました
- 可視性の低下により変更できない小さな問題(バグ、機能の欠落、「間違った」動作)のため、ライブラリを使用できませんでした
- 修正できなかった問題は、単純な関数(プライベートまたは最終)をオーバーライドするのに役立つ巨大でhugeいバグのある回避策につながりました。
そして、質問が長くなりすぎるまでこれらの名前を付け始め、それらを削除することにしました。
必要以上のコード、必要以上の可視性、必要以上の抽象化を持たないというアイデアが好きです。そして、これはエンドユーザー向けのアプリケーションを書くときに機能するかもしれません。その場合、コードはそれを書く人だけが使用します。しかし、コードが他の開発者によって使用されることを意図している場合、これはどのように持続しますか?元の開発者があらゆる可能なユースケースを事前に考え、変更/リファクタリングが困難/不可能である可能性は低いですか?
大きなオープンソースライブラリは新しいものではないので、オブジェクト指向言語を使用したこのようなプロジェクトで可視性を処理する最も一般的な方法は何ですか?