ソフトウェア工学

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

4
静的メソッドを使用しているメソッドを単体テストするにはどうすればよいですか?
次のように、配列用の拡張メソッドをC#でbyte16進文字列にエンコードする拡張メソッドを記述したとします。 public static class Extensions { public static string ToHex(this byte[] binary) { const string chars = "0123456789abcdef"; var resultBuilder = new StringBuilder(); foreach(var b in binary) { resultBuilder.Append(chars[(b >> 4) & 0xf]).Append(chars[b & 0xf]); } return resultBuilder.ToString(); } } 次のように、NUnitを使用して上記のメソッドをテストできます。 [Test] public void TestToHex_Works() { var bytes = new …

3
レガシーコード(わかりません)の単体テストを作成するにはどうすればよいですか?
進む この質問をする前に、SEに関する多くの関連する質問を含め、多くのことを読みました。 (ソフトウェアエンジニアリングSE)目的がわからないコードのテストを書く (ソフトウェアエンジニアリングSE)ユニットテスト初心者チームはユニットテストが必要 (ソフトウェアエンジニアリングSE)レガシーコードを自動テストで改造するためのベストプラクティス (ソフトウェアエンジニアリングSE)大規模なレガシーシステムを単体テストする方法 (ブログ投稿)単体テスト環境をモックアップする方法 しかし、助けを求めて読んだ後、かゆみはまだ引っかかれていないと感じざるを得ません。 TL; DR 実行、シミュレーション、読み取り、または簡単に理解できないレガシーコードの単体テストを作成するにはどうすればよいですか?おそらく意図したとおりに機能するコンポーネントに役立つ回帰テストは何ですか? 全体像 私は大学院に移行しているので、再び夏の帰国研修生です。私の仕事には次の要件が含まれます。 特定の製品について、ソフトウェアチームが既存のプロジェクトとの互換性を失うことなくIDEおよびJUnitバージョンをアップグレードできるかどうかを評価します。 既存のJavaコード(主にJavaではない)の一部のコンポーネントの単体テストを開発します。ユニットテストとTDDは、使用する必要がある非常に貴重なツールであることをソフトウェアチームに納得させたいと思います。(現在、0%のコードカバレッジがあります。) どういうわけか、重要なシステムのカウボーイコーディングの時代を終わらせてください。 ソースコードのコピーを入手した後、この製品の機能と動作を理解できるように、ビルドして実行しようとしました。できませんでした。私は上司に自分のやり方を尋ね、実際に機能するビルドスクリプトを含む、それをビルドできる新しいスタンドアロンマシンを発行されました。彼らの予想通り、製品コードは設計された組み込みシステムでのみ実行されるため、それも機能しませんでした。しかし、彼らはこの目的のためにシミュレーターを持っているので、彼らはシミュレーターを手に入れ、このマシンにそれを置いてくれました。シミュレータも機能しませんでした。代わりに、私は最終的に特定の画面のGUIのプリントアウトを受け取りました。また、700,000以上のJava LOC内のどこにもコードコメントがないため、把握がさらに困難になります。さらに、彼らのプロジェクトが新しいIDEと互換性があるかどうかを評価する問題がありました。特に、彼らのコードは、彼らが使用しているまさにそのIDEバージョンに適切にロードされませんでした。 私の在庫は次のようになっています: NetBeans 8、9、10、11 JUnit 4、5 特定の製品のソースコード(700,000以上のJava LOCを含む) 実質的にコードコメントはありません(場合によっては署名) 既存のテストはありません GUIウィンドウの物理的な写真 画像内のコンポーネントについて説明していないソフトウェア設計ドキュメント(109ページ) 少なくとも理論的には実行可能なテストを書くのに十分です。そこで、このコンポーネントについて基本的な単体テストを試しました。しかし、モデル、マネージャー、DB接続など、依存関係として持つオブジェクトを初期化できませんでした。基本的な単体テスト以外にJUnitの経験はあまりないので、次のセクションに進んでください。 私の読書から学んだこと モッキング:単体テストを作成する場合、本番環境での依存関係のために、モック変数を用意する必要がありますsetUp。 ここの誰もがマイケルフェザーズの著書「レガシーコードを効果的に使用する」を寛大に提案しています。 回帰テストは、おそらく開始するのに適しています。統合テストを試すのに十分な兵器がないと思います。回帰テストは、ソフトウェアチームにすぐに満足感を与えるでしょう。ただし、私は彼らの既知のバグにアクセスできません。しかし、私はたぶん尋ねることができました。 そして今、私がまだ疑問として持っている不確実性を明確にする試み。基本的に、私はこれらのテストを作成する方法の一部を理解していません。(おそらく)上司からこれ以上のガイダンスを受け取らないと想定すると、このコンポーネントの機能を理解するだけでなく、どのテストが回帰テストとして実際に役立つかを判断するのは私の球場です。 このようなプロジェクトに携わってきた専門家として、このような状況で単体テストを作成する方法について何かアドバイスはありますか?

1
C ++プログラムでユーザースクリプトを安全にサンドボックス化する
私はC#で個人的なプロジェクトに取り組んでいますが、その目的は、ユーザーが他のユーザーが作成したスクリプトを実行して、そのスクリプトのアクセス許可を制限できるようにすることです。私のプログラムは、サードパーティのライブラリを使用してスクリプトをコンパイルし、.NETコードアクセスセキュリティメカニズムを使用してそれらをサンドボックス化し、ユーザーが付与したい権限のみがスクリプトにあることを確認します。 大まかに言って、私のセキュリティ要件は次のとおりです。 ユーザーは、信頼できないスクリプトのアクセスを、すべてのファイルシステムアクセスの禁止を含む、ファイルシステムの特定の部分のみに制限できる必要があります。 ユーザーは、信頼できないスクリプトのネットワーク接続を、すべてのネットワーク接続の禁止を含め、特定のIPアドレスまたはホスト名のみに制限できる必要があります。 ユーザースクリプトがホストアプリケーションをハングまたは終了させることができても問題ありませんが、ユーザースクリプトは権限の制限を回避できてはなりません(つまり、サービス拒否は問題ありませんが、違反は許されません)。 私は一種の個人的な演習として、C ++で同様のことをしようと考えています。明らかに、ユーザースクリプトがLuaのようなスクリプト言語で書かれている場合でも、ネイティブコードを直接実行すると、状況はさらに複雑になります。 最初に考えられるアプローチは、スクリプト環境の標準ライブラリ関数に独自のフックを挿入することです。たとえば、スクリプト言語がLuaの場合、io.openを通常に公開する代わりに、スクリプトの権限に対して引数をチェックするラッパーを公開してから、それらを元の実装に渡す必要があります。 このアプローチに対する私の懸念は、セキュリティを担当する自分自身のコードの量が大幅に増加することです。そのため、私が書いた潜在的なセキュリティの脆弱性があります。言い換えると、.NET CASを使用する場合、自分のサンドボックスコードを信頼する必要があるのではなく、Microsoftがサンドボックスコードでうまく機能したことを信頼できます。 私が知らない代替案はありますか?
8 c++  security 

1
使用時のPythonモジュールのインポート
私自身の個人的なPythonライブラリでは、次のようなことがよくあります。 class MyClass: # ... def plot(self): import someGraphicsLibrary as graphicslib graphicslib.plot(self.data) その理由は、初期化にsomeGraphicsLibraryは時間がかかり、使用するライブラリの1つでは数秒かかるためです。このクラスを使用するときは常に結果をプロットする必要はありません。そのため、実際に使用されるまではインポートしないのが理にかなっています。 これは正常に動作するようですが、他の人のコードでは見たことがないと思います。だから私の質問は、これが良い習慣と考えられるかどうかです。このように物事を行うときに予想される隠れた落とし穴はありますか?
8 python 

2
これは基本的な数独ゲームのユーザーストーリーとしてカウントされますか?
私は、アジャイルソフトウェア開発アプローチを使用して、基本的な数独ゲームのユーザーストーリーを作成しようとしています。 ユーザーストーリーの背後にある概念を理解しましたが、理解を深めるための例を得ることができるのかと思っていました。 言うでしょう 私は数独の熱心なプレイヤーとして、さまざまな難易度で複数のレベルを持ちたいと思っています。 新しいプレーヤーとして、私は基本を教えてくれるゲームの紹介レベルが欲しいです。 ユーザーストーリーとしてカウントしますか?

4
ソフトウェア設計者は開発のどの部分を行うべきですか?[閉まっている]
閉まっている。この質問はトピックから外れています。現在、回答を受け付けていません。 この質問を改善してみませんか? 質問を更新して、ソフトウェアエンジニアリングスタック交換のトピックになるようにします。 8か月前に閉鎖。 私のマネージャーは最近私を「ソフトウェアデザイナー」に昇進させました。このタイトルが存在することを知りません。私の知る限り、SAは高レベルのコード設計を作成し、図を作成します。 高レベルのコード設計を理解するのに苦労しています。私のマネージャーによると、すべてのクラスとそれらのクラス内のすべてのメソッドを設計する必要があります。つまり、コード構造全体を設計し、チームに各関数またはクラスの機能を実装させます。たとえば、CRUDシステムでは、どの関数を使用するか、どのクラスを作成するかを計画できるはずです。 私のソフトウェア設計の経験を考えると、これを実行することは非常に不可能であることがわかりました。開発者として、私は常に自分のクラスを作成し、自分の関数を定義して実装しています。他の人のために機能を設計した経験はありません。 私の質問は: これは一般的ですか?非常に大規模なシステムの場合、コードベースは常に変更されませんか? これはできますか? ここでは明白で愚かな質問をしているのかもしれませんが、私はこれまで常に正規の開発者であり、システム全体の設計経験はありません。

5
依存関係注入(C#)をいつ使用するべきか[終了]
休業。この質問には、より焦点を当てる必要があります。現在、回答を受け付けていません。 この質問を改善してみませんか?質問を更新して、この投稿を編集するだけで1つの問題に焦点を当てます。 10か月前に閉鎖。 依存性注入(DI)の概念を確実に理解したいと思います。まあ、私は実際にコンセプトを理解しています。DIは複雑ではありません。インターフェイスを作成し、それを使用するクラスにインターフェイスの実装を渡します。これを渡す一般的な方法はコンストラクターですが、セッターやその他のメソッドで渡すこともできます。 DIをいつ使用するかがよくわかりません。 使用法1:もちろん、インターフェースの実装が複数ある場合にDIを使用するのは論理的であるようです。SQL Serverのリポジトリがあり、次にOracleデータベースのリポジトリがあります。どちらも同じインターフェースを共有し、実行時に必要なインターフェースを「挿入」します(これが使用される用語です)。これはDIではありません。ここでは基本的なOOプログラミングです。 使用法2:特定のメソッドをすべて持つ多くのサービスを持つビジネスレイヤーがある場合、各サービスのインターフェイスを作成し、これが一意であっても実装を注入することをお勧めします。これはメンテナンスに適しているからです。これは私が理解できないこの2番目の使用法です。 私は50のビジネスクラスのようなものを持っています。それらの間で共通するものはありません。いくつかは、3つの異なるデータベースでデータを取得または保存するリポジトリです。一部のファイルの読み取りまたは書き込み。一部は純粋なビジネスアクションを行います。特定のバリデーターとヘルパーもあります。一部のクラスは異なる場所からインスタンス化されるため、課題はメモリ管理です。バリデーターは、いくつかのリポジトリーや、同じリポジトリーを再度呼び出すことができる他のバリデーターを呼び出すことができます。 例:ビジネスレイヤー public class SiteService : Service, ICrud<Site> { public Site Read(Item item, Site site) { return beper4DbContext.Site .AsNoTracking() .SingleOrDefault(y => y.SiteId == site.Id && y.ItemId == item.Id) } public Site Read(string itemCode, string siteCode) { using (var itemService = new ItemService()) …

4
古いコミットで検出された脆弱性を修正する必要がありますか?
GitHub上の私のプロジェクトの1つが、この場合は中程度の重大度の脆弱性アラートを受け取りました。 この脆弱性は、古いバージョンのコードの依存関係で検出されました。現在のバージョンでは、この依存関係は使用されなくなりました。それでもなお、古いコミットがチェックアウトされて実行される可能性があり、アプリケーションを開いて脆弱性を悪用する可能性があります。 ソフトウェアエンジニアリングの観点から、以前のコミットに戻って変更することをお勧めします。つまり、現在使用されていない依存関係を脆弱性の修正を含む新しいバージョンに更新しますか?または、コミット履歴をそのままにしておく方が良いですか?

4
アジャイルチームのすべてのメンバーはソフトウェア開発者である必要がありますか?
私は最近、会社でアジャイル手法を使い始めました。私はアジャイルにかなり慣れていないので、アジャイルの基本原則に従って、実装方法が正しいかどうか疑問に思います。 以前は、ビジネスアナリスト、QAテスター、ソフトウェア開発者などの役割がありました。しかし現在、経営陣はこれらの役割を削除する必要があると決定し、誰もがソフトウェア開発者として働くことになります。 実際には、これは、1人のソフトウェア開発者が以前に3つの別々の役割(つまり、1人のビジネスアナリスト、1人のQAテスター、および1人のソフトウェア開発者)と同じ責任を持つことを意味します。 彼らはこれがアジャイルであるという事実で変更を正当化します。これは他の企業もアジャイルを実装する方法ですか?

2
カレー機能の実際の使用例は?[閉まっている]
休業。この質問には、より焦点を当てる必要があります。現在、回答を受け付けていません。 この質問を改善してみませんか?質問を更新して、この投稿を編集するだけで1つの問題に焦点を当てます。 2年前休業。 カレー機能の実際の使用例を見つけ、カレーを使用するメリットを得るのに苦労しました。 カレー機能をググると、次のような例がよく見られます let add = x => y => x + y; let add10 = add(10); console.log(add10(20)); この例ではカレーを使用することの価値が本当にわからないのです。 このSO /programming/113780/javascript-curry-what-are-the-practical-applicationsの回答を読んだ後でも、それを使用する利点がわかりません。 たとえば、最高得点の回答はコンバーターの例ですが、別の回答が示すように、その例はカレーなしで書き直すことができます。 私も答えを読みますカレーの利点は何ですか?(議論はjavascriptに限定されていませんが)カリーバージョンはjsで)カリーなしで書き直すことができるという感覚を私はまだ得ています。 それで、誰かが私にJavaScriptでカレーを使用することの「本当の」利点/利点を示すことができますか? ----更新---- 私が得た答えを除いて、私はここでログの例を見つけ、それを使用する利点を示しています。

2
関数の出力を確認するために新しい変数を作成することは良い習慣ですか?
次の2種類の実装を検討してください。 public int add(int x, int y) { return mysteriousAdd(x, y); } public int add(int x, int y) { int output = mysteriousAdd(x, y); return output; } 私の同僚は、デバッグ中にmysteriousAdd返される変数を見ることができ、スタックに追加の変数を作成するのはそれほどオーバーヘッドがないため、2番目の実装の方が優れていると述べています。今日のほとんどのコンパイラーは、追加の変数なしでデバッグ中に関数の応答を示すことができ、スタックでの追加の変数の作成も回避しているため、最初の実装の方が適切であり、彼のポイントはそれほど有効ではないと思います。 スタックでの参照変数の作成は安価な操作ですか?上記の2つの方法のうち、コーディングに適しているのはどれですか。その理由は何ですか。

5
REST APIを「正しい」方法で実行しなかった場合の結果?
私はこの方法でこの質問をします-私のREST APIを「正しい」方法で実装しないことのソフトウェアエンジニアリングの懸念は何ですか? 「正しい」方法とはどういう意味ですか?まあ、私が正しい方法についての私の認識を説明できるようにしてから、私がそれをどのように行っているかを説明します(また、JSON REST APIについて話していると仮定します)。 正しい方法 無国籍。これは私が得る部分です。クライアントは常に100%いつまでも状態を維持します。それはサーバーの仕事ではなく、クライアントの仕事です。 各動詞の予想されるアクションと応答: GET-完全に指定されたリソースを取得します。リクエストの承認またはクエリパラメータのいずれかによってのみ制限されます。これにより、プロセス内のリソースが変更されることはありません。 POST-リソースの説明全体(JSONオブジェクトなど)を指定すると、リソースを作成し、日付やIDなどのサーバー側のプロパティも作成してそのリソースを返します。 DELETE-指定されたリソースを削除し、応答として何らかの200 OKのみを与えます PUT -指定されたオブジェクト全体宣言入力として、入力で与えられたフィールドのそれぞれにリソースのすべてのフィールドを更新し、特定の場所でリソースを更新します。明確にするために、これはオブジェクト全体が入力として渡されることを期待しています。更新されたリソース全体が、すべてのフィールドとともに(許可またはその他の入力フラグに従って)返されます。 PATCH-リソースの変更が必要なフィールドのみを指定して、入力として指定された指定されたリソースのフィールドのみを更新します。(これは私が不明瞭なところです):リソース全体が返されますか?(または、更新されたフィールドだけですか?Dunno。気にしないでください。) リソースパス。リソースの相互関係を考えると、リソースパスは次のいずれかになります。 / parentresource /:id / parentresource /:id / childresource / parentresource /:id / childresource /:childId / parentresource /:id / childresource /:childId / subresource /:subresourceId(この例では、サブリソースは、親リソースに属する子リソースに属しています)。 やりたいこと 上記は、REST APIがどのように機能するかについての私の理解です。次に、上記のバリエーションのいくつかをリストします。 PUT / PATCH-変更のためにリソース全体を渡すポイントは何ですか?リソースの変更にはPUTのみを使用し、更新するフィールドのみを渡します。その結果、パッチを使用する必要はありません リソースパス-アプリケーションでGUIDを使用しています。その結果、それらは世界的にユニークになります。単独でサブリソースを一意に参照できるのに、親リソースを含む完全なリソースパスが必要なのはなぜですか?以下のような: /サブリソース/:subresourceId :もし私のような完全なパスが必要となるサブリソースを参照しようとし、それを「正しい」やり方をやっていた / parentresource …
8 design  rest  api  standards 

5
タスクを自動化した後、反復タスクのストーリーポイントのサイズは変わりますか?
スクラムの状況は次のとおりです。 特定のタスク(バックエンドのデータテーブルの実装)は頻繁に発生します 多くの場合、テーブルには類似しているがカスタム機能があります 各テーブルの実装には約1週間かかります(8ストーリーポイント) 最終的に、チームは4週間かけて再利用可能なコンポーネントを作成します 新しいテーブルの作成はほぼ瞬時に 私の質問: 出力/複雑度が変更されていないため、新しいテーブルストーリーはまだ8ですか?それとも、労力が最小限なので1ですか? 私の研究:ジェフサザーランドとスクラムトレーニングを受けたとき、ストーリーポイントは出力を測定するため、ストーリーはまだ8であるという理解を残しました。PMはまだ同じテーブルを取得していますが、5倍速く配信されています。それは本当の速度の改善です(同じ作業を行うがより高速) しかし、私の理解が正しいことを確認したいと思います。何か助けはありますか?正式なスクラムの定義を探しています。私はscrum incのサイトを調査し、「半分の時間で2倍の作業を行うアート」を試してみましたが、私の理解が正しいか間違っているかを示すドキュメントが見つかりません。 ありがとうございました! 更新 私は本当に正式なスクラム当局による文書へのリンクを探していました。以下の答えの多くは単なる人々の意見なので、この質問は誤解を招くと思います。

8
現在のスレッドがメインスレッドであることを表明する単体テスト
問題は、現在のスレッドがメインスレッドであることを表明する単体テストを記述することには意味があるのでしょうか。長所短所? 最近、サービスのコールバックのために現在のスレッドをアサートする単体テストを見ました。いいアイデアだとは思いませんが、もっと統合テストだと思います。私の意見では、単体テストはメソッドを個別にアサートする必要があり、サービスの利用者の性質については知らないはずです。 たとえば、iOSでは、このサービスのコンシューマーは、デフォルトでメインスレッドでコードを実行するための制約を持つUIであることが意図されています。

2
このクラスを開閉するのが難しい
これが私の問題です。ゲームパッド、よくレースする、ジョイスティックなど、さまざまなHIDデバイスからの入力を読みたいのですが、ほとんどすべてのゲームコントローラです。問題は、それらすべてに異なる入力があることです。 ゲームパッドにはボタン、スイッチ、スティックがあり、レースウェルにはギアスティックが付いている場合があります。これらのさまざまなコンポーネントをすべて3つに抽象化して、可能なすべての組み合わせを持つ基本クラスを作成するのではなく、 abstract class Device { public Buttons Buttons; public Axes Axes; public Switches Switches; public GearSticks GearSticks; //many more } 私は今持つことができます: abstract class Device { public Buttons Buttons; //on or off public Axes Axes; //range [-100%:100%] public Switches Switches; //multiple states } すべての入力を3種類に抽象化できるため、すべての具体的な実装を介して拡張に対して開かれている間、クラスを閉じたままにできるため、最初はこれに満足しました。 しかしその後、私は自分自身にかかわらず、私は避けられないが遅延していた場合にどのような?ある日Deviceクラスに別のフィールドを追加する必要がある場合はどうなりますか?トラックボールのようなものはサポートしていません! このクラスを将来証明できる方法はありますか?私がそれを見る方法では、私はこのようなものになるでしょう: public Device1 : Device …

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