2017-01-09 7 views
0

私は以下の方法があります:「コードウォンを見て誰列挙型またはブール値?

element.publish(this, property.getId(), true) 

または

element.publish(this, property.getId(), false) 

:私はいくつかのクラスからメソッドを呼び出すと

public void publish(Object source, long id, boolean status) { 
} 

が、それはこのようになります彼らがその方法を見るまで、真実と偽りが何を意味するのかを知ることはできません。私はブール値の代わりに列挙型を使うことを考えていました。

あなたは何が正しいとクリーンな方法だと思いますか?

+0

私は完全なコンテキストを持っていませんが、オブジェクトのフィールドの1つとして 'status'を設定しないのはなぜですか? 'id'も同じです!ユーザが単に実装の詳細を心配することなく 'element.publish(this)'を行うことができれば、もっと良い "ユーザ体験"になります。さらに、「状態」はあまり言わない。 'status'の代わりに' publishStatus'または 'enabled'を使用することを検討してください。 – alfasin

+1

コンテキストのために(おそらくあなたの答えをよりよく保持するでしょう):http://softwareengineering.stackexchange。 com/q/147977/54997 – Makoto

+2

この 'status'パラメータは何のために使われますか?それはかなり非難的な名前です。 –

答えて

0

ここでは、列挙型を使用するとコードの明快さのための素晴らしいアイデアのように思えます。

public enum PublishStatus { 
    OK, 
    LOG, 
    ERROR 
    // ... 
} 

読みやすくするために長い道のりを行くだろう:パラメータ名statusことを考えると(isValid、たとえば、とは違って)、列挙型などが真と偽の値の違いを説明していません。

1

まあ、メソッドシグネチャのパラメータにブール値を使用することは、決して良いことではありません。代替:

1-代わりにパラメータとしてEnumを作成して渡します。

2受信するパラメータに応じて、このパラメータを使用してクラスを作成できます。

3異なる方法で、オーバーロードを行います。

また、説明的な名前を付けると便利です。

+0

これはかなり徹底的な声明です!私は、パラメータが真偽に直感的に役立つ2つのオプションを持っていることを数回考えることができます。場合によっては、たとえ引数の名前を見ていなくても、おそらく自分の振る舞いを推測することができるような場合もあります。 'rmdir(String、boolean)'は非常に素早く気になる例です。私はおそらく、それぞれの引数が何であるかを、型だけで推測することができます。あなたが私に 'rmdir(String path、boolean recursive)'の完全な署名をくれたなら、それは間違いありません。 – yshavit

+0

また、変数にわかりやすい名前をつけることもできます: 'public static final boolean STATUS_ON = true;'を使用し、 'element.publish(this、property.getId()、STATUS_ON)'を使用します。 ...パラメータとしてのbooleanはおそらくコードの匂いであることは広く知られていますが、フラグのようないくつかのケースが必要です。ちなみに、 'rmdir(path、true)'と表示されていて、その署名を知らないのなら、 '真実'が何であるか知っていますか?これは簡単な例ですが、行数が多いコードでは、読みやすさが影響を受ける可能性がありますが、署名を見るだけで時間がなくなります。 –

+1

も参照してください。https://martinfowler.com/bliki/FlagArgument.html、http://softwareengineering.stackexchange.com/q/147977/54997および本書の41ページ:https://www.amazon.com/クリーンコードハンドブック - ソフトウェア - 職人技/ dp/0132350882 –