正しくも間違って、私は現在、コードを可能な限り堅牢にするように常に努めるべきだと考えています。これは、今は役に立たないことがわかっている冗長コード/チェックを追加することを意味しますが、 x数年後かもしれません。
たとえば、私は現在、次のコードを含むモバイルアプリケーションに取り組んでいます。
public static CalendarRow AssignAppointmentToRow(Appointment app, List<CalendarRow> rows)
{
//1. Is rows equal to null? - This will be the case if this is the first appointment.
if (rows == null) {
rows = new List<CalendarRow> ();
}
//2. Is rows empty? - This will be the case if this is the first appointment / some other unknown reason.
if(rows.Count == 0)
{
rows.Add (new CalendarRow (0));
rows [0].Appointments.Add (app);
}
//blah...
}
特にセクション2を見ると、セクション1が当てはまる場合、セクション2も当てはまることがわかります。セクション1がfalseになり、セクション2がtrueと評価される理由については、何も考えられません。これにより、2番目のif
ステートメントが冗長になります。
ただし、将来、この2番目のif
ステートメントが実際に必要となるケースが、既知の理由で存在する可能性があります。
最初にこれを見て、将来を念頭に置いてプログラミングしていると思う人もいるかもしれませんが、これは明らかに良いことです。しかし、この種のコードが私から「隠された」バグを持っているいくつかのインスタンスを知っています。つまり、実際に実行する必要があるときに、関数xyz
が実行している理由を理解するのにさらに時間abc
がかかりましたdef
。
一方、この種のコードにより、新しい動作でコードを強化するのがはるかに簡単になった事例も多数あります。これは、関連するすべてのチェックが適切に行われていることを確認する必要がないためです。
この種のコードに関する一般的な経験則のガイドラインはありますか?(これが良い練習か悪い練習かを聞いてみたいと思いますか?)
NB:これはこの質問と似ていると考えられますが、その質問とは異なり、期限がないと仮定して回答をお願いします。
TLDR:将来的に潜在的な堅牢性を高めるために、冗長コードを追加する必要がありますか?
if(rows.Count == 0)
決して起こらないことがわかっている場合は、例外が発生したときに例外を発生させることができます。そして、仮定が間違った理由を確認します。
rows
ヌルになるのでしょうか?少なくとも.NETの場合、コレクションがnullになるのに正当な理由はありません。 空、確かですが、nullではありません。rows
nullの場合、例外をスローします。これは、呼び出し側によるロジックの失効があることを意味するためです。