タグ付けされた質問 「coding-style」

コーディングスタイルは、ソースコードの読みやすさと理解に役立つ一連のガイドラインです。

2
gccでビルドするプロジェクトの個人コード分析にClangを使用するのは賢明ですか?
を使用してビルドしているいくつかのCプロジェクトに取り組み始めましたgcc。この選択はいくつかの理由で行われたと思います: アームの非常に早い段階でクロスコンパイルする必要がありました(私はそう思います)。 パフォーマンスは、何よりも重要なスペックです。 gcc 以前も今も簡単な最初の選択です。 私はその選択に異議を唱える理由はなく、とにかくそうする立場にはありません。 単一のプロジェクトのコードベースは比較的小さいです。すべてのプロジェクトは比較的クリーンなMakefile(現在更新中)でビルドされ、gcc -Wall -Wextraほとんど文句を言わず、最小限のテストが行​​われます。自動化された静的分析やコードのフォーマットは行われておらず、コードは構文的に一貫性がありませんが、非常に読みやすく、考え抜かれています。 コードのすべての行を一度に再フォーマットしたくないので、この回答の周りのどこかで説明されているように(特にコンテキストが実際にはそれほど悪くないため)行うつもりです:リファクタリングし、主に、トピックを扱うときはできるだけ再フォーマットしますただし、コードスタイルを意識しないでトピックを取り上げます。残念ながら、私はコードスタイルやコミットの追加チェックを課す立場にはありませんが、ファイルを変更するときは既存のコード規則を尊重する必要があるという同僚の感覚があるように感じます(ただし、現在の状態はわかっていますが)コードの魔法のようなことが起こりませんでした)、そして良いコードを書きたいという欲求。 これは、このような心構えでCでプログラミングするのが初めてであり、さまざまなコード分析ツールと書式設定ツールに非常に惹かれていclangます。 したがって、私の質問の要点は次のとおりです。それclangを使用clangしてビルドしているときに、ヒントに従ってフォーマットおよび分析ツールを使用すると問題が発生する可能性がありますgccか?たとえば、一部の警告は、内部表現gccが使用しないか、バイトコードclangが生成しgccないものから発生する可能性があります。 警告ヒントが意味をなすように、gccコンパイルパラメータ(主にターゲットアーキテクチャと最適化レベル)を自動的に渡す良い方法はありclangますか? 私が精通していることgccとそのエラー報告を追加します。私は、より適切な言葉でわかりやすい警告だけでなく、より多くの(関連する)警告とエラーを取得することに関心があります。したがって、1 日の終わりclangに構築するために、その内部表現に基づいて生成できる追加のヒントを信頼できない場合、私はこれを行うことにあまりgcc興味がありません。 私は多くのコンテキストを含めたので、どんな発言をしても、私が持ち出せなかった根本的な質問に気軽に答えてください。

3
ループ内にネストされている場合、try-catchステートメントのネストは依然としてコードの匂いですか?
try-catchステートメントをネストするとコードの臭いになることがよくあると聞いたので、この状況が例外かどうか疑問に思います。そうでない場合、リファクタリングするためのいくつかの良い方法は何でしょうか? 私のコードは次のようになります: try{ X x = blah; otherStuff; for (int i = 0; i < N; i++){ try{ String y = Integer.toString(i); f(x); } catch(Exceptions1 e1){ System.err.println(... + y + ...); System.exit(0); } } catch(Exceptions2 e2){ ... } Exceptionsここではマルチキャッチを示すために使用しています。 e2初期化xおよび実行によってスローされた例外をキャッチするために使用されますotherStuff。理想的には、2つの行だけをtry-catchで囲んでいたはずですがx、ループ内で使用し、try-catchの外側でnullに初期化することによって引き起こされる「未使用の割り当て」警告を回避したいと考えました。 e1e2反復の詳細に関する情報をユーザーに提供したいため、ループ内にキャッチブロックが必要だったため、マルチキャッチされませんでした。

3
OOP設計の問題。2種類の空のオプション
ホテルの部屋の予約を扱う非常にシンプルなアプリケーションを書いています。ある段階で問題が発生しました。 注文のキューを処理しています。注文ごとに、受付係の1人は、クライアントの戦略に従って部屋(1つまたはまったくなし)を選択する必要があります。それが私がJavaを使うことにした理由Optionalです。問題は、希望する日に空き部屋がない場合は注文をキャンセルする必要があることですが、利用可能な部屋があり、それらのどれもが受付の戦略に適合しない場合は、注文をキューに戻す必要があります。 部屋を選択することは間違いなく受付の義務である必要があります。その問題にクリーンな方法で対処するための最良の方法は何だと思いますか?Optional日付に部屋がない場合、空を返す代わりに例外をスローする必要がありますか?残念ながら、例外は通常、コードフローを制御するための適切なソリューションではありません。 コードフラグメント: Optional<Room> selectedRoom = receptionist.chooseRoom(rooms, order.getQuestionnaire()); boolean decision = selectedRoom .map(room -> receptionist.askClient(order.getClient(), room, order.getQuestionnaire())) .orElse(false); if (shouldProcessAgain(order, selectedRoom.isPresent(), decision)) { orders.add(order); }

4
このコード構造は何らかの点で有益ですか?
私は最近、Java Webアプリケーションプロジェクトに夢中になり、このタイプの形式に従う多くのクラスに遭遇しました。 public class MyThingy { private final int p1; private final String p2; … public MyThingy (int p1, String p2, …) { this.p1 = p1; this.p2 = p2; … } public static void doSomething(int p1, String p2, …) throws Throwable { final MyThingy myThingy = new MyThingy(p1, p2, …); …

1
なぜグローバルっぽいObject.create関数を作成するのですか?
私は.NETとJavaの分野でかなり経験豊富なプログラマーであり、JavaScriptについて読み始めました。Douglas Crockfordの "The Good Parts"の本を購入しましたが、すぐにいくつかのことが気になりませんでした。 1つは、必要のない基本的な型を変更することです。 if (typeof Object.create !== 'function') { Object.create = function (o) { //Really... 'o'? For a parameter you're only using twice? function F() {} F.prototype = o; return new F(); }; } newObject = Object.create(oldObject); 明らかにこの目的で関数を作成すると便利で時間を節約できますが、なぜ地球上でオブジェクト上に作成することを勧めているのですか?3呼吸前に彼はグローバルが悪であることを支持し、それから彼はモンキーパッチオブジェクトに進みました。彼はそれがすでに存在するかどうかさえテストし、他のライブラリが彼のためにそれを行った場合の実装は同じであると仮定します。 名前空間に相当するJSでこれを作成しない理由はありますか?すなわち MY_UNIQUE_UTIL_LIBRARY.create = function(obj){...}; //The name would be shorter …

5
成功するまで繰り返し、失敗を処理するループを構築する方法
私は独学のプログラマーです。私は約1.5年前にプログラミングを始めました。今、私は学校でプログラミングクラスを始めました。プログラミングクラスは1/2年間ありましたが、今はもう半分あります。 クラスでは、C ++でプログラミングする方法を学びます(これは、始める前に、私がすでにかなりよく使用することを知っていた言語です)。 このクラスでは何の問題もありませんでしたが、明確な解決策を見つけることができなかった問題が繰り返し発生しています。 問題は次のようになります(疑似コード): do something if something failed: handle the error try something (line 1) again else: we are done! これはC ++の例です このコードはユーザーに数値の入力を求め、入力が有効になるまで入力を続けます。cin.fail()入力が無効かどうかを確認するために使用します。ときcin.fail()であるtrue私が呼び出す必要がありますcin.clear()し、cin.ignore()ストリームからの入力を取得し続けることができるように。 このコードはをチェックしないことを知っていますEOF。私たちが書いたプログラムは、そうすることを期待されていません。 これが私が学校での課題の1つでコードを書いた方法です。 for (;;) { cout << ": "; cin >> input; if (cin.fail()) { cin.clear(); cin.ignore(512, '\n'); continue; } break; } 私の先生は、私はこれを使うべきではないbreakとcontinue言っていました。彼は代わりにレギュラーwhileかdo ... whileループを使うべきだと提案しました。 …

4
C#のフィールドとメソッドでプライベートを使用する必要がありますか?
私はC#に少し慣れており、次のことがわかりました。C#では、クラス内のすべてのフィールドとメソッドはデフォルトでプライベートです。これが意味すること: class MyClass { string myString } と同じです: class MyClass { private string myString } それで、それらは同じなので、フィールドとメソッドでprivateキーワードを使用する必要がありますか?多くのオンラインコードサンプルでは、​​コードでprivateキーワードを使用していますが、それはなぜですか?

1
コード内の制御フローの深い入れ子は、研究された問題ですか?
私は同僚に、深いレベルの制御フローがコードの可読性に有害であると主張しました。 関連するスタックオーバーフローの質問/software/52685/if-you-need-more-than-3-levels-of-indentation-youre-screwedからの例: for(int i=0; i<10; ++i){ Object val = repeat(i, someVar); if(val.value > 3){ switch(val.item){ case DOG: if(mProcess){ outputToUser(val); doMoreThings(val, mMoreThingDoer); if(mRepurpose){ addExample(val); } // and so on, and so on... ほとんどの場合と同様に、このトピックに関する意見を見つけるのは簡単です。 しかし、誰かがそれ以上に貢献できるかどうか疑問に思っています。 たとえば、問題に関連する実際の調査が行われたことがありますか? それとも、「Xのほうが好き」を超えた他の議論をすることはできますか?

3
単一のオブジェクトが複数の変数よりも優先されますか?
タイトルに意味を込めるのはかなり大変でしたが、コードに入れるのは簡単です。 C ++ これは int offset_x = 10; int offset_y = 40; ... element.move(offset_x, offset_y); これよりも優先されますか? Vector<int> offset(10, 40); ... element.move(offset.x, offset.y); (Vector std::vectorはとは異なり、2Dベクトルです。このクラスには、やのようにnormalize()、ここでは不要な多くのメソッドがあります。これscale()には、より基本的なPointクラスが必要ですか?) JavaScript これは var offsetX = 10; var offsetY = 40; ... element.move(offsetX, offsetY); これよりも優先されますか? var offset = {x: 10, y: 40}; ... element.move(offset.x, offset.y);

3
負符号と変数名の間のスペース
このStack Exchangeサイトを検索するだけでなく、Google検索も試しましたが、これに直接関連する質問は見つかりませんでした。 PEP 8 - Pythonのコードのためのスタイルガイドは、良いスタイルの推奨事項の多くを持っている、しかし、私は彼らがマイナスまたはマイナス記号(間にスペースかどうかについては何も言及しないと思います-)、変数名は、多かれ少なかれ読みだろうが。 質問 (非常に)小さな問題ですが、どちらがより読みやすいと考えられますか? false_positive = -true_positive false_positive = - true_positive 動機 ささいなことをしないようにお願いしますが、過去の数学のコースでは、エントロピーを計算するための方程式などの重要な方程式の負符号に気付かないことがよくあります。 -合計の前にサインに気付かないことが多いので、目立たせることが望ましいでしょう。

3
動的に型付けされた言語のプロシージャの途中で変数の型を変更するのは悪いスタイルですか?
変数に固定型がないPython(および場合によってはPHP)では、コードのロジックの途中で変数に対して「型変換」を頻繁に実行します。私は(必ずしも)単純なキャストについて話しているのではなく、基本的に同じ値またはデータを表すまま、変数の型を変更する関数について話しています。 たとえば、Webリクエストを実行するときに、response変数を使用してaddurlinfoオブジェクトを格納し、次にそのオブジェクトの文字列コンテンツ、および文字列をJSONとして解析して返されるディクショナリを次のようなコードで記述します。 response = urlopen(some_url) assert response.info().type == 'application/json' response = response.read() logger.debug('Received following JSON response: ' + response) response = json.loads(response) do_something(response) (さて、それは少し不自然な例ですが、私はそれがアイデアをうまく​​示していると思います)。これは、3つの個別の変数名を使用するよりも良いと思います。これは、a)response変数に基本的に同じ情報が含まれていること、別の型に「変換」されていること、b)以前のオブジェクトがそうではないことを伝えるためです。これらの変数を再割り当てすることで、後のコードで使用できなくなったため、関数のさらに下で必要になります。 トレードオフは、おそらく、ある時点で変数がどのタイプであるかについて読者が混乱する可能性があるということです。 これは悪いスタイルですか?上記の例では、1つに再割り当てする代わりに3つの異なる変数を使用する必要がありますか?また、これは動的に型付けされた言語での標準的な方法ですか?他の人のコードを知るのに十分なほど見ていません。

4
C ++のJavaスタイルクラス
私はこの記事に出くわし、最初は少し奇妙に見えるc ++でのコーディングのスタイルを提案しました。しかし、それを読んで少し考えた後、私は本当にそれを試してみることを考えています。 最も魅力的な利点は、メソッドのリファクタリングの容易さです。新しいクラスを作成している間、私は常にメソッド名やパラメーターなどを変更していることに気づき、c ++では2つのファイル(.h、.cpp)のメソッド名を変更しなければならないのは非常に面倒です。 私はこのスタイルに問題があることを見つけようとしましたが、経験豊富なc ++プログラマーにとってコードが実際に奇妙に見えて感じられるという事実は別として、大きな欠陥を見つけることはできません。しかし、私は非常に経験の浅いc ++プログラマなので、ここにいる誰かが潜在的な危険について私に警告してくれることを願っています。 だから私の質問は: このスタイルのコーディングを使用することの重大な欠点はありますか?

2
スクリプトのどこに定数を定義すればよいですか?
PowershellやJavaScriptなどの最新のスクリプト言語を使用してスクリプトを作成する場合、定数をどこに定義すればよいですか?可読性と使いやすさのためにすべての定数をグローバルにする必要がありますか、または定数をスコープにできるだけ近く定義することは理にかなっていますか(関数で、たとえば、他で必要ない場合)。私は主にエラーメッセージ、エラーID、リソースへのパス、または構成オプションについて考えています。

4
引数またはメンバー変数としてのメソッドフラグ?
タイトルは「メソッドフラグを引数として、またはメンバー変数として?」最適ではないかもしれませんが、より良い用語のATMがないため、次のようになります。 私は現在、特定のクラス(プライベート)メソッドのフラグを関数の引数として渡すか、メンバー変数を介して渡すか、この側面をカバーするパターンまたは名前があるかどうか、および/またはこの問題を回避しようとしています。これが他の設計上の問題を示唆しているかどうか。 例(言語はC ++、Java、C#である可能性があり、実際にはIMHOには関係ありません): class Thingamajig { private ResultType DoInternalStuff(FlagType calcSelect) { ResultType res; for (... some loop condition ...) { ... if (calcSelect == typeA) { ... } else if (calcSelect == typeX) { ... } else if ... } ... return res; } private void InteralStuffInvoker(FlagType calcSelect) { …

5
シンプルさの議論
最近、私の会社では、抽象化と単純化について少し議論しました。私が「DRYと抽象化は害を及ぼさない」と特徴付けた1つの考えの学校は、このようなコードにつながります: def make_foo_binary(binaryName, objFiles, fooLibsToLinkAgainst) make_exe_task(binaryName, objFiles.ext('.o'), fooLibsToLinkAgainst) end この: class String def escape_space return self.gsub(' ', '\ ') end end 私の見解では、このような抽象化を作成すると、1つの場所でのみ使用され、コードが読みにくくなります。これは、読者が(gsub)に慣れている関数呼び出しを、見たことのない別の関数呼び出しに置き換えるためです。前(escape_space)。コードが実際にどのように機能するかを理解したい場合は、これを読む必要があります。置換は基本的に英語(「エスケープスペース」)で記述され、英語はあいまいなことで有名です。たとえば、定義を見ないと、すべての空白をエスケープするのか、スペース文字だけをエスケープするのかわかりません。 DRYと抽象化の賞賛を歌う多くの文章があります。 抽象化の限界を説明する情報源を知っている人はいますか?それは賞賛を歌って、コードをシンプルに保つことの実際的なことを話し合いますか? 編集:私は人生や(英語)ライティングでシンプルさを促進するテキストを見つけることができます。たとえば、Thoreauの「Simplify、Simplify!」またはStrunk and Whiteの「精力的な執筆は簡潔です。」プログラミングに相当するものはどこですか?

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