数か月後にコードの読み取りと閲覧を最小限に抑えるようにコードを文書化したい。
さまざまな種類のドキュメントがあることを知っています(ソースコードと外部、シーケンス図など)。
コードを効率的に文書化する方法を知りたいので、数か月後にコードを確認したいとき、コードの読み取りとコードフローの理解に費やす時間が少なくなります。
数か月後にコードの読み取りと閲覧を最小限に抑えるようにコードを文書化したい。
さまざまな種類のドキュメントがあることを知っています(ソースコードと外部、シーケンス図など)。
コードを効率的に文書化する方法を知りたいので、数か月後にコードを確認したいとき、コードの読み取りとコードフローの理解に費やす時間が少なくなります。
回答:
私は、他の答えが推奨したことのいくつかに同意しないことを認めなければならないので、2セントを投げるつもりです。
ドキュメンテーションは、コードを読んでいる見知らぬ人にとって非常に役立ちます。通常、多くのことはすぐに読んで理解できるほど冗長ではないので、何をしているのかを説明する必要があります。
編集:コメントセクションの議論は何か正しいことを指摘しました。通常、悪いコメントを書くときは過剰コメントをします。
あなたの作品にコメントすることは正確かつ最小限でなければなりませんが、私の意見では、間違いなく存在するべきです。コードの15行ごとに少なくともコメント。たとえば、コードのブロックの上に、実行していることに関する行を追加します。
def login(username: str, password: str, create_session: bool = True):
# Filter the user we need from the database
hash = md5(password)
users = db.table("users", db_entities.USER)
results = [x for x in users.query(lambda c: c.get("username") == username and c.get("password_hash") == hash)]
if len(results) == 0:
return None, None
else:
# Create a login session record in the database.
if create_session:
sessions = db.table("sessions", db_entities.SESSION)
ses = sessions.new()
ses.set("username", username) \
.set("expiery", 31536000 + time.time())
sessions.update(ses)
return results[0], ses
else:
return results[0], None
なぜ、何をしているかを説明する最小限のコメントは、コード全体で非常に役立ちます。次のような答えには同意しません
コメントを含むコードに出くわした場合、最悪の事態に備えます。コードが悪い可能性が高く、正直なところ、コメントも悪い可能性が高いです。
多くの場合、優雅に、良いコードが文書化されています。悪いプログラマーが「わかりました、私のコードは悪いです。わかりやすくするためにいくつかの文章を追加しましょう」のようなドキュメントを見るのは事実です。
はい、これはかなり頻繁に発生しますが、きれいなコードを書く優秀なプログラマーは、自分のコードに戻り、関数をそのように動作させたい理由、またはなぜそれを必要としたのかを理解したいことも事実です少し冗長に思える行など
はい、明白なことを説明するコメント、不明瞭なコメント、「このコードが文書化されていることを確認するためにまとめられたコメント」はコード臭です。彼らはコードを読むのを難しくし、いらいらさせます。(以下に例を追加)
# Logging into Gmail when the module is imported
_client = login()
def get_client():
global _client
return _client
明確化の例:「たわごと、Sherlock。
_client = login()
メールサービスにログインしますか?OMG!」より明確な説明:
login()
メソッドはlogin()
、上記の例のメソッドとは関係ありません。
しかし、基準と一致し、理由ではなく理由を説明し、正しい質問に答えるコメントは、非常に(非常に)役に立ちます。
してはいけないことの1つは(そして、もっと大きく書くことができるなら)、コードの同じ行にコメントを書くことです。それはコメントを非常に行固有にし、コードをコメントする目的を完全に逃します。
たとえば、悪いインラインコメント:
outer = MIMEText(details["message"]) # Constructing a new MIMEText object
outer["To"] = details["to"] # Setting message recipient
outer["From"] = "xAI No-Reply" # Setting message sender
outer["Subject"] = details["subject"] # Setting message subject
outer.preamble = "You will not see this in a MIME-aware mail reader.\n" # I don't know what I'm doing here, I copied this from SO.
msg = outer.as_string() # Getting the string of the message
_client = details["client"] # Assigning the client
_client.sendmail(SENDER, details["to"], msg) # Sending the mail
コメントなしでこのコードを読みやすく理解すると、コードが乱雑で読みにくくなります。
代わりに、コード内のコメントをコードのブロックの上に配置し、コードブロックの読み取り中に発生する可能性のある重要な質問に答える必要があります。
# Constructing the email object with the values
# we received from the parameter of send_mail(details)
outer = MIMEText(details["message"])
outer["To"] = details["to"]
outer["From"] = "xAI No-Reply"
outer["Subject"] = details["subject"]
outer.preamble = "You will not see this in a MIME-aware mail reader.\n"
msg = outer.as_string()
# Sending the mail using the global client (obtained using login())
_client = details["client"]
_client.sendmail(SENDER, details["to"], msg)
はるかに明確ですよね?これで、login()
関数を使用し、使用send_mail()
したすべてのパラメーターを提供する必要があることもわかりました。少し助けになりますが、まだ一つ欠けていることがあります。
広く議論されています。あなたは常にあなたの読者にあなたの機能が何であるか、なぜ、何をするのかを知らせるべきです。それがどのように行われるかは、これはドキュメントに属するのではなく、関数の脚注に属する可能性があります。
パラメーターが何であるか、また特定の方法でパラメーターを取得/作成する場合は、明確に記述する必要があります。関数が返すもの、その使用方法などを宣言する必要があります。
繰り返しますが、それは私のコードを書いている間の私の意見と方法論です。それらだけでなく、これらは私が他の答えに同意できなかったもののほんの一部です。ああ、もちろん、コメントだけでコードが読み取られるのではなく、コード自体が読み取られます。わかりやすく保守可能なクリーンなコードを作成します。コーディング中に自分の将来について考えてください;-)
IMOの最良のドキュメントは、実際に必要のないドキュメントです。また、ドキュメントやコメントを書くのも嫌いです。
それが言われていると:
n
、代わりに使用numberOfItemsFound
します。numberOfItemsFound
ただし、かなり冗長です。冗長すぎることも問題です。
コードをドキュメントとして扱う
コードは主要なドキュメントです。結果のアプリ、ライブラリなどが実際に何をするかを正確に記述します。そのため、そのコードの理解をスピードアップする試みは、コード自体から始めなければなりません。
読み取り可能なコードの記述方法についてはたくさん書かれていますが、重要な点は次のとおりです。
n
、ループに適しています。範囲が広いアイテムには、より長い説明的な名前が必要です)。UpdtTbl
場合、指定されたルールでテーブルを更新することを説明するコメントと共に使用しないでくださいUpdateTableContentsWithSuppliedRules
。コードを読むのが上手になる
コードの読み方は、それがどれほど単純であるかに関係なく、学んだスキルです。誰もコードを読むのが得意ではありません。練習が必要です。たくさんの練習。そのため、たとえば、単にGithubにアクセスするのではなく、Githubなどにアクセスして、使用するライブラリのコードを読み取ります。読むコードを見つけて読んでください。
コメントはコードの匂いです
そうしてはじめて、他の種類のドキュメントを入手できます。まず、前述のように、コメントを避けます。コメントを含むコードに出くわした場合、最悪の事態に備えます。コードが悪い可能性が高く、正直なところ、コメントも悪い可能性が高いです。コードを使ってうまくコミュニケーションできない人は、自然言語を使ってもっとうまくコミュニケーションできるとは考えられません。
自動生成されたAPIドキュメントに注意してください
また、自動生成されたAPIドキュメントにも注意してください。そのようなドキュメントを読むことに頼らなければならないのは、あなたのコードが読みにくいからでしょう。繰り返しになりますが、コードを単純にして、直接読むことができます。
テストもドキュメントです
テストもドキュメントです。したがって、単体テストを雑用として扱わないでください。コードがどのように機能し、どのように使用されるかについて、他の人とコミュニケーションをとる方法(6か月後の自己をここに含める)として扱います。
役立つ場合は絵を描く
UMLが好きなら、ぜひとも自分に適したツールを見つけて、コードからUML図を生成してください。これを使用してコードを生成しようとすることはありません。それは設計ツールとしては良くなく、結果として恐ろしいコードになってしまいます。
「1000ft」ビュー文書を持っている
最後に、概要ドキュメントを作成します。アプリは何をしますか?それはどうしますか?他のどのシステムに接続しますか?そういうもの。ただし、ここではコード構造を説明しようとしないでください。コードにそれをさせてください。このドキュメントで、最初にコードを書いた理由を思い出させてください。
add 1 to i
コメントには意味がないことに同意しますが、コメントはコードが何をするのかを説明する必要があります。たとえば、コードでif (!something.Exists()) {...}
は次のようなコメントを使用できます // something exists only when (explanation of the broader scenario)
。
// increment x
x++;
ないコメントのかなりの部分を見てきましたが、赤ちゃんを風呂水で捨てて、コメントが常に悪いと宣言するのは間違っています。たとえば、フォームのコメント// this case should never happen because xyz
throw exception "unreachable"
。
//XXX: Not using straight-forward method Foo here because ...
。このようなコメントは非常に価値がありますが、明らかな理由でコードで伝えることは不可能です。
非常に技術的な領域にいる場合を除き、コードに関するほとんどの質問は「方法」ではなく「理由」または「内容」に関するものです。
そのため、人々がコードを見る必要を減らす方法は、簡単な説明を書くことです。これの利点は、説明の概要を非常に簡単に編集できることと、これがはるかにアクセスしやすいことです。(コードを見ることを許可されない/許可されない人々にも)。
人々が技術的であっても、カバーレターはどこで何かを探すべきかのガイダンスを提供する必要があります。
シンプルで極めてミニマルなポイント:
私が通常得る最大の速度の向上は、それぞれがコンパイルして動作する中間ステップを表す個別のコミットを構築することです。
したがって、特定の機能を実装するために関数に新しいパラメーターを導入する必要がある場合、宣言、定義、およびすべての呼び出しサイトでパラメーターを追加するだけの1つのコミットがあります。次に、次のコミットで機能が導入され、3番目のコミットで新しい機能を使用する呼び出しサイトが更新されます。
これは簡単に確認できます。純粋に機械的な変更をすばやく一目で確認でき、邪魔にならないからです。
同様に、コードを再フォーマットする場合、常に別個のコミットにする必要があります。
既存の回答には1つまたは2つの明らかな相違点がありますが、強調する場合のみ、誰がどこから来たのかが明確になるように通常のアドバイスを要約します。
一方で、もし何か間違っているとしたら、おそらく逆に、コメントを使用することはほとんどありません。コードレビュー担当者は、バランスが間違った場所にあるかどうかを通知しますが、上記の3点計画に従うように意識的に努力すれば、とにかく最適に近いでしょう。