私がよく目にする最もひどく冗長なコード構成は、コード シーケンスの使用を伴います。
if (condition)
return true;
else
return false;
単純に書くのではなく
return (condition);
Pascal や C から PHP や Java まで、あらゆる種類の言語でこの初歩的なエラーを見てきました。コードレビューで、他にどのような構造にフラグを立てますか?
私がよく目にする最もひどく冗長なコード構成は、コード シーケンスの使用を伴います。
if (condition)
return true;
else
return false;
単純に書くのではなく
return (condition);
Pascal や C から PHP や Java まで、あらゆる種類の言語でこの初歩的なエラーを見てきました。コードレビューで、他にどのような構造にフラグを立てますか?
if (foo == true)
{
do stuff
}
私はそれを行う開発者に、そうあるべきだと言い続けています
if ((foo == true) == true)
{
do stuff
}
しかし、彼はまだヒントを得ていません。
if (condition == true)
{
...
}
それ以外の
if (condition)
{
...
}
編集:
またはさらに悪いことに、条件付きテストを好転させます。
if (condition == false)
{
...
}
これは次のように簡単に読み取れます
if (condition) then ...
ソース管理の代わりにコメントを使用する:-
関数を削除する代わりにコメントアウトまたは名前変更し、そのソース管理を信頼することで、必要に応じてコメントを取り戻すことができます。
-単に変更を加えてソース管理に責任を負わせるのではなく、「RWF変更」などのコメントを追加します。
どこかで私はこのことを見つけました。これはブール値の冗長性の頂点であることがわかりました。
return (test == 1)? ((test == 0) ? 0 : 1) : ((test == 0) ? 0 : 1);
:-)
冗長コード自体はエラーではありません。しかし、あなたが本当にすべてのキャラクターを救おうとしているのなら
return (condition);
冗長でもあります。あなたは書ける:
return condition;
C以外の言語での割り当てとは別に宣言する:
int foo;
foo = GetFoo();
void myfunction() {
if(condition) {
// Do some stuff
if(othercond) {
// Do more stuff
}
}
}
それ以外の
void myfunction() {
if(!condition)
return;
// Do some stuff
if(!othercond)
return;
// Do more stuff
}
私はかつてこれを繰り返し行った男がいました:
bool a;
bool b;
...
if (a == true)
b = true;
else
b = false;
最後に無駄に戻る:
// stuff
return;
}
nullの恐れ(これも深刻な問題につながる可能性があります):
if (name != null)
person.Name = name;
冗長なif(elseを使用していない):
if (!IsPostback)
{
// do something
}
if (IsPostback)
{
// do something else
}
冗長チェック(Splitがnullを返すことはありません):
string[] words = sentence.Split(' ');
if (words != null)
チェックの詳細(ループする場合、2番目のチェックは冗長です)
if (myArray != null && myArray.Length > 0)
foreach (string s in myArray)
そして、ASP.NETの私のお気に入り:DataBind
ページをレンダリングするためにコード全体に散らばっています。
コピーと貼り付けの冗長性:
if (x > 0)
{
// a lot of code to calculate z
y = x + z;
}
else
{
// a lot of code to calculate z
y = x - z;
}
それ以外の
if (x > 0)
y = x + CalcZ(x);
else
y = x - CalcZ(x);
またはさらに良い(またはより難解な)
y = x + (x > 0 ? 1 : -1) * CalcZ(x)
私が目にする最も一般的な冗長コード構造は、プログラムのどこからも呼び出されないコードです。
もう 1 つは、使用する意味がない場合に使用されるデザイン パターンです。たとえば、「new Bob()」とだけ書くのではなく、どこにでも「new BobFactory().createBob()」と書きます。
未使用の不要なコードを削除すると、システムの品質とチームのメンテナンス能力が大幅に向上します。システムから不要なコードを削除することを考えたことのないチームにとって、この利点はしばしば驚くべきものです。私は以前、チームと一緒に座って、システムの機能を変更せずにプロジェクトのコードの半分以上を削除するというコード レビューを実行しました。彼らは気分を害するだろうと思っていましたが、その後、デザインのアドバイスやフィードバックを頻繁に求めてきました.
文字列で .tostring を使用する
次のオプションのいずれかの代わりに、ステートメントを関数の最初のexit
ステートメントとして配置して、その関数の実行を無効にします。
as first ステートメントを使用するexit
と、見つけるのが非常に難しくなりますが、簡単に読み直すことができます。
スタックではなくヒープに要素を割り当てます。
{
char buff = malloc(1024);
/* ... */
free(buff);
}
それ以外の
{
char buff[1024];
/* ... */
}
また
{
struct foo *x = (struct foo *)malloc(sizeof(struct foo));
x->a = ...;
bar(x);
free(x);
}
それ以外の
{
struct foo x;
x.a = ...;
bar(&x);
}
私はよく次のことに遭遇します:
function foo() {
if ( something ) {
return;
} else {
do_something();
}
}
しかし、他の人はここでは役に立たないことを彼らに伝えるのは助けにはなりません。それはどちらかでなければなりません
function foo() {
if ( something ) {
return;
}
do_something();
}
または-do_something()の前に実行されるチェックの長さに応じて:
function foo() {
if ( !something ) {
do_something();
}
}
悪夢のようなコードレビューから.....
char s[100];
に続く
memset(s,0,100);
に続く
s[strlen(s)] = 0;
たくさんの厄介なもので
if (strcmp(s, "1") == 0)
コードについて散らかっています。
動作を設定するときに配列を使用する。挿入する前に、すべてをチェックして配列に含まれていないことを確認する必要があります。これにより、コードが長くなり、遅くなります。
冗長な .ToString() 呼び出し:
const int foo = 5;
Console.WriteLine("Number of Items: " + foo.ToString());
不要な文字列フォーマット:
const int foo = 5;
Console.WriteLine("Number of Items: {0}", foo);