ソフトウェア工学

システム開発ライフサイクル内で働く専門家、学者、学生向けのQ&A

6
関数が誤って参照パラメーターを無効にします-何が間違っていましたか?
今日、特定のプラットフォームでのみ断続的に発生する厄介なバグの原因を発見しました。要約すると、コードは次のようになりました。 class Foo { map<string,string> m; void A(const string& key) { m.erase(key); cout << "Erased: " << key; // oops } void B() { while (!m.empty()) { auto toDelete = m.begin(); A(toDelete->first); } } } この単純化されたケースでは、問題は明らかなように見えBます。キーへの参照を渡してA、マップエントリを削除してから印刷しようとします。以来、これはもちろん、未定義の動作である(私たちの場合は、それが印刷されなかったが、より複雑な方法で使用される)keyへの呼び出し後にダングリング参照ですerase。 これを修正するのは簡単でしconst string&たstring。パラメータタイプをからに変更しました。問題は、そもそもどうやってこのバグを回避できたのでしょうか?両方の機能が正しいことをしたようです: Akey破壊しようとしているものを参照していることを知る方法がありません。 Bに渡す前にコピーを作成できたかもしれAませんが、値または参照によってパラメータを取るかどうかを決定するのは呼び出し先の仕事ではありませんか? 従わなかったルールはありますか?
54 c++ 

3
HTTPステータスコードを使用して、アプリケーションレベルのイベントを記述する必要がありますか
私が扱ったいくつかのサーバーは、クライアントが失敗と見なすべきリクエストに対してHTTP 200を返します。本文には「success:false」のようなものが含まれます。 これは、特に認証に失敗した場合、HTTPコードの適切な実装とは思えません。「4xx」は変更するまでリクエストを再度行うべきではないことを示し、「5xx」はリクエストが有効または無効であり、再試行できるが失敗したことを示すため、HTTPエラーコードを簡潔に要約しました。この場合、200:ログインに失敗した、または200:そのファイルが見つからなかった、または200:パラメータxが見つからない、間違いが間違っているようです。 一方、「4xx」はリクエストの構造的な問題を示すだけであるという議論が行われていることがわかりました。したがって、200を返すのは適切です。401不正ではなく、不正なユーザー/パスワードは、クライアントが要求を行うことを許可されているためです。この引数は、サーバーが要求を処理して決定を行うことができた場合、応答コードは200である必要があり、詳細については本文を確認するのはクライアント次第であると要約できます。 基本的に、これは好みの問題のようです。しかし、それは満足のいくものではないので、これらのパラダイムのいずれかがより正しい理由が誰かにあるなら、私は知りたいです。

6
小さな変更を加えてテストし、次に「すすぎと繰り返し」を行うのは悪い習慣ですか?
私は長年の経験を持つプログラマーです。ある習慣があることに気づきました。それが本当に悪い習慣であるかどうかはわかりません。 ソリューションのために実行するタスクのリストを取得します。たとえば、小さな小さなタスクでも このユーザーコントロールのリソースを変更する 別のサイズを変更する 別のユーザーコントロールにHTMLとコーディングを追加する これらのタスクはすべて小規模です。10分以内にできることを意味しますが、小さな変更を加えてからWebブラウザーで何度もテストするという悪い習慣がありました。これは良い習慣ですか? または、一度にすべてを実行してから、一緒にテストする必要がありますか? それが本当に悪い習慣であれば、小さな変更を何度もテストするのに時間を浪費しているように感じるので、どうすれば修正できますか?

8
テスターが誰がより多くのバグを開くかを競うのは良いことですか?
私はソフトウェア開発者です。アナリストによって書かれたテストケースをフォローして実行するが、探索的テストも実行するテスターのチームがあります。テスターは誰がより多くのバグを開くかを競い合っているようで、バグレポートの質が低下していることに気づきました。機能のテストやソフトウェアの動作に関連するバグの報告の代わりに、テスターは画面の機能強化、使いやすさ、または愚かなバグに関するバグを提出しています。 これはプロジェクトに適していますか?そうでない場合、どうすれば(ソフトウェア開発者として)テスターチームの考え方や態度を変えようとすることができますか? もう1つの問題は、期限が推定されて変更できないため、期限が近づくと、テスト担当者がテストケースを終了するためにスクランブルし、テストの品質が低下することです。これにより、クライアントが受け取った最終製品に正当なバグが発生します。 OBS:この競争は会社の慣行ではありません!それは彼らによって組織されたテスターだけの間の競争であり、賞はありません。

8
MVCアーキテクチャ—コントローラーはいくつ必要ですか?
私はしばらくコーディングしてきましたが、ほとんどはスクリプトと単純なアプリケーションです。Web Appsの開発と適切なMVCアーキテクチャの使用がすべての新しい役割に移行したため、そのすべてについて非常に迅速に学習しようと必死です。 この質問が「MVCアーキテクチャのベストプラクティス」とあまり似ていないことを願っていますが、いくつかの異なるチュートリアルを進めていると、いくつかの異なるコントローラが複数あることがわかりました。 1つのWebアプリに必要なコントローラーの数は? 例がなければ答えるのは難しいと思いますので、例を示します。 応用: ユーザーがログインします。 ユーザーは、次の3つのいずれかを実行できます 。a )ファイルをアップロードします(メタデータとともにmongodbデータベースに保存されます)。 b) ファイルを検索します。 c) ログアウトします。 私の質問は一般的な質問ですが、答えようとしている人を助けるために例を挙げました。

10
「final」キーワードが役立つのはなぜですか?
Javaには長い間派生できないクラスを宣言する力があったように思われますが、現在はC ++にもあります。しかし、SOLIDのOpen / Close原則に照らして、なぜそれが役立つのでしょうか?私には、finalキーワードのように聞こえますfriend-それは合法ですが、あなたがそれを使用している場合、ほとんどの場合、設計が間違っています。派生不可能なクラスが優れたアーキテクチャまたはデザインパターンの一部になるような例をいくつか提供してください。
54 java  c++  solid  final 

6
マルチスレッドの競合状態のテスト
この回答へのコメントを読む、具体的には: テストを書くことができないからといって、テストが壊れていないわけではありません。通常、期待どおりに動作する未定義の動作(CおよびC ++はそのすべてで満たされています)、競合状態、メモリモデルの弱さによる潜在的な再配列... – CodesInChaos 7時間前 @CodesInChaos再現できない場合、「修正」に書き込まれたコードもテストできません。未テストのコードを公開することは、私の意見では最悪の犯罪です– RhysW 5時間前 ...テストケースの競合状態が原因で、本番環境で非常にまれにしか発生しない問題を一貫して引き起こす良い一般的な方法があるかどうか疑問に思っています。

5
Javaでプリミティブvsクラスを使用する場合
Javaにはブール(クラス)対ブール(プリミティブ)があることがわかります。同様に、整数(クラス)対int(プリミティブ)があります。クラスに対してプリミティブバージョンを使用する場合のベストプラクティスは何ですか?特定の(パフォーマンス?)理由がない限り、基本的に常にクラスバージョンを使用する必要がありますか?それぞれを使用する最も一般的で受け入れられている方法は何ですか?
54 java  class  usage 

3
Visual Studio 2012-Express vs Professional [終了]
Visual Studio 2012 Express EditionとProfessional Editionの機能比較を見つけることができません。現在、試用版のProfessionalバージョンを使用していますが、すぐになくなるので、フルバージョンを購入するかどうかを判断する必要があります。 明らかに、最初に両方を試してExpressエディションが適切かどうかを確認できますが、問題はVisual Studioに多くの機能があることです。存在さえ知っている!または、行が遅くなるまで、行方不明になっているのを見つけませんでした。ここでは、すべての非Expressエディションの機能比較リストのような機能比較リストで本当にできました。ページにExpressエディションが含まれていないのは残念です。

8
並べ替え可能なリストをデータベースに保存する
ユーザーがさまざまなウィッシュリストにアイテムを追加できるウィッシュリストシステムに取り組んでおり、ユーザーが後でアイテムを再注文できるようにする予定です。これをデータベースに保存して高速で混乱を起こさない最善の方法については本当にわかりませんものをきれいにするため)。 最初にpositionコラムを試しましたが、アイテムを移動するときに他のすべてのアイテムの位置の値を変更する必要があるのは非常に効率が悪いようです。 自己参照を使用して前の(または次の)値を参照する人を見てきましたが、繰り返しますが、リスト内の他の多くの項目を更新する必要があるようです。 私が見た別の解決策は、小数を使用し、それらの間の隙間にアイテムを貼り付けるだけです。これはこれまでの最良の解決策のように思えますが、より良い方法が必要だと確信しています。 通常のリストには最大で約20個程度のアイテムが含まれ、おそらく50個に制限されます。並べ替えはドラッグアンドドロップを使用し、おそらく競合状態などを防ぐためにバッチで実行されますajaxリクエスト。必要に応じて(Herokuで)postgresを使用しています。 誰にもアイデアはありますか? 助けてください!

6
「優秀なプログラマは、平凡なプログラマの10倍の生産性を発揮できます」[非公開]
私は偉大なプログラマー(英語ではない)とのインタビューを読んだことがあり、その中で彼は「優秀なプログラマーは平凡なプログラマーの10倍も良い」と言っていました。プログラミング会社は従業員に多くの施設を提供しています。上記の理由により、優秀なプログラマーには非常に大きな需要があるという考えがありました。そのため、企業はそれらをもたらすために多くのお金を払っています。 この声明に同意しますか?それを裏付ける客観的な事実を知っていますか? 編集:質問は経験とは関係ありません。1年の経験を持つ優れたプログラマーについて話す場合、1年の経験を持つ平凡なプログラマーよりも生産性が10倍高いはずです。私は、特定の経験年以降、物事は散逸し始めますが、それは質問の目的ではないことに同意します。

5
テスト可能なコードを促進する設計原則とは何ですか?(テスト可能なコードの設計とテストによる設計の推進)
私が取り組んでいるプロジェクトのほとんどは、開発と単体テストを分離して考えているため、後のインスタンスで単体テストを書くのは悪夢です。私の目的は、高レベルおよび低レベルの設計フェーズ自体の間にテストを念頭に置くことです。 テスト可能なコードを促進する明確に定義された設計原則があるかどうかを知りたい。私が最近理解するようになったそのような原則の1つは、依存性注入と制御の反転による依存性反転です。 SOLIDとして知られているものがあることを読みました。SOLIDの原則に従うと間接的に簡単にテストできるコードになるかどうかを理解したいですか?そうでない場合、テスト可能なコードを促進する明確に定義された設計原則はありますか? テスト駆動開発と呼ばれるものがあることを認識しています。ただし、テストを通じて設計を推進するよりも、設計段階でテストを念頭に置いてコードを設計することにもっと興味があります。これが理にかなっていることを願っています。 このトピックに関連するもう1つの質問は、既存の製品/プロジェクトをリファクタリングし、各モジュールのユニットテストケースを作成できるようにするためにコードとデザインを変更してもよいかどうかです。

8
コンストラクターではなく、JavaとC#の静的mainメソッドが必要な理由
Applicationクラスのインスタンス(エントリポイントを含む)でアプリケーションインスタンスを表すのではなく、(特に)JavaとC#が静的メソッドをエントリポイントとして持つことにした理由について、プライマリソースまたはセカンダリソースからの明確な回答を探しています。適切なコンストラクタであること)。 私の以前の研究の背景と詳細 これは以前に尋ねられました。残念ながら、既存の回答は単に質問を懇願しているだけです。特に、次の答えは私を満足させるものではありません。 コンストラクターがオーバーロードされると、あいまいさが生じます。–実際、C#(およびCとC ++)では異なる署名を使用できるMainため、同じ潜在的なあいまいさが存在し、対処されます。 staticこの方法は、その初期化の順序は明らかである前に、何のオブジェクトをインスタンス化することはできないことを意味します。–これは事実上間違っています。一部のオブジェクトは前にインスタンス化されます(静的コンストラクターなど)。 したがって、親オブジェクトをインスタンス化することなく、ランタイムによって呼び出すことができます。–これはまったく答えではありません。 なぜこれが有効で興味深い質問であると思うのかをさらに正当化するために: 多くのフレームワークは、クラスを使用してアプリケーションを表し、コンストラクターをエントリポイントとして使用します。たとえば、VB.NETアプリケーションフレームワークは、専用のメインダイアログ(およびそのコンストラクター)をエントリポイント1として使用します。 JavaもC#も技術的にmainメソッドを必要としません。まあ、C#をコンパイルするには1つが必要ですが、Javaでもそれは必要ありません。また、どちらの場合も実行には必要ありません。したがって、これは技術的な制限ではないようです。そして、最初の段落で述べたように、単なる慣習としては、JavaとC#の一般的な設計原則に不自然に合わないようです。 明確に言うと、静的メソッドを使用することには特別な欠点はありません。それは明らかに奇妙です。そのため、技術的な根拠があるのではないかと思いました。main 私は単なる推測ではなく、一次または二次情報源からの決定的な答えに興味があります。 1ただし、Startupこれをインターセプトする可能性のあるコールバック()があります。
54 java  c#  history  entry-point 

6
関数とラムダの違いは何ですか?
「関数」と「ラムダ」について少し混乱しています。スキームキーワードlambdaがJavaScriptキーワードfunctionと非常によく似ていることを示す例をいくつか見ましたが、それらがどのように関連しているかはわかりません。 .netでオブジェクトについて話す場合、「関数」と「メソッド」は同じ意味で使用できると言われています。「ラムダ」と「関数」が同じことを意味するのか疑問に思っています。ギリシャ文字のラムダ(λ)がこのサイトの非常に多くのアバターに登場しているのを見て、「ラムダ」には難解な意味があるのだろうか。物事をさらに混乱させるために、.netでは、C#の機能部分は別の関数に渡される関数式を「ラムダ式」と呼んでいます。 また、「ラムダ計算」という用語に漠然と精通しています。 関数とラムダの違いは何ですか?

17
コメントでトートロジーに対処する方法は?[閉まっている]
時々、私が書いているコードの一部が、その名前が基本的にコメントとして繰り返されることを自明である(またはそうであるように思われる)状況に自分自身を見つけます: class Example { /// <summary> /// The location of the update. /// </summary> public Uri UpdateLocation { get; set; }; } (C#の例ですが、質問は言語に依存しないようにしてください)。 そのようなコメントは無意味です。私は何を間違えていますか?間違っているのは名前の選択ですか?このような部分をより良くコメントするにはどうすればよいですか?このようなことに対するコメントをスキップする必要がありますか?

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