ソフトウェア工学

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

14
必要でない場合でも、論理ステートメントで括弧を使用する必要がありますか?
ブール条件がa AND b OR c AND dありAND、操作優先順位がの言語よりも高い言語を使用しているとしますOR。次のコード行を書くことができます。 If (a AND b) OR (c AND d) Then ... しかし実際には、それは次と同等です: If a AND b OR c AND d Then ... 余分な括弧を含めることに賛成または反対する議論はありますか?実用的な経験は、読みやすさのためにそれらを含める価値があることを示唆していますか?それとも、開発者が実際に座って自分の言語の基本に自信を持つ必要があるという兆候ですか?

12
TDDを実行する場合、プライベートメソッドを避ける必要がありますか?
私はちょうどTDDを学んでいます。パブリックメソッドはオブジェクトの整合性を検証するのに十分な情報を提供するので、プライベートメソッドはテストできず、心配するべきではないというのが私の理解です。 私はしばらくの間OOPを理解しました。私の理解では、プライベートメソッドはオブジェクトをよりカプセル化するため、変更やエラーに対する耐性が高まります。したがって、デフォルトで使用する必要があり、クライアントにとって重要なメソッドのみを公開する必要があります。 さて、プライベートメソッドのみを持ち、イベントをリッスンすることで他のオブジェクトとやり取りするオブジェクトを作成することは可能です。これは非常にカプセル化されますが、完全にはテストできません。 また、テストのためにメソッドを追加するのは悪い習慣と考えられています。 これは、TDDがカプセル化と対立することを意味しますか?適切なバランスは何ですか?私は今、私のメソッドのほとんどまたはすべてを公開したいと思っています...

4
noSQLデータベースがSQLよりもスケーラブルなのはなぜですか?
最近、noSQL DBMSについてたくさん読みました。CAP定理、ACIDルール、BASEルール、および基本理論を理解しています。しかし、noSQLがRDBMSよりも簡単にスケーラブルである理由に関するリソースが見つかりませんでした(たとえば、多数のDBサーバーを必要とするシステムの場合)。 制約と外部キーを保持するとリソースにコストがかかり、DBMSが配布されると、はるかに複雑になると思います。しかし、これ以上のものがあると思います。 誰かがnoSQL / SQLがスケーラビリティにどのように影響するか説明してもらえますか?
100 sql  nosql  scalability 

14
コンパイラの最適化に依存するコードを書くのは悪い習慣ですか?
私はいくつかのC ++を学習してきましたが、多くの場合、関数内で作成された関数から大きなオブジェクトを返す必要があります。参照渡し、ポインターを返し、参照型ソリューションを返すことはわかっていますが、C ++コンパイラー(およびC ++標準)が戻り値の最適化を許可していることも読んでいます。そのすべての時間とメモリを節約します。 オブジェクトが値によって明示的に返されると、構文がより明確になり、一般的にコンパイラはRVOを使用してプロセスをより効率的にするようになりました。この最適化に依存するのは悪い習慣ですか?ユーザーにとってコードがより明確で読みやすくなりますが、これは非常に重要ですが、コンパイラーがRVOの機会をつかむと仮定する必要がありますか? これはマイクロ最適化ですか、それともコードを設計するときに留意すべきことですか?
99 c++  performance 

7
テセウスの船がGPLに適用されました-すべての派生部品を交換した場合、プログラムを再ライセンスできますか?
GPLv2 プログラムをに翻訳しましたが、設計どおりに拡張し、その重要な部分を書き直すのは難しいことがわかりました。このプログラムは現在構造的に完全に異なっていますが、いくつかの逐語的に翻訳された関数が使用されています。CPython テセウス・パラドックスの船(ウィキペディアから述べられている)は、「すべてのコンポーネントが置き換えられたオブジェクトが基本的に同じオブジェクトのままであるかどうかの問題を提起します。」 逐語的機能の代替を書くことができた場合、好みのライセンスに再ライセンスできますか? 関連して、進化したアーキテクチャを引き出して別のライセンスで再利用できますか?それはそれだけで非常に役立つと思いますが、GPLライセンスで「汚染」されているという考えは好きではありません。 フォローアップ:私は著作権者に連絡することを決定し、再ライセンスの許可を受けました。時には最良の方法は、プログラムではなく社会的に対話することです!
99 licensing  gpl 

5
抽象クラスが既にあるのに、なぜJava 8のインターフェイスにデフォルトおよび静的メソッドが追加されたのですか?
Java 8では、インターフェイスに実装メソッド、静的メソッド、いわゆる「デフォルト」メソッド(実装クラスがオーバーライドする必要はありません)を含めることができます。 私の(おそらく素朴な)見解では、このようなインターフェースに違反する必要はありませんでした。インターフェイスは常にあなたが満たさなければならない契約であり、これは非常にシンプルで純粋な概念です。今では、いくつかのものが混在しています。私の考えでは: 静的メソッドはインターフェイスに属しません。これらはユーティリティクラスに属します。 「デフォルト」メソッドはインターフェースでまったく許可されるべきではありません。この目的には常に抽象クラスを使用できます。 要するに: Java 8より前: 抽象クラスと通常クラスを使用して、静的メソッドとデフォルトメソッドを提供できます。インターフェイスの役割は明確です。 クラスを実装することにより、インターフェイス内のすべてのメソッドをオーバーライドする必要があります。 すべての実装を変更せずにインターフェイスに新しいメソッドを追加することはできませんが、これは実際には良いことです。 Java 8以降: インターフェースと抽象クラス(多重継承を除く)には実質的に違いはありません。実際、インターフェイスを使用して通常のクラスをエミュレートできます。 実装をプログラミングするとき、プログラマはデフォルトのメソッドをオーバーライドするのを忘れることがあります。 クラスが同じシグネチャを持つデフォルトメソッドを持つ2つ以上のインターフェイスを実装しようとすると、コンパイルエラーが発生します。 インターフェイスにデフォルトのメソッドを追加することにより、実装するすべてのクラスがこの動作を自動的に継承します。これらのクラスの一部は、その新しい機能を念頭に置いて設計されていない可能性があり、これにより問題が発生する可能性があります。たとえば、誰かが新しいデフォルトのメソッドdefault void foo()をinterface Ixに追加すると、同じシグネチャを持つプライベートメソッドをCx実装Ixしているクラスfooはコンパイルされません。 このような大きな変更の主な理由は何ですか?また、追加された新しいメリット(ある場合)は何ですか?

12
例外は例外的な場合にのみ使用されるべきだと言われました。私のケースが例外的であるかどうかを知るにはどうすればよいですか?
ここでの私の具体的なケースは、ユーザーがアプリケーションに文字列を渡すことができ、アプリケーションがそれを解析し、構造化オブジェクトに割り当てることです。ユーザーが無効なものを入力する場合があります。例えば、彼らの入力は人を説明するかもしれませんが、彼らは彼らの年齢が「リンゴ」であると言うかもしれません。その場合の正しい動作は、トランザクションをロールバックし、エラーが発生したことをユーザーに伝えることであり、ユーザーは再試行する必要があります。最初のエラーだけでなく、入力で見つかったすべてのエラーについてレポートする必要があるかもしれません。 この場合、例外をスローする必要があると主張しました。彼は、「例外は例外であるべきだ。ユーザーが無効なデータを入力する可能性があるため、これは例外的なケースではない」と言って同意しませんでした。正しいようです。 しかし、そもそも例外が発明されたのはこのためだと私は理解しています。それはあなたがために使用いたエラーが発生したかどうかを確認するために、結果を検査します。チェックに失敗すると、気付かないうちに悪いことが起こる可能性があります。 例外なく、スタックのすべてのレベルが呼び出すメソッドの結果を確認する必要があり、プログラマーがこれらのレベルのいずれかをチェックインするのを忘れると、コードが誤って続行して無効なデータを保存する可能性があります(たとえば)。そのようになりやすいエラーのようです。 とにかく、ここで言ったことは何でも修正してください。私の主な質問は、例外が例外的であるべきだと誰かが言った場合、私の事例が例外的であるかどうかをどのように知ることができますか?

19
ジュニア開発者を指導する方法
このタイトルは少し広いですが、質問をきちんと尋ねる前に少し背景を説明する必要があるかもしれません。 私は同様の質問がされていることを知って尋ね ここで、既に。しかし、私の場合、私は誰かを指導するべきかどうか、またはその人がソフトウェア開発者になるのに適しているかどうかを尋ねていません。それは私の判断する場所ではありません。私はあからさまに尋ねられたことはありませんが、私と他の仲間のシニア開発者がここから始まる新しい開発者を指導することは明らかです。私はこれにまったく問題はなく、多くの場合、物事に対する新鮮な視点を与えてくれ、その過程で学習することになります。また、誰かが私に何かを教えるのに時間がかかるのは、私のキャリアの初めにどれほど有益だったかを覚えています。 私が「新しい開発者」と言うとき、彼らは大学を卒業したばかりから1年か2年の経験を持っているかもしれません。 最近、私自身とは異なる開発/プログラミングに対する態度を持っていると思われる人々がここから始めました。タスクを完了するのに十分な情報だけを抽出しますが、実際には学習しません。私は彼らと同じ問題を何度も繰り返していることに気付きます。私はこれの一部が人格的なものである可能性があることを理解していますが、彼らが私の翼の下にいる間に最善を尽くして巣から追い出すことは私の仕事だと感じています。 どうすれば十分な情報を伝えて、彼らは学習するが、問題を解決するほど多くの情報を提供できないのでしょうか? 多分: 抵抗が最も少ない道をたどり、本質的に、簡単な方法をとるのではなく強制的に学習させるように設計された質問に対する適切な回答は何ですか? これらの質問はおそらくより一般的な教育上の質問であり、ソフトウェア開発とは特に関係ありません。 注:私は彼らが取り組んでいるタスクについては発言権を持っていません。管理者がタスクを完了します。非常に単純なバグ修正からアプリケーション全体を自分で起動することまで何でも可能です。これは決して理想的なものではなく、明らかにそれ自体の挑戦の挑戦を提示しますが、私はそれが別の質問のために残された最高のトピックだと感じます。ですから、私ができる最善のことは、目の前の問題を解決し、それをより簡単な問題に分解し、コミットログを確認して、犯した間違いを指摘することです。 私の主な目的は次のとおりです。 彼らを助け、彼らがより自立し始めるために必要なツールを与えてください。 それらを正しい方向に導き、早い段階で悪い開発習慣を打ち破ります。 私が彼らと過ごす時間を短くします(上記の性格タイプは、1対1の時間をより多く必要とする傾向があり、IMや電子メールではうまくいきません。一般的にはうまくいきますが、私がいつもやめることはできません。 m作業して、私の歩みを破り、瞬間の通知でエラーをデバッグするのを手伝います。私は自分のプロジェクトを完了する必要があります)
99 culture  mentor 

6
Javaのスタックメモリとヒープメモリ
私が理解しているように、Javaでは、スタックメモリはプリミティブとメソッド呼び出しを保持し、ヒープメモリはオブジェクトの格納に使用されます。 クラスがあると仮定します class A { int a ; String b; //getters and setters } aクラスのプリミティブはどこAに格納されますか? ヒープメモリが存在するのはなぜですか?なぜすべてをスタックに保存できないのですか? オブジェクトがガベージコレクションされると、オブジェクトに関連付けられたスタックは破棄されますか?

8
「\ n」と「\ r \ n」の違い
はい、はい、'\n'UNIXには改行を書くのに対して、Windowsには次の2つの文字シーケンスがあります'\r\n'。これはすべて理論上非常に良いことですが、私の質問はなぜですか?Windowsで復帰文字が余分なのはなぜですか?UNIXがそれを行うことができる場合\n、Windowsがこれを行うのに2文字を要するのはなぜですか? 私はデビッド・ビーズリーのPython本を読んでいて、彼はこう言っています: たとえば、Windowsでは、文字「\ n」を書き込むと、実際には2文字のシーケンス「\ r \ n」が出力されます(ファイルを読み戻すと、「\ r \ n」は単一の「\ n」に変換されますキャラクター)。 なぜ余分な努力が必要なのですか? 私は正直になります。私は長い間違いを知っていましたが、なぜ尋ねるのを悩ませたことはありません。今日はそれが答えられることを願っています。 御時間ありがとうございます。


11
モックオブジェクトを使用するとき、ユニットテストで依存関係の問題をどのように検出しますか?
クラスXがあり、動作X1を検証する単体テストを作成します。Xを依存関係とするクラスAもあります。 Aの単体テストを作成するとき、Xをモックします。つまり、Aの単体テスト中に、Xのモックの動作をX1に設定(仮定)します。時間が経ち、人々はあなたのシステムを使用し、変更を必要とし、Xは進化します。Xを変更して動作X2を表示します。明らかに、Xの単体テストは失敗し、それらを調整する必要があります。 しかし、Aではどうでしょうか?Aの単体テストは、Xの動作が変更されても失敗しません(Xのモックにより)。「実際の」(変更された)Xで実行すると、Aの結果が異なることを検出する方法は? 「それは単体テストの目的ではない」という線に沿った答えを期待していますが、単体テストにはどのような価値がありますか?すべてのテストに合格したときに、重大な変更が導入されていないことを本当に伝えているだけですか?そして、あるクラスの振る舞いが(喜んでまたは不本意で)変化するとき、どのようにすべての結果を(できれば自動化された方法で)検出できますか?統合テストにもっと集中すべきではないでしょうか?

9
CIサーバーで単体テストを実行する意味は何ですか?
CIサーバーで単体テストを実行するのはなぜですか? 確かに、何かがマスターにコミットされる頃には、開発者はすでにすべての単体テストを実行し、新しいコードで発生した可能性のあるエラーを修正しています。それは単体テストのポイントではありませんか?そうでなければ、彼らは壊れたコードをコミットしたばかりです。

6
<b>および<i>タグが非推奨になったのはなぜですか?
この質問は、私の大学の授業で出てきました。教授は、それがより説明したという答えを与えたが、それがあるかのように思える&lt;b&gt;し、&lt;i&gt;その意味ではなく、明示的であり、より入力しやすい&lt;strong&gt;と&lt;em&gt;。 これらのタグの廃止の公式の議論は何でしたか?
98 html  deprecation 

9
Javaプログラムを「ネイティブに表示」するのが難しいのはなぜですか?
ほとんどのJavaアプリケーションは、C / C ++アプリケーションと同じようには見えません。Swingは、見た目が明確になるように意図的に設計されたかもしれませんが、私が読んだ内容に基づいて、たとえばSWTは「ネイティブに見える」ことを試みましたが、完全に成功しません。 私の質問は: Java言語の開発者がネイティブGUIの外観を正確にコピーするGUIシステムを設計するのが難しいのはなぜですか?ネイティブGUIの違いは何ですか?「ネイティブ」ボタンのように見えるボタンを設計するだけの問題ではありませんか?それともそれよりも深くなりますか?
98 java  gui 

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