Names and Signatures are not full documentation
// Copyright 2025 Google LLC
// SPDX-License-Identifier: Apache-2.0
// bad
/// Returns a future that resolves when operation completes.
fn sync_to_server() -> Future<Bool>;
// good
/// Sends local edits to the server, overwriting concurrent edits
/// if any happened.
fn sync_to_server() -> Future<Bool>;
// bad
/// Returns an error if sending the email fails.
fn send(&self, email: Email) -> Result<(), Error>;
// good
/// Queues the email for background delivery and returns immediately.
///
/// Returns an error immediately if the email is malformed.
fn send(&self, email: Email) -> Result<(), Error>;
-
Motivation: API designers can over-commit to the idea that a function name and signature is enough documentation.
-
Again, names and types are part of the documentation. They are not always the full story!
-
Consider the behavior of functions that are not covered by the name, parameter names, or signature of that function.
-
It is not obvious that
sync_to_server()could overwrite something (leading to a data loss), so document that. -
In the email example, it is not obvious that the function can return success and still fail to deliver the email.
-
-
Use comments to disambiguate. Nuanced behaviors, behaviors that users of an API could trip up on, should be documented.