タグ付けされた質問 「functions」

関数は、特定のタスクを実行するコードのブロックです。

16
上司から、小さな関数の作成をやめて、同じループですべてを実行するように頼まれました
Clean Codeという本を読みましたRobert C. Martinによる。この本では、小さな関数の作成、名前の慎重な選択など、コードをクリーンアップするための多くの方法を見てきました。しかし、今日、上司はこの本を読んだ後のコードの書き方が好きではありませんでした。 彼の議論は 小さな関数を書くと、コードが何をしているのかを見るために各小さな関数に移動しなければならないので苦痛です。 メインループが300行を超える場合でも、すべてをメインの大きなループに入れると、読みやすくなります。 コードを複製する必要がある場合にのみ、小さな関数を作成してください。 コメントの名前を使用して関数を記述しないでください。上記のコメントを使用して複雑なコード行(3〜4行)を入力してください。同様に、失敗したコードを直接変更できます これは私が読んだすべてのものに反しています。通常、どのようにコードを記述しますか?1つの大きなループ、小さな関数はありませんか? 私が使用する言語は主にJavascriptです。明確に名前が付けられた小さな関数をすべて削除し、すべてを大きなループに入れたので、今は本当に読みにくいです。しかし、上司はこの方法が好きです。 一例は次のとおりです。 // The way I would write it if (isApplicationInProduction(headers)) { phoneNumber = headers.resourceId; } else { phoneNumber = DEV_PHONE_NUMBER; } function isApplicationInProduction(headers) { return _.has(headers, 'resourceId'); } // The way he would write it // Take the right …

11
一度だけ呼び出される1行関数
1行のコードを実行し、プログラムで1回だけ呼び出されるパラメーターレス(編集:必ずしもではない)関数を考えてください(将来再び必要になることは不可能ではありませんが)。 クエリを実行し、いくつかの値をチェックし、正規表現に関係する何かを実行できます。 この背後にある理論的根拠は、読みにくい評価を避けることです。 if (getCondition()) { // do stuff } where getCondition()は1行関数です。 私の質問は単純です:これは良い習慣ですか?私には大丈夫のようですが、長期については知りません...
120 functions 

11
関数が受け入れるパラメータの数に関するガイドラインはありますか?
私が使用しているいくつかの関数には6つ以上のパラメータがあることに気づきましたが、私が使用するほとんどのライブラリでは、3つ以上かかる関数を見つけることはまれです。 多くの場合、これらの追加パラメーターの多くは、関数の動作を変更するためのバイナリオプションです。これらの無数のパラメーター化された関数のいくつかはおそらくリファクタリングされるべきだと思います。数が多すぎる場合のガイドラインはありますか?

15
メソッドのメモリとパフォーマンスの速度を最適化するタイミング
私は最近Amazonでインタビューしました。コーディングセッション中に、インタビュアーはメソッドで変数を宣言した理由を尋ねました。私は自分のプロセスを説明し、彼はより少ない変数で同じ問題を解決するように私に挑戦しました。例えば、私が開始(これはインタビューからではなかった)方法A、次いで向上にそれを、方法B除去することによってint s。彼は喜んでおり、これはこの方法によってメモリ使用量を減らすだろうと言った。 私はその背後にあるロジックを理解していますが、私の質問は次のとおりです。 方法Aと方法B、またはその逆を使用するのが適切な場合 メソッドAがint s宣言されているため、メモリ使用量が高くなることがわかりますが、実行する必要があるのは1つの計算だけa + bです。一方、方法Bではメモリ使用量は少なくなりますが、a + b2回、つまり2回計算する必要があります。あるテクニックを他のテクニックよりもいつ使用するのですか?または、テクニックの1つは常に他よりも優先されますか?2つの方法を評価する際に考慮すべきことは何ですか? 方法A: private bool IsSumInRange(int a, int b) { int s = a + b; if (s > 1000 || s < -1000) return false; else return true; } 方法B: private bool IsSumInRange(int a, int b) { if (a + b …

6
繰り返し呼び出されたときに、一度呼び出すのと同じ効果を持つ関数の用語は何ですか?
(シングルスレッド環境を想定) この基準を満たす関数は次のとおりです。 bool MyClass::is_initialized = false; void MyClass::lazy_initialize() { if (!is_initialized) { initialize(); //Should not be called multiple times is_initialized = true; } } 本質的に、この関数を複数回呼び出すことができ、MyClass複数回初期化することを心配する必要はありません この基準を満たさない関数は次のとおりです。 Foo* MyClass::ptr = NULL; void initialize() { ptr = new Foo(); } initialize()複数回呼び出すと、メモリリークが発生します。 動機 この基準を満たすことが期待される関数に適切にコメントできるように、この動作を説明する簡潔な単語を1つ用意しておくとよいでしょう(特に、オーバーライドされると予想されるインターフェース関数を記述する場合に便利です)
96 naming  functions 

12
最新のコンパイラーでは、関数呼び出しのコストは依然として重要ですか?
私は宗教人であり、罪を犯さないように努力しています。それが、私がきれいなコード聖書によって命じられたいくつかの戒めに従うために、小さな(それよりも小さい、ロバート・C・マーティンを言い換える)関数を書く傾向がある理由です。しかし、いくつかのものをチェックしながら、私はこの投稿に行き、その下でこのコメントを読みました: 言語によっては、メソッド呼び出しのコストがかなり高くなる可能性があることに注意してください。ほとんどの場合、読み取り可能なコードの作成とパフォーマンスコードの作成にはトレードオフがあります。 高性能の最新コンパイラーの豊富な業界を考えると、この引用文はどのような条件下でも今でも有効ですか? それが私の唯一の質問です。そして、それは長い関数を書くべきか小さな関数を書くべきかということではありません。私はあなたのフィードバックが私の態度を変えることに貢献するかもしれないし、しないかもしれないことを強調し、冒bl者の誘惑に抵抗することはできません。

5
なぜPython辞書内に関数を保存するのですか?
私はpython初心者であり、辞書と関数を含むテクニックを学びました。構文は簡単で、些細なことのように思えますが、私のPythonの感覚はチクチクしています。これは深くて非常にパイソン的な概念であり、その重要性を十分に把握していないということです。誰かがこのテクニックに名前を付けて、どのように/なぜそれが役立つかを説明できますか? テクニックは、Python辞書とそれに使用する予定の関数がある場合です。値が関数の名前である追加の要素を辞書に挿入します。関数を呼び出す準備ができたら、名前ではなく、dict要素を参照して間接的に呼び出しを発行します。 私が取り組んでいる例は、Learn Python the Hard Way、2nd Edのものです。(これは、Udemy.comからサインアップしたときに利用可能なバージョンです。残念ながら、ライブの無料HTMLバージョンは現在Ed 3であり、この例は含まれていません)。 言い換えると: # make a dictionary of US states and major cities cities = {'San Diego':'CA', 'New York':'NY', 'Detroit':'MI'} # define a function to use on such a dictionary def find_city (map, city): # does something, returns some value if city in …

4
関数型言語は乱数をどのように処理しますか?
私はそれについて意味することにということですほとんど、すべてのチュートリアル私は関数型言語について読んだ機能の優れた点の一つは、あなたが二度同じパラメータを持つ関数を呼び出す場合、あなたはだろうということであるということである常にで終わります同じ結果。 一体どのようにして、パラメータとしてシードを取り、そのシードに基づいて乱数を返す関数を作成しますか? これは、機能について非常に良いことの1つに反するように見えることを意味しますよね?または、私はここで何かが完全に欠けていますか?

10
関数のオーバーロードのためだけにC ++コンパイラを使用するのは悪い習慣ですか?
そのため、特定のプロセッサでCを使用したソフトウェア設計に取り組んでいます。ツールキットには、CおよびC ++をコンパイルする機能が含まれています。私がやっていることに関しては、この環境で利用可能な動的メモリ割り当てはなく、プログラムは全体的にかなり単純です。言うまでもなく、このデバイスにはプロセッサー能力やリソースがほとんどありません。C ++を使用する必要はまったくありません。 そうは言っても、関数のオーバーロードを行う場所はいくつかあります(C ++の機能)。いくつかの異なるタイプのデータを送信する必要がありますが、printf何らかの%s(またはなんらかの)引数でスタイルの書式設定を使用する気はありません。私はC ++コンパイラにアクセスできない人を何人か見ましたprintfが、私の場合はC ++サポートが利用可能です。 これで、なぜ関数をオーバーロードする必要があるのか​​という疑問を最初から得ることができると確信しています。だから私は今すぐそれに答えようとします。シリアルポートからさまざまな種類のデータを送信する必要があるため、次のデータ型を送信するオーバーロードがいくつかあります。 unsigned char* const char* unsigned char const char 私は、これらすべてを処理する1つのメソッドを持たないことを好みます。私はちょうどそれがシリアルポートを送信する関数を呼び出すときに、私は多くの資源を持っていないので、私はかろうじて行うにはしたくない何でもいいけど、私の送信を。 他の人が私のプログラムを見て、「なぜCPPファイルを使用しているのですか?」だから、それが私の唯一の理由です。それは悪い習慣ですか? 更新 私は尋ねられたいくつかの質問に対処したいと思います: あなたのジレンマに対する客観的な答えは以下に依存します: C ++を使用する場合、実行可能ファイルのサイズが大幅に増加するかどうか。 現在、実行可能ファイルのサイズは、プログラムメモリの4.0%(5248バイトのうち)とデータメモリの8.3%(342バイトのうち)を消費しています。つまり、C ++用にコンパイルしています... Cコンパイラを使用していないため、Cでどのように見えるかわかりません。私はこのプログラムがこれ以上成長しないことを知っているので、リソースがどれだけ限られているかについては、私はそこで大丈夫だと言います... C ++を使用している場合、パフォーマンスに顕著な悪影響があるかどうか。 ある場合、私は何にも気づいていません...しかし、それでも私は完全に理解していないので、私はこの質問をしている理由かもしれません。 Cコンパイラーのみが使用可能な別のプラットフォームでコードを再利用できるかどうか。 私はこれに対する答えが間違いなくノーであることを知っています。別のプロセッサへの移行を実際に検討していますが、より強力なARMベースのプロセッサのみです(事実、C ++コンパイラツールチェーンを持っていることは事実です)。

14
関数内のパラメーターの順序に関するベストプラクティスは何ですか?
時々(まれに)、適切な量のパラメーターをとる関数を作成することが最適なルートであると思われます。しかし、そうすると、パラメーターの順序をランダムに選択することが多いように感じます。私は通常、最も重要なパラメーターを最初に使用して、「重要度の順に」進みます。 これを行うためのより良い方法はありますか?明確性を高めるパラメーターを並べる「ベストプラクティス」の方法はありますか?

9
外部APIからの予期しない値から保護する必要がありますか?
外部APIから入力を受け取る関数をコーディングしているとしましょうMyAPI。 その外部APIにMyAPIは、a stringまたはa を返すことを示す契約がありnumberます。 それはのようなものから保護することをお勧めしますnull、undefined、booleanそれはのAPIの一部ではないにもかかわらずなど、MyAPI?特に、そのAPIを制御することはできないため、静的型分析などの方法で保証することはできません。 私はロバストネスの原則に関連して考えています。

6
Cで構造体を返す多くの関数が、実際に構造体へのポインターを返すのはなぜですか?
return関数のステートメントで構造全体を返すのではなく、構造へのポインタを返すことの利点は何ですか? 私はfopen他の低レベル関数のような関数について話しているが、おそらく構造体へのポインタを返す高レベル関数もあるだろう。 これは単なるプログラミングの質問ではなく、設計上の選択であり、2つの方法の長所と短所についてもっと知りたいと思っています。 構造体へのポインターを返すのが利点だと思った理由の1つは、ポインターを返すことで関数が失敗したかどうかをより簡単に判断できることNULLです。 完全な構造を返すのは、NULL私にとっては難しいか、効率が悪いでしょう。これは正当な理由ですか?

5
クラスに関係のない関数はどこに置くべきですか?
私はクラスの一部として使用するために最初に書いた数学関数の束があるC ++プロジェクトに取り組んでいます。もっとコードを書いているうちに、どこでもこれらの数学関数が必要だと気づきました。 それらを置くのに最適な場所はどこですか?私がこれを持っているとしましょう: class A{ public: int math_function1(int); ... } そして、私が別のクラスを書くとき、私はその他のクラスでそれを使用することはできません(または、少なくともその方法を知りません)math_function1。さらに、この関数の一部はクラスAに実際には関連していないことに気付きました。それらは最初のように見えましたが、今では数学関数であることがわかります。 この状況での良い習慣は何ですか?今、私はそれらを新しいクラスにコピー&ペーストしていますが、これは最悪のプラクティスだと確信しています。
47 c++  functions  class 

3
ブールメソッドの命名の肯定と否定
ブール型メソッドは、否定的な形式でのみ使用される場合でも、常に肯定的な形式を取る必要がありますか? エンティティを作成する前にエンティティが存在するかどうかを確認したかったとしましょう。私の主張は、メソッドが肯定的なフォームで使用されているかどうかに関係なく、下の最初のフォームは2番目のフォームより優れているということです。 要約すると、私はif(!affirmative)よりも読みやすいと思いますif(negative)。意見が合わない同僚がいますか? 最初のフォーム: int entity_id = 42; if(!entity_exists(entity_id)) create_entity(entity_id); 2番目のフォーム: int entity_id = 42; if(entity_not_exist(entity_id)) create_entity(entity_id);
43 naming  functions 

8
関数名で文を始めますか?[閉まっている]
大文字と小文字を区別するプログラミング言語に関連する何かを入力しているときに、関数名で文を開始することがあります。現在、英語の規則では、文の最初の単語は大文字にする必要があります。ただし、関数名は小文字です。最初の単語が関数名になるということを私が何と言っているのか疑問に思っているなら、この例を見てください: フレッドの実装が壊れています。freadは、読み取られたバイト数を返す必要があります。 私はfreadの2番目のインスタンスをItに変更できることを理解していますが、文を書き換える以外にこれを処理する最良の方法を知りたいです。関数名を大文字にする必要がありますか?「文を書き直して」という答えを聞きたいのは、関数名で文を開始すると、知らない英語の規則に違反する場合だけです。編集:これらの答えを本当にありがとう。問題に対する私の洞察が変わり、改善されました。私はこれから多くを学びました。私はこれらのシンプルだが良い解決策を考えていなかったことに非常に驚いています。 私は文を交互に変えるというスタンスは非常に難しかったと思いますが、これらの良い答えのために、文の全体的な変更が関数の後にカッコを追加するか、または関数名、および利用可能な場合は関数名の書式設定を使用します。
42 functions 

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