メソッドの引数に名前を付ける変数を定義するのは良い習慣ですか?


73

読みやすくするために、次のコードのような関数を呼び出すときに一時変数を定義することがよくあります

var preventUndo = true;
doSomething(preventUndo);

これに対するこれの短いバージョンは、

doSomething(true);

しかし、コードに戻ったとき、私はしばしば何をtrue指しているのだろうと思います。この種の難問に慣習はありますか?


5
何らかのIDEを使用していますか?ほとんどの場合、呼び出している関数に対してパラメーターが何であるかを示す何らかの方法がありますが、これはこれを行う必要性をいくらか無効にします。
マシューシャーリー

4
私はIDEを使用していませんが、それでもヒントには何らかのアクション(マウスオーバーまたは行への移動)が必要になると思います。私はコードを見ているだけで、自分のコードが何をしているのかを知りたいです。
methodofaction

11
言語がサポートしていれば次のような列挙を使用することができますdoSomething( Undo.PREVENT )
ジェームズ・P.

4
ただし、定義することはできますUndo = { PREVENT = true, DONT_PREVENT = false }。しかし、JavaScriptでは、慣例では次のようにfunction myFunction( mandatoryArg1, mandatoryArg2, otherArgs ) { /*...*/ }なりmyFunction( 1, 2, { option1: true, option2: false } )ます。
-xavierm02

6
それは間違いなく言語に依存します。これはPythonのであれば、例えば、私は例えば、単にキーワード引数を使用することをお勧めしdoSomething(preventUndo=True)
ジョエル・コルネット

回答:


117

変数の説明

あなたのケースは、変数リファクタリングを説明する紹介の例です。要するに、説明変数は厳密に必要なものではありませんが、読みやすさを高めるために、何かに明確な名前を付けることができます。

良質のコードは意図を読者に伝えます。そして、プロの開発者として読みやすさと保守性があなたの一番の目標です。

したがって、お勧めする経験則は次のとおり です。パラメーターの目的がすぐに明らかでない場合は、変数を使用して適切な名前を付けてください。 これは一般的には良い習慣だと思います(悪用​​されない限り)。簡単で不自然な例を次に示します-考慮してください:

editButton.Enabled = (_grid.SelectedRow != null && ((Person)_grid.SelectedRow).Status == PersonStatus.Active);

対わずかに長いが、間違いなく明確:

bool personIsSelected = (_grid.SelectedRow != null);
bool selectedPersonIsEditable = (personIsSelected && ((Person)_grid.SelectedRow).Status == PersonStatus.Active)
editButton.Enabled = (personIsSelected && selectedPersonIsEditable);

ブールパラメータ

実際の例では、APIのブール値がしばしば悪い考えである理由を強調しています。呼び出し側では、何が起こっているのかを説明するために何もしません。考慮してください:

ParseFolder(true, false);

これらのパラメーターの意味を調べる必要があります。それらが列挙型である場合、より明確になります。

ParseFolder(ParseBehaviour.Recursive, CompatibilityOption.Strict);

編集:

見出しを追加し、2つの主要な段落の順序を入れ替えました。これは、あまりにも多くの人がブール値パラメーターの部分に焦点を合わせていたためです(公平に言えば、最初の段落でした)。また、最初の部分に例を追加しました。


28
名前付きパラメーター(.NET Frameworkの名前付き引数)を使用しない限り、その場合doSomething(preventUndo: true);は十分に明確です。また、APIのすべてのブール値の列挙型を作成しますか?マジ?
アルセニムルゼンコ

12
@MainMa:使用している言語が名前付き引数をサポートするのに十分でない場合、enumを使用するのが適切なオプションです。これは、どこにでも列挙型を体系的に導入する必要があるという意味ではありません。
ジョルジオ

18
@MainMa-その質問に答えるために、ポイントは本当にあなたがあなたのAPI(少なくとも、あなたのパブリックのもの)にブール値を持つべきではないということです。名前付き引数構文に変更する必要がありますが、これは間違いなく慣用的ではありません(執筆時点)。いずれの場合でも、ブールパラメーターはほとんど常にメソッドが2つのことを行うことを意味し、呼び出し元に選択してください。しかし、私の答えのポイントは、コードで変数の説明を使用しても問題はないということです。実際には非常に良い習慣です。
ダニエルB

3
これはC#言語の永続的な部分ですが、それ以上に「主流の受け入れ」が必要ですか?構成体をまだ知らない人(つまり、C#開発者がC#のドキュメントさえ読んでいないことを意味します)にとっても、その構成が何をするのかは明らかです。
ネイトCK

3
MSが各バージョンで追加したすべての新しい内容の素晴らしい要約をリリースするのはそのためです。数年ごとにmsdn.microsoft.com/en- us / library / bb383815%28v = vs.100%29.aspx
ネイトCK

43

必要のないコードを書かないでください。

doSomething(true)理解するのが難しい場合は、コメントを追加する必要があります。

// Do something and prevent the undo.
doSomething(true);

または、言語がサポートしている場合は、パラメーター名を追加します。

doSomething(preventUndo: true);

それ以外の場合は、IDEを使用して、呼び出されたメソッドの署名を取得します。

ここに画像の説明を入力してください

役に立つ場合

追加の変数を追加すると便利です。

  1. デバッグ目的:

    var productId = this.Data.GetLastProductId();
    this.Data.AddToCart(productId);
    

    同じコードを1行で記述できますが、製品IDが正しいかどうかを確認するために製品をカートに追加する前にブレークポイントを配置する場合は、1行ではなく2行を記述することをお勧めします。

  2. 多数のパラメーターを持つメソッドがあり、各パラメーターが評価から取得される場合。一行で、これは全く読めなくなるかもしれません。

    // Even with indentation, this is unreadable.
    var doSomething(
        isSomethingElse ? 0 : this.getAValue(),
        this.getAnotherOne() ?? this.default,
        (a + b + c + d + e) * f,
        this.hello ? this.world : (this.hello2 ? this.world2 : -1));
    
  3. パラメータの評価が複雑すぎる場合。私が見たコードの例:

    // Wouldn't it be easier to have several if/else's (maybe even in a separate method)?
    do(something ? (hello ? world : -1) : (programmers ? stackexchange : (com ? -1 : 0)));
    

他の場合はなぜですか?

単純な場合に追加の変数を作成しないのはなぜですか?

  1. パフォーマンスへの影響のためではありません。これは、自分のアプリを微最適化する初心者開発者の非常に間違った仮定です。コンパイラーは変数をインライン化するため、ほとんどの言語でパフォーマンスへの影響はありません。コンパイラーがそれを行わない言語では、手動でインライン化することで数マイクロ秒の時間がかかる場合がありますが、それは価値がありません。しないでください。

  2. ただし、変数に付けた名前をパラメーターの名前に分離するリスクがあるためです。

    例:

    元のコードは次のとおりだとしましょう:

    void doSomething(bool preventUndo)
    {
        // Does something very interesting.
        undoHistory.removeLast();
    }
    
    // Later in code:
    var preventUndo = true;
    doSomething(preventUndo);
    

    後に、開発者はdoSomething最近、元に戻す履歴に2つの新しい方法が導入されたことに気付きました。

    undoHistory.clearAll() { ... }
    undoHistory.disable() { ... }
    

    今、preventUndoあまり明確ではないようです。最後のアクションのみが防止されるということですか?または、ユーザーが元に戻す機能を使用できなくなることを意味するのでしょうか?または、元に戻す履歴がクリアされますか?より明確な名前は次のとおりです。

    doSomething(bool hideLastUndo) { ... }
    doSomething(bool removeAllUndo) { ... }
    doSomething(bool disableUndoFeature) { ... }
    

    だから今、あなたは持っています:

    void doSomething(bool hideLastUndo)
    {
        // Does something very interesting.
        undoHistory.removeLast();
    }
    
    // Later in code, very error prone, while the signature of the method is clear:
    var preventUndo = true;
    doSomething(preventUndo);
    

列挙型はどうですか?

列挙型を使用することを提案した人もいました。差し迫った問題を解決する一方で、より大きな問題を作成します。見てみましょう:

enum undoPrevention
{
    keepInHistory,
    prevent,
}

void doSomething(undoPrevention preventUndo)
{
    doTheJob();
    if (preventUndo == undoPrevention.prevent)
    {
        this.undoHistory.discardLastEntry();
    }
}

doSomething(undoPrevention.prevent);

それに関する問題:

  1. コードが多すぎます。if (preventUndo == undoPrevention.prevent)?マジ?私はそのようなものをif毎回書きたくありません。

  2. 同じ列挙型を別の場所で使用している場合、列挙型に要素を追加するのは非常に魅力的です。このように変更した場合はどうなりますか:

    enum undoPrevention
    {
        keepInHistory,
        prevent,
        keepButDisable, // Keeps the entry in the history, but makes it disabled.
    }
    

    これからどうなりますか?ウィルdoSomething方法作業は予想通り?これを防ぐには、最初からこの方法でこのメソッドを記述する必要があります。

    void doSomething(undoPrevention preventUndo)
    {
        if (![undoPrevention.keepInHistory, undoPrevention.prevent].contains(preventUndo))
        {
            throw new ArgumentException('preventUndo');
        }
    
        doTheJob();
        if (preventUndo == undoPrevention.prevent)
        {
            this.undoHistory.discardLastEntry();
        }
    }
    

    ブール値を使用するバリアントは、見栄えがし始めます!

    void doSomething(bool preventUndo)
    {
        doTheJob();
        if (preventUndo)
        {
            this.undoHistory.discardLastEntry();
        }
    }
    

3
「コードが多すぎます。if(preventUndo == undoPrevention.prevent)?真剣に?!そのようなifsを毎回書きたくありません。」:古き良きswitch文の使用はどうですか?また、ブール値を使用する場合は、とにかくifステートメントが必要です。正直なところ、この点に対するあなたの批判は、私には少し人工的なもののようです。
ジョルジオ

1
ここに代替ソリューションがありません。彼は何も言わずに真と偽に固執し、IDE(彼は使用しない)に頼るべきだと言っていますか?コメントは変数名のように腐る可能性があります。
セキュア

2
@superM:呼び出しにのみ使用される一時変数の名前を変更するのはそれほど難しくありません。列挙型の名前が変更された場合は、呼び出しコードが実行されなくなり、顔にエラーがスローされるため、さらに優れています。関数の機能が列挙型拡張によって根本的に変更された場合は、とにかく、すべての呼び出しを再確認して、さらに正確にする必要があります。値の変更について考えることすらしません。たとえば、署名でに否定するpreventUndoことallowUndoです
セキュア

4
@superMがコメントをコードと同期させておくと、矛盾を探す際にコンパイラーの助けが得られないため、実際に非常にトラブルを起こしやすくなります。
-Buhb

7
「... IDEに依存して、呼び出されたメソッドのシグネチャを提供します」-これは、コードを記述しているときは役立ちますが、コードを読んでいるときはあまり役立ちません。クラスのコードを読むとき、それを見ているだけでそれが何をしているのか知りたいです。読みやすくするためにIDEに依存する必要がある場合、コードは自己文書化されていません。
フィル

20

また、ブールフラグを使用してメソッドを記述しないでください。

ロバートC.マーティンは、彼の著書Clean Code(ISBN-13 978-0-13-235088-4)で、「ブール値を関数に渡すことは本当にひどい習慣だ」と言っています。

彼を言い換えると、真/偽の切り替えがあるという事実は、メソッドが2つの異なること(つまり、「元に戻す」と「元に戻す」を行う)を行う可能性が高いことを意味しているため、 2つの異なるメソッドに分割されます(内部的に同じものを呼び出す場合があります)。

DoSomething()
{...

DoSomethingUndoable()
{....

7
そのロジックにより、単一のHotDogコンストラクターは、HotDogWithMustardRelishKrautOnion()、HotDogWithMustardNorelishKrautOnion()などの約16の異なるメソッドである必要があります。または、単純なHotDogWithOptions(int options)で、オプションをビットフィールドとして解釈することもできますが、その後、いくつかの異なることを行う1つのメソッドに戻ります。したがって、最初のオプションを使用する場合、そうでない場合はブール型パラメーターであることに基づいて呼び出すコンストラクターを整理するために、大きな条件を作成する必要がありますか?Qがintを使用する場合、このAはQに答えません
カレブ

4
すべての答えを読んで私のコードを見て、これが正しい方法であるという結論に達しました。doSomethingUndoable()変更をキャプチャしてから呼び出すことができますdoSomething()
-methodofaction

1
したがって、多くの処理を実行する関数があり、完了時に電子メールを送信するオプションがある場合、電子メールの送信を妨げるブール引数を使用しないでください。別の関数を作成する必要がありますか?
yakatz

2
@Calebこの場合、ホットドッグを作成して成分を1つずつ追加するか、厳密に型指定された言語で、すべてのブール値フラグを設定するHotDogSettingsオブジェクトを渡します。維持するのが悪夢である15個の異なるtrue / falseフラグはありません。コードは、アプリケーションのコストの80%であるため、記述ではなくメンテナンスに関するものであることを忘れないでください。var hd = MakeHotDog(); hd.Add(Onion); ...
ニックB.

2
@Caleb違いは、例では実際のデータフィールドとしてブール値を使用しているのに対し、ほとんどの使用法は実行フローを駆動することだと思います。したがって、ボブおじさんはそれに対して手すりをしている。また、彼のアドバイスは極端なものです。本の次の数行では、2つ以上のパラメーターを持たないようにアドバイスしています。しかし、狂気には方法があります。あなたはそれが質問に答えないことは絶対に正しい、私は自分の答えで犯した間違い。
ダニエルB

5

2つのクラスを見て、それらがどのように結合されているかを見ると、カテゴリの 1つはデータ結合です。これは、あるクラスのコードを別のクラスのメソッドを呼び出し、レポートを何月にしたいかなどのデータを渡すだけですカテゴリは、コントロールの結合、メソッドの呼び出し、メソッドの動作を制御する何かの受け渡しです。クラスで使用する例はverboseフラグまたはreportTypeフラグですが、これpreventUndoも素晴らしい例です。既に説明したように、制御の結合により、呼び出し元のコードを読み取り、何が起こっているのかを理解することが難しくなります。またdoSomething()、同じフラグを使用して元に戻すとアーカイブの両方を制御したり、別のパラメータを追加したりすることで、呼び出しコードを変更に対して脆弱にしますdoSomething() アーカイブを制御し、コードを壊すなど。

問題は、コードが密結合しすぎていることです。動作を制御するためにブールを渡すことは、私の意見では、悪いAPIの兆候です。APIを所有している場合は、変更してください。2つの方法、doSomething()およびのdoSomethingWithUndo()方が適しています。所有していない場合は、所有するコードで2つのラッパーメソッドを自分で記述し、そのうちの1つを呼び出しdoSomething(true)、もう1つを呼び出しますdoSomething(false)


4

引数の役割を定義するのは、呼び出し側の役割ではありません。私はいつもインラインバージョンに行き、疑問がある場合は呼び出された関数の署名を確認します。

変数は、現在のスコープ内での役割に基づいて名前を付ける必要があります。Notが送信されるスコープ。


1
現在のスコープ内の変数の役割は、変数の用途を伝えることです。これがOPの一時変数の使用法とどのように矛盾するかわかりません。
superM

4

JavaScriptで私がすることは、関数が次のような唯一のパラメーターとしてオブジェクトを取ることです。

function doSomething(settings) {
    var preventUndo = settings.hasOwnProperty('preventUndo') ? settings.preventUndo : false;
    // Deal with preventUndo in the normal way.
}

次に、それを呼び出します:

doSomething({preventUndo: true});

ハ!!! 私たちは両方ともdoSomething(x)メソッドを作りました!笑...今まであなたの投稿にも気づかなかった。
12

「noUndo」という文字列を渡した場合はどうなりますか?また、署名を使用している人にとって、実装を調べずにどの設定を含めるべきかを明確にするにはどうすればよいですか?
ニックB.

1
コードを文書化します。それは他の皆がすることです。コードの読み取りが簡単になり、書き込みは一度だけで済みます。
ridecar2

1
@NickB。コンベンションは強力です。ほとんどのコードが引数を持つオブジェクトを受け入れる場合、これは明らかです。
-orip

4

私は、言語機能を活用して自分自身を明確にするのが好きです。たとえば、C#では、名前でパラメーターを指定できます。

 CallSomething(name: "So and so", age: 12, description: "A random person.");

JavaScriptでは、通常、この理由から引数としてオプションオブジェクトを使用することを好みます。

function doSomething(args) { /*...*/ }

doSomething({ name: 'So and so', age: 12, description: 'A random person.' });

それは私の好みだけです。呼び出されるメソッド、および開発者が署名を理解するのにIDEがどのように役立つかに大きく依存すると思います。


1
それは、緩やかに型付けされた言語の「欠点」です。何らかの検証なしに署名を実際に強制することはできません。そのような名前をJSに追加できるとは知りませんでした。
ジェームズP.

1
@JamesPoulson:あなたはおそらくあなたがJSでそれをすることができることを知っていて、ただそれを理解しませんでした。それはすべてJQueryで終わっています:$.ajax({url:'', data:''})などなど
blesh

本当です。一見異常に見えますが、一部の言語に存在する可能性のあるインライン擬似オブジェクトに似ています。
ジェームズP.

3

これが最も簡単で読みやすいと思います。

enum Undo { ALLOW, PREVENT }

doSomething(Undo u) {
    if (Undo.ALLOW == u) {
        // save stuff to undo later.
    }
    // do your thing
}

doSomething(Undo.ALLOW);

MainMaはそれを好みません。私たちは同意しないことに同意する必要がある場合があります。または、Joshua Blochが提案するソリューションを使用できます。

enum Undo {
    ALLOW {
        @Override
        public void createUndoBuffer() {
            // put undo code here
        }
    },
    PREVENT {
        @Override
        public void createUndoBuffer() {
            // do nothing
        }
    };

    public abstract void createUndoBuffer();
}

doSomething(Undo u) {
    u.createUndoBuffer();
    // do your thing
}

これで、Undo.LIMITED_UNDOを追加した場合、createUndoBuffer()メソッドを実装しない限り、コードはコンパイルされません。また、doSomething()にはif(Undo.ALLOW == u)はありません。私は両方の方法でそれを行いました。2番目の方法はかなり重く、Undo列挙型がページやコードのページに展開されるときに理解するのが少し難しいですが、それはあなたに考えさせます。通常、単純なメソッドを使用して、変更する理由があるまで単純なブール値を2値の列挙型に置き換えます。3番目の値を追加するとき、IDEを使用して「使用方法を検索」し、すべてを修正します。


2

あなたのソリューションはあなたのコードをもう少し読みやすくすると思いますが、関数呼び出しをより明確にするために余分な変数を定義することは避けたいと思います。また、追加の変数を使用する場合は、プログラミング言語でサポートされていれば、定数としてマークします。

余分な変数を含まない2つの選択肢を考えることができます。

1.追加のコメントを使用する

doSomething(/* preventUndo */ true);

2.ブール値の代わりに2値の列挙を使用します

enum Options
{
    PreventUndo,
    ...
}

...

doSomething(PreventUndo);

言語が列挙型をサポートしている場合、代替2を使用できます。

編集

もちろん、名前付き引数を使用することも、言語でサポートされている場合はオプションです。

列挙型が必要とする余分なコーディングに関しては、本当に無視できるように思えます。の代わりに

if (preventUndo)
{
    ...
}

あなたが持っている

if (undoOption == PreventUndo)
{
    ...
}

または

switch (undoOption)
{
  case PreventUndo:
  ...
}

そして、もう少し入力する場合でも、コードは1回書かれて何度も読み取られることを忘れないでください。そのため、6か月後に読みやすいコードを見つけるためにもう少し入力する価値があります。


2

@GlenPetersonが言ったことに同意します。

doSomething(Undo.ALLOW); // call using a self evident enum

しかし、私には2つの可能性(trueまたはfalse)しかないと思われるため、insterestingは次のようになります

//Two methods    

doSomething()  // this method does something but doesn't prevent undo

doSomethingPreventUndo() // this method does something and prevents undo

2
いいアイデア-私はそれを考えていませんでした。doSomething(String、String、String、boolean、boolean、boolean)のようにより複雑になった場合、名前付き定数が唯一の妥当な解決策です。Josh Blochは、次のようにファクトリとコンストラクターオブジェクトを提案しています。MyThingMaker thingMaker = MyThingMaker.new(); thingMaker.setFirstString( "Hi"); thingMaker.setSecondString( "There"); etc ... Thing t = thingMaker.makeIt(); t.doSomething(); それはただもっと多くの仕事なので、それだけの価値があったほうがいい。
グレンペターソン

後者のアプローチの1つの問題は、doSomething元に戻すを許可するかどうかの選択を呼び出し側に許可するメソッドを記述するのが面倒になることです。救済策は、ブールオプションを受け取るオーバーロードを持つことですが、常にtrueまたは常にfalseのパラメーターで以前のバージョンを呼び出すラッパーバージョンもあります。
supercat

@GlenPetersonファクトリは可能性であり、Javascriptで可能です(OPで言及されています)。
ジェームズP.

2

あなたは主にjavascriptについて尋ねているので、coffeescriptを使用することで、構文のような名前付き引数を持つことができます。

# declare method, ={} declares a default value to prevent null reference errors
doSomething = ({preventUndo} = {}) ->
  if preventUndo
    undo = no
  else
    undo = yes

#call method
doSomething preventUndo: yes
#or 
doSomething(preventUndo: yes)

にコンパイルする

var doSomething;

doSomething = function(_arg) {
  var preventUndo, undo;
  preventUndo = (_arg != null ? _arg : {}).preventUndo;
  if (preventUndo) {
    return undo = false;
  } else {
    return undo = true;
  }
};

doSomething({
  preventUndo: true
});

doSomething({
  preventUndo: true
});

http://js2coffee.org/でいくつかの可能性を試してみてください


coffeescriptは、javascriptのOOPの狂気を避ける必要がある場合にのみ使用します。これは、単独でコーディングするときに使用できる素晴らしいソリューションです。読みやすくするために、ブール値ではなくオブジェクトを渡すことを同僚に正当化するのは難しいでしょう!
methodofaction

1

あまり一般的ではない解決策であり、OPがJavascriptに言及しているため、値のマッピングに連想配列を使用する可能性があります。単一のブール値よりも優れている点は、引数を好きなだけ持つことができ、それらのシーケンスについて心配する必要がないことです。

var doSomethingOptions = new Array();

doSomethingOptions["PREVENTUNDO"] = true;
doSomethingOptions["TESTMODE"] = false;

doSomething( doSomethingOptions );

// ...

function doSomething( doSomethingOptions ){
    // Check for null here
    if( doSomethingOptions["PREVENTUNDO"] ) // ...
}

これは強い型付けのバックグラウンドを持つ人の反射であり、それほど実用的ではないかもしれませんが、独創性のためにこれを考慮してください。

別の可能性はオブジェクトを持つことであり、Javascriptでも可能です。私はこれが完全に正しいと100%確信していません。さらにインスピレーションを得るには、Factoryなどのパターンをご覧ください。

function SomethingDoer( preventUndo ) {
    this.preventUndo = preventUndo;
    this.doSomething = function() {
            if( this.preventUndo ){
                    // ...
            }
    };
}

mySomethingDoer = new SomethingDoer(true).doSomething();

1
これdoSomethingOptions.PREVENTUNDOは、配列アクセス表記ではなく、ドット表記()で記述する方が適切だと思います。
パエロエベルマン

1

あなたの質問と他の答えの焦点は、関数が呼び出される場所で読みやすさを改善することです。これは私が同意する焦点です。イベント「ブール引数なし」という特定のガイドラインは、常にこの目的のための手段として機能し、自分自身になったり終了したりすることはありません。

プログラミング言語がC#4やPythonのように名前付き引数/キーワード引数をサポートしている場合、またはSmalltalkやObjective-Cのようにメソッド引数がメソッド名にインターリーブされている場合、この問題はほとんど回避されることに注意すると便利だと思います。

例:

// C# 4
foo.doSomething(preventUndo: true);
# Python
foo.doSomething(preventUndo=True)
// Objective-C
[foo doSomethingWith:bar shouldPreventUndo:YES];

0

ブール変数を関数の引数として渡すことは避けてください。関数は一度に1つのことを行う必要があるためです。ブール変数を渡すことにより、関数には2つの動作があります。また、これにより、後の段階で、またはコードを見る傾向がある他のプログラマーにとって、読みやすさの問題が生じます。これは、関数のテストにも問題を引き起こします。おそらくこの場合、2つのテストケースを作成する必要があります。switchステートメントを取得し、switchタイプに基づいてその動作を変更する関数がある場合、非常に多くの異なるテストケースを定義する必要があると想像してください。

関数のブール引数を持つことに出くわすたびに、ブール引数をまったく書かないようにコードを微調整する必要があります。


それで、あなたは、コードのごく一部(オリジナルにはあるif(param) {...} else {...})でのみ異なる2つの関数のブール引数を持つ関数を変換しますか?
パエロエベルマン

-1
int preventUndo = true;
doSomething(preventUndo);

C ++などの低ラベル言語向けの優れたコンパイラは、以下のように2行以上のマシンコードを最適化します。

doSomething(true); 

そのため、パフォーマンスには関係ありませんが、読みやすさが向上します。

また、変数が後で変数になり、他の値も受け入れる場合に備えて、変数を使用すると便利です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.