ライブラリに慣れるために、ソースコードを読むよりもjavadocを読む方が望ましいですか。


8

私は大学の研究室のマニュアルで以下に出くわしました:

javadocを生成してクラスのインターフェースを調べる必要があるので、提供される操作を確認できます(コードを自由に見てください。ただし、他の誰かのコードを使用する場合は、ここでは、javadocではなくjavadocから作業する必要があります)可能な限りコード)。

なぜそうなのか理解できません。javadocが古くなっている可能性があるか、コードの機能を不適切に説明している可能性があるためです。確かにソースコードを見て、javadocコメントを読むのが最善でしょうか?

javadocのみを読むことが最善の方法である理由、またはその理由はありますか?


3
ほとんどの場合、必要なすべてのコードを読んで理解する機会はありません。また、エッジケースがどのように処理されるかをコードから明らかにすることもできます。
raptortech97 2015

これは以前に何度も尋ねられ、回答されています。このサイトでの最初の質問から始まります- 「コメントはコードの匂いです」とそれにリンクする複数の質問
gnat

回答:


23

推奨事項は、実装ではなくインターフェイスへのプログラミングに関するものです。

確かに、コードにアクセスできる場合は、実装を調べどのように機能するを理解するのを妨げるものは何もありません。ただし、方法がAPIの消費に影響しないことを常に確認する必要があります。

APIを使用しているときは、抽象化に反対しています。APIが提供するもの(契約)だけに関心を持ち、方法(実装)に関心を向けないようにしてください。

これは、コントラクトが変更されていない場合でも、APIの実装がバージョン間で大幅に変更されないという保証がないためです。


2
多くのクラスドキュメントで最大の欠落の1つは、クラスの明らかな動作のどの側面が消費者によって正当に依存される可能性があるか(そしてクラスの将来のバージョンで変更されてはならない)、およびどのような動作が正当であるかについての明確な仕様です変更されたため、正当に依存することはできません。いずれかのアイテムが何のアイテムがいる限りとすることを保証するために、それの安いを削除した後、それが列挙のいずれかの保証順序を提供するために、マッピングコレクションのために高価ですが例えば、これまでに削除されなかった、アイテムは、それらが追加された順に列挙されます。
スーパーキャット2015

アイテムのシーケンスからマッピングコレクションを作成し、後で元のシーケンスでアイテムを処理するためにコードが必要になる場合が多くあります。コレクションが追加された順序で項目が列挙されることが保証されている場合、元の順序は安全に破棄されますが、そのような保証がない場合は、保持する必要があります。クラスが「自然に」従う動作を文書化すると、実装にコストはかかりませんが、クラスがより便利になります。
スーパーキャット2015

@supercat:これは、後でクラスの微調整/再書き込みを制限します。つまり、不幸な決定は是正することができません。
デデュプリケータ、2015

@Deduplicator:トレードオフがあります。尋ねられる質問は、特定の種類の潜在的な実装の変更を容易にするために、消費者にとっての潜在的な利点を先に進める価値があるかどうかです。YAGNIの原則は、実際に実行したい種類の変更を明確に説明できず、消費者の利益を否定せずにそのような変更に効率的に対応することができない場合を除き、消費者に利益を提供することを支持することをお勧めします。あるいは、AddOnlyDictionary挿入順序を維持することを約束し、オファーを提供することもできます...
supercat

... 1ライターのマルチリーダースレッドセーフ、または他の種類の辞書が必要な場合、それらを派生さDictionaryせ、古い動作を必要としないコードを記述するときに人々が新しい辞書に移行できることを計算します。添加順序を維持する能力は、一般に、コードに関連しないことに注意してください受信Dictionary他の場所からのだけコンストラクタを介してインスタンスを作成するコードは、(他の場所から受信した辞書があったかもしれないので、項目がある時点で削除しました)。いずれにせよ、辞書が追加順序の保証を
守ら

4

インターフェースと実装の違いは別として、前の回答すでに説明しましたが、もう1つの重要な側面があります。それは複雑さです。

通常、実際のシステムは複雑です。クラスのコードを読み始めると、別のクラスのコードを読み、次に別のクラスのコードを読む必要があることにも気づくでしょう。数時間後、単純にすべての複雑さと、誰が何を、どのような場合に呼び出すのか覚えていません。

インターフェースのコメントのみを使用すると、この複雑さを軽減できます。裏側では、すべてが簡単なのかもしれません。または、内部では、数十または数百のクラスが相互に作用して、イメージ全体を頭の中に保持することが実質的に不可能になっている可能性があります。

実験できます。

  • OpenCVで興味のある部分を見つけてください。インターフェイスのドキュメントを読みます。基本を理解してライブラリを効果的に使用できるようになるまでにはどのくらい時間がかかりますか?

  • 次に、実装を確認します。インターフェイスから直接呼び出されるクラスの数はいくつですか?これらのクラスのそれぞれからいくつのクラスが呼び出されますか?コードは何行ありますか?メソッドはいくつありますか?脳でスタックオーバーフローが発生する前に、このすべてのソースコードを探索するのにどのくらい時間がかかりますか?


1
主な理由、それは、更新に非常に時間がかかる理由であり、セキュリティホールが発見されずに長い間続く可能性があるのは、理由です。Javaプログラミングコースの最初の2学期のJavaソースを調べてみました。他に2つ以上のクラスを呼び出さないクラスは1つもなかったと思います。彼らが呼び出したクラスは、任意の数のクラスも呼び出しました。私は、コードをたどって最終的な完成までたどることができませんでした。それは単に時間がかかりすぎて、私がどこにいるのかを追跡するのが難しすぎました
Progfram

0

javadocのみを読むことが最善の方法である理由、またはその理由はありますか?

JavaDocが古くなっている、または不良である可能性があることは完全に正しいですが、IDEのコードよりもホールセールを読み取るための形式の方がよくなる傾向があります。さらに重要なことに、それは自然言語です。これは次の2つの場合に重要です。

  1. コードを読むことに慣れていない人々。たとえば、大学生は、学習過程にあるコードを理解しようとするよりも、関数の自然言語の説明を読む方がより良い結果をもたらすことが多いでしょう。
  2. 主要言語として英語(または少なくとも音声アルファベットを使用する言語)を使用しない人々。JavaDocは、識別子では使用できない文字を処理できるため、それらのユーザーに何が起こっているかをより適切に説明できます。特にJavaDocには、ドキュメントローカライズする機能さえあるようです

とはいえ、私は可読コードをかなり信じています。経験豊富な開発者にとって、コードを読むことは、そのオプションが利用可能であれば、ほとんどの場合、より良いアプローチになると期待しています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.