ソフトウェア工学

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

5
バイナリ形式をどのようにデバッグしますか?
バイナリビルダーのビルドをデバッグできるようにしたいと思います。現在、私は基本的に入力データをバイナリパーサーに出力し、次にコードを深く掘り下げて、入力から出力へのマッピングを出力し、出力マッピング(整数)を取得して、それを使用して対応する整数を見つけますバイナリで。かなり不格好で、入力と出力の間のマッピングを取得するには、ソースコードを深く変更する必要があります。 さまざまなバリアントでバイナリを表示できるようです(私の場合、入力にかなり近いため、8ビットチャンクで10進数として表示したいと思います)。実際、いくつかの数値は16ビット、いくつかの8、いくつかの32などです。したがって、これらの異なる数値のそれぞれが何らかの方法でメモリ内で強調表示された状態でバイナリを表示する方法があります。 可能なことを確認できる唯一の方法は、実際のバイナリ形式/レイアウトに固有のビジュアライザーを実際に構築する場合です。そのため、32ビット番号がシーケンスのどこにあるべきか、8ビット番号がどこにあるべきかなどを知っています。これは多くの作業であり、状況によっては注意が必要です。だからそれを行う一般的な方法があるのだろうか。 また、現在このタイプのことをデバッグする一般的な方法が何であるか疑問に思っているので、それから何を試すべきかについてのアイデアを得ることができるかもしれません。
11 debugging  binary 

5
依存性注入を使用して一時的な結合を回避する方法
Serviceコンストラクタを介して依存関係を受け取るが、使用する前にカスタムデータ(コンテキスト)で初期化する必要があると仮定します。 public interface IService { void Initialize(Context context); void DoSomething(); void DoOtherThing(); } public class Service : IService { private readonly object dependency1; private readonly object dependency2; private readonly object dependency3; public Service( object dependency1, object dependency2, object dependency3) { this.dependency1 = dependency1 ?? throw new ArgumentNullException(nameof(dependency1)); this.dependency2 = dependency2 …

3
ユーザーがブラウザでコードを編集できないようにするにはどうすればよいですか?
説明 Node.JSアプリケーションを設計しています(完全なWebサイトのようなものです)。アプリは5つのJavaScriptファイルを送信<script>し、それらをリンクするタグを持ちます。 質問 ユーザーと攻撃者がコードをピアリングおよび編集するのを防ぐにはどうすればよいですか? 例は次のとおりです。 Ctrl+ Shift+I ではデベロッパーツール、後藤ソース、(つまり編集するファイルを選択index.html)と書き込み編集 Ctrl+ Sを押すと、ライブ編集が行われます 上記の例が発生しないようにしたい...可能ですか? ここに私が考えたことがあります: 別のクライアント側JavaScriptファイルprevent_keys.jsを作成します Ctrl+ Shift+ をリッスンしIます。 戻るtrue(つまり、キーが押された)場合log、キーになります。 ただし、ユーザーがDevtoolsを直接使用することを停止することはありません。

2
エンティティーコンポーネントシステムは、デカップリング/情報隠蔽のためにひどいものではありませんか?
タイトルは意図的に双曲線であり、それは単にパターンに不慣れなだけかもしれませんが、ここに私の推論があります: エンティティを実装する「通常の」またはほぼ間違いなく簡単な方法は、それらをオブジェクトとして実装し、共通の動作をサブクラス化することです。古典的な問題へのこのリードは、「あるEvilTreeのサブクラスTreeかEnemy?」。多重継承を許可すると、ダイヤモンドの問題が発生します。私たちは、代わりの複合機能を引く可能性TreeとEnemy、さらにその神クラスへのリード線の階層までを、あるいは我々は意図的に私たちの中での行動を残すことができますTreeし、Entityそのことをクラス(彼らは極端なケースではインターフェースを作る)EvilTree自体ことを実装することができます-どのリードにコードの重複がある場合SomewhatEvilTree。 Entity-Component Systemsは、TreeおよびEnemyオブジェクトを異なるコンポーネント(たとえばPosition、Healthおよび)に分割してこの問題を解決し、AIの決定に従ってEntitiyの位置を変更するAIシステムなどを実装しようとしますAISystem。これまでのところは良いですがEvilTree、パワーアップを獲得してダメージを与えることができたらどうでしょうか?まず、a CollisionSystemとa が必要ですDamageSystem(おそらくこれらはすでにあるでしょう)。CollisionSystem通信するために必要なDamageSystem二つのものが衝突するたび:CollisionSystemにメッセージを送信しDamageSystem、それが健康を引くことができるようにします。ダメージもパワーアップの影響を受けるため、どこかに保存する必要があります。PowerupComponentエンティティにアタッチする新しいものを作成しますか?しかし、その後DamageSystemむしろ何も知らない何かについて知る必要があります-結局のところ、パワーアップを拾えないダメージを与えるものもあります(aなどSpike)。この回答と同様のダメージ計算にも使用されるPowerupSystemを修正するStatComponentことはできますか?しかし、現在では2つのシステムが同じデータにアクセスしています。ゲームがより複雑になると、多くのシステム間でコンポーネントが共有される無形の依存関係グラフになります。その時点で、グローバルな静的変数を使用して、すべての定型文を取り除くことができます。 これを解決する効果的な方法はありますか?私が持っていた1つのアイデアは、コンポーネントに特定の機能を持たせることでした。たとえばStatComponent attack()、デフォルトでは整数を返すだけですが、パワーアップが発生したときに構成できます: attack = getAttack compose powerupBy(20) compose powerdownBy(40) これはattack、複数のシステムがアクセスするコンポーネントに保存しなければならない問題を解決しませんが、少なくともそれを十分にサポートする言語があれば、関数を適切に入力できます。 // In StatComponent type Strength = PrePowerup | PostPowerup type Damage = Int type PrePowerup = Int type PostPowerup = Int attack: Strength = getAttack //default value, can be changed by systems getAttack: PrePowerup …

3
直感的でないC#String.Split()実装の背後にある理由
C#ではstring、別のものstringを分割したい場合は、そのようなことをしなければなりません: testString.Split(new string[] { "anotherString" }, StringSplitOptions.None); オーバーロードされたString.SplitMSDNドキュメントから、実装とそのような呼び出しを行う必要がある理由を確認できます。 Pythonから来たので、なぜこのような呼び出しが必要なのかを正しく理解するのは難しいです。Regex.SplitPythonの実装と同様の構文を取得するために使用できましたが、単純なものではパフォーマンス(セットアップ時間)が低下するという犠牲を払う必要があります。 だから基本的に、私の質問は、なぜ地獄ができないのかということです: testString.Split("anotherString"); プロトタイプも実装も提案していないことに注意してください。現在のAPIを考慮して上記のバージョンを実装できない理由を理解しています。私の目標は、上記の構文がもたらす利点を考慮して、そのようなAPIが作成された理由を理解することでした。今のところ、柔軟性はString.Split理にかなった現在の目標のようですが、正直なところ、どこかで何らかのパフォーマンスの向上があると本当に思っていました。私は間違っていたと思います。

6
開発後にソフトウェア設計文書を作成することは正当化できますか?
現在、「ソフトウェア開発」の研究のために卒業に取り組んでおり、外部企業で複雑なソフトウェアを個別に開発する必要があります。これはすべて、構造化された方法で行われ、対応するすべてのドキュメントを作成する必要があります。 このプロジェクトでは、IEEE要件文書(ソフトウェア要件文書(SRS)、ソフトウェアアーキテクチャ文書(SAD)、ソフトウェア設計文書(SDD))を使用することにしました。別の方法で学校で教えられましたが、このプロジェクトでは、開発前に(代わりに)開発後にSDDを作成することにしました。私の推論は: 私がインターンシップを行っている会社は、実験的な方法で、特定の要件を満たす複雑なソフトウェアを作成するよう指示をくれました。プロジェクトの定義で彼らが私に与えた自由の量のために、事前にほとんど何も確実ではなく、開発プロセスの実験中に最もよく遭遇することができます。さらに、私はソフトウェアを個別に作成していますが、このソフトウェア設計を事前に行うことは、社内の他の誰にとってもメリットがありません。プロジェクトの不確実性により、事前に作成したデザインを大幅に変更する必要があることを確信できるため、事前にそれを行うと、後で変更するのにかなりの時間がかかります。これは逆効果だと感じています。 これは、開発後にSDDを作成する正当な理由ですか?そうでない場合、そのための正当な理由はありますか? 編集:SDDを後で作成する理由は、将来の開発者がプロ​​ジェクトを継続するためです。私は卒業期間中にプロジェクト全体を終了することはできませんので、他の開発者は現在のコードベースを継続する必要があります。

3
大規模なソフトウェアプロジェクトの実際の複雑さを測定する方法は?
大学のアルゴリズムコースでは、ハッシュテーブルやクイックソートなど、実際に使用されるさまざまな単純なアルゴリズムの複雑さを正確に計算する方法を学びます。 しかし、今では大規模なソフトウェアプロジェクトで、より高速にしたい場合は、個々のピースを見るだけです-いくつかのネストされたループは、より高速なハッシュテーブルに置き換えられます。より洗練された手法ですが、パイプライン全体の複雑さを計算することはありません。 それを行う方法はありますか?または、実際には、アプリケーション全体をグローバルに考慮するのではなく、アプリケーション全体を高速化するために、高速アルゴリズムを使用して「ローカル」に依存しているだけでしょうか? (私自身は非常に高速であることが知られている多数のアルゴリズムを積み重ねると、全体として高速なアプリケーションになってしまうことを示すのは自明ではないように思えます。) 他の誰かが書いた大規模なプロジェクトを高速化することを任されているため、私はこれを求めていますアプリケーション全体。

2
IComparableインターフェースは時代遅れ/「有害」ですか?
IComparable 一方向にしか機能しない Employeeクラスがあるとしましょう。1つのビューでは、すべてEmployeesを名前でソートし、別のビューではアドレスでソートして表示します。どうやってそれを達成するつもりですか?ではなくIComparable、少なくとも慣用的な方法ではありません。 IComparable ロジックが間違った場所にある を呼び出すことにより、インターフェースが使用され.Sort()ます。Customer名前で並べ替えられたビューでは、並べ替え方法を示すコードはまったくありません。 一方、Customerクラスは、どのように使用されるかを想定しています-この場合、名前でソートされたリストで使用されることを想定しています。 IComparable 暗黙的に使用されます 代替と比較して、比較ロジックがどこで使用されているか、またはまったく使用されているかどうかを確認することは非常に困難です。標準IDEを想定し、Customerクラスから始めて、 へのすべての参照を検索 Customer リストで使用されている参照を見つける それらのリストが.Sort()それらを呼び出したことがあるかどうかを確認します さらに悪いことに、IComparableまだ使用されている実装を削除しても、エラーや警告は表示されません。あなたが得る唯一のものはあなたが考えるにはあまりにもあいまいだったすべての場所で間違った行動です。 これらの問題が組み合わさり、要件が変わります 私がこれについて考えるようになったまさにその理由は、それが私にとって間違っていたからです。私はIComparable2年前からアプリケーションで喜んで使用しています。ここで、要件が変更され、物を2つの異なる方法でソートする必要があります。前のセクションで説明した手順を実行するのは面白くないことに気づきました。 質問 これらの問題により、代替手段ではうまく機能しない有効なユースケースが見られないという点で、またはにIComparable劣ると考えるようになります。LINQまたはLINQ を使用する方が常に良いのですか、それとも、ここで見られない利点/ユースケースがありますか?IComparer.OrderBy() IComparer
11 c#  sorting  comparison 

2
i、j = 1は本当に紛らわしいですか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 2年前に閉店。 1つのライナーでの複数の変数の初期化に関する一般的な議論があります。 たとえば、int i、j = 1; 一部の人々は、両方の変数が初期化されていると誤解する可能性があります 誰かが自分の言語の構文を十分に知って、それについて間違えないようにする必要があると主張できます。別の議論は、開発者が非常に多くの言語を学習し、言語間の特異性の間で間違いを犯す可能性があることです。 しかし、その非常に特定のケースでは、次のように構文i、j = 1が両方の変数を初期化する言語も存在するのだろうか? そうでない場合、その引数は適用されません。

2
ドメインオブジェクトの作成をテストする単体テスト
次のような単体テストがあります。 [Test] public void Should_create_person() { Assert.DoesNotThrow(() => new Person(Guid.NewGuid(), new DateTime(1972, 01, 01)); } ここでPersonオブジェクトが作成された、つまり検証が失敗しないと断言しています。たとえば、Guidがnullの場合、または生年月日が1900年1月1日より前の場合、検証は失敗し、例外がスローされます(テストが失敗したことを意味します)。 コンストラクターは次のようになります。 public Person(Id id, DateTime dateOfBirth) : base(id) { if (dateOfBirth == null) throw new ArgumentNullException("Date of Birth"); elseif (dateOfBith < new DateTime(1900,01,01) throw new ArgumentException("Date of Birth"); DateOfBirth = dateOfBirth; } これはテストのための良いアイデアですか? 注:ドメインモデルの単体テストに古典的なアプローチを採用している場合は、それが何らかの意味を持っています。

5
ストーリーポイントで個々の能力を考慮する必要がありますか?
ストーリーの推定についての私の理解では、法律の「合理的な傍観者」の概念に少し似た、想像上の平均的な開発者の場合のように、ストーリーのサイズを推定する必要があります。つまり、ストーリーのサイズを推定するべきではありません。 例を挙げると、以前の仕事で、私はチームの一部であり、最も自信のあるRuby開発者でした。私のチームメイトは、「XがRubyでどのように機能するかわからないので、何年もかかるだろう」というような議論をして、Ruby関連のストーリーを私よりはるかに大きく見積もっています。 これに対する私の議論は、スプリント計画がチームの能力の出番であるという事実から来ています。これが正しいフォーラムです。「タスクの大半はRubyベースであり、強力なRuby開発者は1人しかいないため、このスプリントの能力は通常よりもわずかに低くなります。」推定中にこれを考慮すると、この側面が倍になります。 回答に権威ある参考文献があれば感謝しますが、単純な意見も素晴らしいでしょう。
11 agile  estimation 

3
異なるサーバーの異なるコードベースでGitを使用するにはどうすればよいですか?
背景:私は最近会社で一連のプロジェクトを継承しており、それらの処理方法に関するいくつかの基本的な問題を整理しようとしています。つまり、以前の開発者(もはや会社にいない)は、いかなる形式のソース管理も使用せず、ほとんどドキュメントを作成せず、実際には適切な開発プロセスもありませんでした。 そのため、私は3つのサーバーに相当するプロジェクト(開発、ステージング、プロダクション)を手に入れました。これらは、主にWebサイト、アプリケーション、および使用するサードパーティアプリケーションとAPI用に構築されたツールから成り立っています。私が最初に考えたのは、変更と修正が行われる前にこれらすべてをGitに取り込むことでしたが、それを行う最善の方法を見つけるのは困難です。 これまでの多くの開発は、運用サーバーで直接行われたため、各サーバーのコードベースに格差が生じました。すべての違いがどこにあるのかすぐにはわかりません-開発/ステージングに引き継がれないバグ修正と、ステージング/プロダクションに移行していない開発の新機能が見られます。 質問:これらを整理してGitに移動する最良の方法は何でしょうか?コードの違いに対応するためにレポジトリ/ブランチをどのように構成しますか? 実稼働サーバーコードのクローンから開発を継続し、開発/ステージングコードベースを履歴参照として保持することを検討しました。とにかく開発/ステージングコードについて何も知らないことを考えると、これは潜在的に最初のポイントになるでしょうか?各Webサイト、ツール、スクリプトセットなどの本番サーバーのリポジトリを作成し、既存の開発/ステージングコードのブランチを作成するだけで、新しい開発は本番サーバーのコードベースから分岐します。これは理にかなっていますか?

2
ゲーム開発を扱う場合、ソフトウェアテストは異なりますか?
一般にソフトウェア開発とゲーム開発の違いについてこの論文を読んでいて、著者はソフトウェアテストに関していくつかの良い点を指摘しました。たとえば、 ...ゲーム開発者は、ゲームデザイナーの創造的な欲求の変化に直面して、これらのテストが急速に陳腐化するため、自動テストの使用をためらいます。 それで、この読書は、ゲームを扱っている/テストしているときに、ソフトウェアテストの他のどの側面を異なるまたは特定と見なすべきかを考えさせましたか?誰かがこれを経験したことがありますか、それについて何か他のことを聞いたことがありますか?

5
例外を設計する方法
私は非常に簡単な質問に苦労しています: 現在、サーバーアプリケーションで作業しています。例外の階層を作成する必要があります(一部の例外は既に存在しますが、一般的なフレームワークが必要です)。どうすればこれを開始できますか? 私はこの戦略に従うことを考えています: 1)何が問題なのでしょうか? 何かが求められますが、これは許可されていません。 何らかの質問があり、許可されていますが、パラメーターが間違っているため機能しません。 何らかの質問があり、許可されていますが、内部エラーのために機能しません。 2)リクエストを開始しているのは誰ですか? クライアントアプリケーション 別のサーバーアプリケーション 3)メッセージ処理:サーバーアプリケーションを扱っているので、メッセージの送受信がすべてです。それでは、メッセージの送信がうまくいかない場合はどうでしょうか? そのため、次の例外タイプが発生する場合があります。 ServerNotAllowedException ClientNotAllowedException ServerParameterException ClientParameterException InternalException(サーバーがリクエストの送信元を知らない場合) ServerInternalException ClientInternalException MessageHandlingException これは例外階層を定義するための非常に一般的なアプローチですが、いくつかの明らかなケースが欠けているのではないかと心配しています。私がカバーしていない分野についてのアイデアがありますか、この方法の欠点を知っていますか、この種の質問に対するより一般的なアプローチがありますか(後者の場合、どこで見つけることができますか)? 前もって感謝します
11 design  c++  exceptions  stl 

5
メモリ管理言語の参照カウントパターン?
Javaと.NETには、メモリを管理するすばらしいガベージコレクターと、外部オブジェクト(Closeable、IDisposable)を迅速に解放する便利なパターンがありますが、それらは単一のオブジェクトによって所有されている場合のみです。一部のシステムでは、リソースは2つのコンポーネントによって個別に消費される必要があり、両方のコンポーネントがリソースを解放するときにのみ解放される場合があります。 最新のC ++ではshared_ptr、を使用してこの問題を解決しますshared_ptr。すべてのが破棄されると、リソースが確定的に解放されます。 オブジェクト指向の非決定論的にガベージコレクションされたシステムに単一の所有者がいない高価なリソースを管理およびリリースするための文書化された実証済みのパターンはありますか?

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