ソフトウェア工学

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

2
ラッパーに多くのパススルー関数を記述しないようにするにはどうすればよいですか?
共通の基本型の別のクラスをラップするクラスがあります。基本型インターフェースは非常に大きいため、これには多くのパススルー関数の作成が含まれます。これを回避する方法を探しています。 例を作りましょう: Car / \ Volvo VolvoWithTrailer ここで、VolvoWithTrailerの車のインターフェイスにすべての関数を実装し、ラップされたVolvoオブジェクトで適切な関数を呼び出す必要があります。ただし、GetMaxSpeed()は、より低い値を返します。基本的に次のような多くの機能があります int VolvoWithTrailer::GetNumSeats() { return mVolvo.GetNumSeats() } これを解決する明白な方法は、VolvoWithTrailerをVolvoのサブクラスにすることです。 Car | Volvo | VolvoWithTrailer しかし、それは継承よりも構成を優先するという原則に違反しているようです。 これらのすべてのラッパー(言語はC ++)を書くことを他にどのように回避できますか?または-それがあなたの立場である場合-なぜ私はそれらを書くだけですか/単に継承を使用するのですか?これに役立つテンプレートの魔法はありますか?

3
依存関係の逆転の原則:「高レベルのポリシー」と「低レベルの詳細」を他の人に定義する方法は?
私は、依存関係の逆転の原則を(ほとんどは後輩の)同僚に説明しようとしています。ソフトウェアの「高レベルポリシー」と「低レベル詳細」を定義するにはどうすればよいですか?たとえば、ソフトウェアが複数のビジネスアプリケーションのワークフローを自動化する場合、ワークフローの自動化が高レベルのポリシーであり、ビジネスアプリケーションが詳細であると言うのはなぜですか?

1
ベストプラクティスはポーリングしないことですが、スレッドがwait()を呼び出したときに内部でポーリングが発生しないのですか?
別のスレッドがタスクを終了したときにチェックしたいスレッドがあるとします。他のスレッドが終了したという通知を受け取るまでこのスレッドを待機させるwait()タイプの関数を呼び出す必要があることを読みました。そして、これは私たちが高価なポーリングを実行していないことを意味するため、これは良いことです。 しかし、とにかく内部で低レベルでポーリングが行われていませんか?つまり、スレッドをwait()にすると、カーネルは他のスレッドがいつ終了するかをチェックして、最初のスレッドに通知できるようにポーリングを実行しますか? 私はここで何かを見逃していると思いますが、誰かが私を啓発できますか?

3
コンパイラーがヘッダーファイルを2回インポートすることを避けられないのはなぜですか?
C ++の新機能!だから私はこれを読んでいた:http : //www.learncpp.com/cpp-tutorial/110-a-first-look-at-the-preprocessor/ ヘッダーガード ヘッダーファイルには他のヘッダーファイルを含めることができるため、ヘッダーファイルが複数回インクルードされる状況になる可能性があります。 そこで、これを回避するためにプリプロセッサディレクティブを作成します。しかし、私はわからない-なぜコンパイラがちょうどできないのか... 同じものを2回インポートしないのですか? ヘッダーガードはオプションです(ただし、明らかに良い方法です)ので、何かを2回インポートしたいというシナリオがあると思います。そのようなシナリオはまったく考えられませんが。何か案は?
13 c++  compiler 

4
著作権を所有するコードを最初から書き直して、最初のバージョンの権利を失うことなく仕事で使用できるようにする方法は?
まあ、私はそれをオープンソースにしたくない!それが問題です。しかし、私は現在の仕事でそれを使いたいです。会社は私と代替ライセンスに署名することに同意せず、所有権を得るためにすべてをゼロから書き直すように私に言った。:( どうすれば安全な方法でそれを行うことができますか?後で会社に戻って来て、私が書いたコードを使用していると言ってはいけません。私の個人的なプロジェクトや別の仕事でも? ハッシュマップの最初のバージョンのように見せずに、ハッシュマップの2番目のバージョンをどのように書き換えますか?これは私にはちょっと難しいように思えます。:(

1
Resharperが「is」より「as」を好むのはなぜですか?
次のようなコードを書くと、objはローカル変数です。 if (obj is IMyInterface) { var result = (IMyInterface)obj; // .... } Resharperは、次のようなコードに変更することを提案しています。 var result = obj as IMyInterface; if (result != null) { // ... } 前者は、誤ってnull参照の例外が発生する可能性がないため、前者の方が好きです。他の形式を好む理由は何ですか? Resharperがこれを推奨する理由は何ですか?
13 c#  resharper 

1
コードベースを分岐する際のベストプラクティス
分岐コードを回転させる適切なベストプラクティスについて質問があります。 Creative Commons Attribution-NonCommercial-ShareAlike 3.0の下でライセンスされたコードベースを取得し、私のニーズに合わせて大幅な変更を加えました。私のバージョンは他の人に利益をもたらし、再配布したいと思っています。 再配布に関してどのような自由があるのか​​、またはどのような許容範囲があるのか​​はわかりません。プロジェクトの名前を変更できますか?新しいv.1を開始するか、元のバージョン番号から続行する必要がありますか?元の著者に適切な帰属を与えると考えられるものは何ですか?リリースする前に著者に相談し、許可を求める必要があります(ただし、彼は既に認識しています)。

3
「サブライセンス」とは実際にはどういう意味ですか?
まず、サブライセンスの権利が再ライセンスの権利を与えないことは明らかです。 MITライセンス(1ファイル)のライブラリがあるとします。誰かがライブラリにいくつかの機能を追加しますが、それらをGPL(同じ1ファイル)の下に置きます。または、誰かがサブライセンスを取得したい場合、コードを分離する必要がありますか? 誰かがライブラリを使用したい場合、ライセンスはどのように処理されますか? ファイルにGPLの一部の機能がある場合でも、開発者はMITライセンスの機能のみを使用するとします。 GPLライセンスコードのため、彼は自分のアプリケーションをGPLする必要がありますか? 彼はGPLの制限から解放されるためにGPLコードを削除する必要がありますか、それともGPLコードを使用しない限り、MITの許可/制限の下でライブラリを使用できますか?

7
開発チームでさまざまなコーディングスタイルをサポートする方法はありますか
問題:2人の開発者=>インデントに関する3つの意見、改行の有無など 私たちは通常、プロジェクトで3人または4人で作業し、それぞれに独自のコードスタイルがあります。共通の解決策はコードスタイルに同意することであり、誰もが使用する必要がありますが、クリエイティブプログラマーにそれらに合わない訴訟を強いることは望みません。 質問は次のとおりです。各プログラマーが独自のスタイルを生きながら、リポジトリ内に共通のコードベースを持っている方法はありますか?私は、いくつかのgit / svn / whateverプラグインについて考えます。これは、チェックアウト時とコミット時に個人的なスタイルと一般的なスタイルの間で変化します。このアプローチのトリッキーな部分は、ファイルのバージョン間の正しい差分をサポートすることであるように思えます

3
二分木の事前および事後順序走査の有用性
これは非常に単純かもしれませんが、すべてのトラバーサルタイプのバイナリツリー(プレーン、ソート、バランス)のコンテキストだと思いました。 深さ優先予約 深さ優先順 深さ優先順 幅優先 事前注文と事後注文の実際の有用性は何ですか?つまり、事前順序および/または事後順序のトラバーサルが他の2つよりも(いくつかの)利点をもたらすバイナリツリーのタイプおよび/または構成がありますか? AFAICS、特定のタイプとバイナリツリーの構成があります。これらに対して、順序と幅優先が特定の利点をもたらす可能性があります。 バランスの取れたバイナリツリーの場合、深さ優先のトラバースは幅優先と比較して使用するメモリストレージスペースが少なくなります(たとえば、6または7ノードのバランスの取れたバイナリツリーでは、高さが2であるため、深さ優先のトラバーサルは最大で任意の時点で2つのノード、最後のレベルには3つまたは4つのノードがあるため、幅優先スキャンでは、ある時点で最大3つまたは4つのノードを格納する必要があります。この場合、インオーダートラバーサルを使用すると、メモリの使用量が最小になり、ノードを自然な順序で訪問します。 バランスの取れていない二分木の場合、最悪の挿入シナリオに近い場合、幅優先で走査すると、深さ優先の走査に比べて使用するメモリが少なくなります。したがって、この場合、幅優先の方が有利です。順序通りのトラバーサルには、値を自然な順序で訪問するという利点があります。 ただし、トラバース前後が他の2つよりも有利になる状況は考えられません。

2
テスト対象のシステムからクラスを抽出するときに、ユニットテストをリファクタリングする必要がありますか?
いくつかのことを行うこのクラスを作成しました(おそらくこれは単一責任原則の違反です)。私はプロジェクトのいくつかの他の部分が必要であることを今実感作品そのロジックのを、私はそれを公開するつもりだ方法は、私のオリジナルテスト対象システムのうち、クラスを抽出することです。 テストコードを変更せずにこれを行うことができると予想していますが、完了したら、テストはユニットテストではなくなったと主張できます。元のクラスと抽出したクラスをテストします。つまり、テストケースは1つですが、テスト対象のシステムは2つになります。 完了したら、テストコードをリファクタリングすることになっていますか?IE:ExtractedClassTestを作成し、関連するすべてのテストをOriginalClassTestからそこに移動しますか?これは少しリスクが高いようです:プロセスのカバレッジを失う可能性があります。テストを移動するほど簡単ではないかもしれません。等 一方、OriginalClassTestをそのままにしておくと、これがテストメンテナンスの問題であることがわかります。ExtractedClassのテストがどこにあるかを見つけるのは少し混乱するでしょう。あなたの第一印象は、それが存在しないということです。量産コードのリファクタリングが多くなると、これは深刻な問題になる可能性があります。 私はTDDが初めてなので、専門家のアドバイスをお願いします。ありがとう!

4
アップグレード時にオープンソースソフトウェアにパッチを適用することはできませんか?
私は最近、自分のアプリケーションに統合したオープンソースソフトウェアパッケージで、かなり厄介な(確認済みの)バグに遭遇しました。パブリックイシュートラッカーによると、このバグはソフトウェアの最新リリースで解決されています。 特定のモジュールの高価なリファクタリングを避けるためにバグ修正が必要になる場合がありますが、技術的および/または政治的な理由により、最新リリースにアップグレードすることはできません。 行われたコードの変更を調べると、修正は非常に簡単に思えるので、実行可能なオプションは自分でコードにパッチを当て、現在承認されているバージョンのソフトウェアを再コンパイルすることだと感じますが、中傷者はこれがほとんど常に悪い考えだと主張したいそれは危険であり、面倒な複雑さをもたらします。 彼らの目には、このコードの変更は私たちが使用するためだけに行われたため、コードベースの一部である必要があります。つまり、オープンソースソフトウェアをサードパーティの依存関係として導入するのではなく、新しいプロジェクトとして導入して組み込む必要がありますビルドプロセスへの自動ビルド。 私にとっては、ソース管理リポジトリからコードをソース管理リポジトリにプルするため、これは間違っていると思います。その前に行われたコード変更の背後にある歴史を失います。また、実行する必要のあるこのような小さなコードの変更には、非常に複雑すぎるもののように思えます。 この場合、上記を行うのは悪い考えでしょうか?もしそうなら、オープンソースを変更する必要があるとき、理想的な状況は何ですか?

2
私の小さなソフトウェアライブラリは他のライブラリの使用を避けるべきですか?
わずかなクラスとメソッドのみを提供する小さなJavaライブラリをリリースしました。Mavenを使用してプロジェクトを構築したので、すぐにいくつかのサードパーティライブラリを使用して、特に次の目標を達成しました。 commons-lang3(いくつかの一般的なJavaのもの用) slf4j-api(ロギング用) commons-io(ほんの少しのファイル用-文字通り一度ファイルを読む、と思う) 自分のライブラリが他人の目に肥大化しているように見せたくない。フットプリントを最小限に抑えるために、これらのライブラリへの依存を削除する必要がありますか?将来さらに多くのライブラリを使用することを検討する際に、どのタイプのライブラリを避けるのが最善かについてアドバイスはありますか
13 java  libraries  maven 

4
フェルナンドJ.コルバトーの「制約言語」
彼のために1990年チューリング賞を受賞スピーチ、フェルナンド・J・コルバトは、複雑なシステムは、必然的に失敗する理由を記載されています。彼の結論で、彼は失敗の確率を減らすためのいくつかの提案をします。彼は1つのアイデアを次のようにリストしています。 設計または合成のための制約された言語の[U]は強力な方法論です。プログラマーやデザイナーが無関係なアイデアを表現できないようにすることで、起こりうるエラーの領域ははるかに限定されます。 「制約言語」とはどういう意味ですか? しばらくの間、制約プログラミングを検討しました。ただし、制約プログラミングとは、プログラムのソリューション空間を制限することです。これは、プログラマを支援するツールです。Corbatóが言及している機能は、実際にプログラマを制限するものであるか、または少なくとも彼女がより簡潔なコードを書く傾向があるように思われます。 私の第二の考えは、彼が保守的なプログラミング言語に言及しているということです。コルバトーは、1960年代と1970年代に行われた仕事に対してチューリング賞を受賞しました。彼が多くのパンチカードを扱ったことは私の理解です。私はパンチカードを見たことがないので、どのようにプログラムするかわかりませんが、パンチカードのプログラミングは非常にリベラルだと思うかもしれません。型チェック、静的分析などの概念は単に存在しなかったと思います。だから、Corbatóはおそらく開発者が愚かな間違いをするのを制限する言語のアイデアに言及していますか?これも事実ではないようです。安全性チェックとデータモデリングは簡潔さとは関係がありません。それは、彼が「許可しない...関連性のないアイデア」に言及したときに話しているようです。

2
C ++は、共通の共通の祖先を持つ複数の継承をどのように処理しますか?
私はC ++の男ではありませんが、これについて考えることを余儀なくされています。C ++では多重継承が可能ですが、C#ではできないのはなぜですか?(ダイヤモンドの問題を知っていますが、それは私がここで尋ねていることではありません)。C ++は、複数の基本クラスから継承された同一のメソッドシグネチャのあいまいさをどのように解決しますか?そして、なぜ同じデザインがC#に組み込まれていないのですか?

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