Quale codice è migliore:
// C++
void handle_message(...some input parameters..., bool& wasHandled)
void set_some_value(int newValue, int* oldValue = nullptr)
// C#
void handle_message(...some input parameters..., out bool wasHandled)
void set_some_value(int newValue, out int oldValue)
o
bool handle_message(...some input parameters...) ///< Returns -1 if message was handled
//(sorry, this documentation was broken a year ago and we're too busy to fix it)
int set_some_value(T newValue) // (well, it's obvious what this function returns, so I didn't write any documentation for it)
Il primo non ha documentazione, ma non ne ha bisogno. È un codice di auto-documentazione. Il valore di uscita indica chiaramente cosa significa, ed è davvero difficile apportare una modifica come questa:
- void handle_message(Message msg, bool& wasHandled) {
- wasHandled = false;
- if (...) { wasHandled = true; ...
+ void handle_message(Message msg, int& wasHandled) {
+ wasHandled = -1;
+ if (...) { wasHandled = ...;
Quando il codice utilizza valori di ritorno, è facile cambiarli e lasciare i commenti interrotti:
/// Return true if message was handled
- bool handle_message(Message msg) {
+ int handle_message(Message msg) {
...
- return true;
+ return -1;
La maggior parte dei compilatori non controlla (e non può) la documentazione che è scritta nei commenti. I programmatori tendono anche a ignorare i commenti quando modificano il codice.
Quindi la domanda è:
se una routine ha un singolo valore di uscita,
dovrebbe essere una procedura con parametro di output auto-documentante ben chiamato,
o dovrebbe essere una funzione che restituisce un valore senza nome con un commento che lo descrive?