ソフトウェア工学

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

2
C / C ++プロジェクトの依存関係を適切に管理する方法は?
3〜4種類のオープンソースC / C ++ライブラリを使用するプロジェクトがあります。 これらのライブラリをいくつかのプラットフォーム用にビルドし、プロジェクトのさまざまなプラットフォーム用のインクルードファイルとスタティックライブラリをチェックインしました。 しかし、私はいくつかの問題に苦労しています。これらのプロジェクトはすべて、依存関係管理に関するものです。そして、私はベストプラクティスのアドバイスを探しています。 1)何を使用しているのか正確に知るにはどうすればよいですか? 静的libのバージョンを取得する方法がありません。結果として、使用している静的libのバージョンを何らかの方法で追跡する必要があります(ビルド元のコミットのSHAである可能性があります)? これらのライブラリをいつアップグレードするかを理解する必要がある場合、これは特に重要です。 2)ビルドを再現するにはどうすればよいですか? 特定のプラットフォーム用の特定のライブラリーを構築するのに苦労したかもしれません。それを理解するのにしばらく時間がかかりました。 次回同じライブラリを作成する必要があるのは、半年後(なんらかの理由でアップグレードが必要になるとき)になる可能性があります。しかし、そのときまでに、何がどのライブラリで構築されたのかはっきり覚えていません長い間なくなります。 3)これらのライブラリをフォークしてソースコードのコピーを作成する必要がありますか? これはそれほど問題ではありません。しかし、それはまだ問題です。ビルドが再現可能であることを確認するのは良いことです(そのようなソースコードが必要です)。

3
Java 8では、メソッド参照式や、関数型インターフェースの実装を返すメソッドを使用するほうが文法的に優れているでしょうか?
Java 8では、関数型インターフェイスの概念と、関数型インターフェイスを取るように設計された多数の新しいメソッドが追加されました。これらのインターフェースのインスタンスは、メソッド参照式(例SomeClass::someMethod)とラムダ式(例(x, y) -> x + y)を使用して簡潔に作成できます。 同僚と私は、どちらのフォームを使用するのが最適かについて意見が異なります(この場合、「最適」は、「最も読みやすい」と「標準的な慣行に最も近い」に要約されます。同等)。具体的には、次のすべてが当てはまる場合です。 問題の関数は単一のスコープの外では使用されません インスタンスに名前を付けると、読みやすさが向上します(たとえば、ロジックが何が起こっているかを一目で確認できるほど単純であるのとは対照的) ある形式が他の形式よりも好まれるプログラミング上の理由は他にはありません。 この問題についての私の現在の意見は、プライベートメソッドを追加し、それをメソッド参照で参照することが、より優れたアプローチであるというものです。これはこの機能がどのように使用されるように設計されているかのように感じられ、メソッド名とシグネチャを介して何が起こっているかを伝える方が簡単に思われます(たとえば、「boolean isResultInFuture(Result result)」は明らかにブール値を返すと言っています)。また、クラスの将来の拡張で同じチェックを利用したい場合に、プライベートメソッドを再利用しやすくしますが、機能インターフェイスラッパーは必要ありません。 私の同僚の好みは、インターフェイスのインスタンスを返すメソッドを用意することです(たとえば、 "Predicate resultInFuture()")。私には、この機能の使用方法が完全ではないように感じられ、少し不格好に感じられ、名前を付けることで意図を実際に伝えるのが難しいように思われます。 この例を具体的にするために、異なるスタイルで記述された同じコードを次に示します。 public class ResultProcessor { public void doSomethingImportant(List<Result> results) { results.filter(this::isResultInFuture).forEach({ result -> // Do something important with each future result line }); } private boolean isResultInFuture(Result result) { someOtherService.getResultDateFromDatabase(result).after(new Date()); } } …

2
MVVMでは、ViewModelまたはViewが新しいビューの作成を担当する必要がありますか?
私のWPFアプリケーションで、新しいビューを作成します。ViewModelまたはModelのどこでそれを行うべきですか? アプリケーションは(今のところ非常にシンプルです)、1つの「送信」ボタンを備えた1ウィンドウフォームのようなツールです。チェックボックスの1つが選択されている場合、同じViewModelを使用する新しいウィンドウがポップアップし、追加の詳細をユーザーに尋ねます。この質問の目的のために、表示/非表示のパネルなどの別のアプローチを考慮せずに、新しいウィンドウのアプローチのみを検討してみましょう。 理想的には、Viewにはコードがないはずです。さらに、Viewにはロジックが含まれていないため、VMは最初に新しいビューの作成が必要かどうかを確認する必要があり、必要な場合はこの責任をViewに戻して、コードの膨張につながります。 一方、ViewModelで新しいビューを作成すると、ViewModelがViewについて何も認識してはならないという原則に違反します。 では、ViewまたはViewModelで新しいビューを作成する方が良いでしょうか?
11 c#  design  wpf  mvvm 

1
テストパッケージの命名規則
実際には、テストするパッケージと同じようにテストパッケージに名前を付けています。したがって、最終的には次のような構造になります。 src/main/java com.hello.world helloWorld.java src/test/java com.hello.world helloWorldTest.java パッケージ名を指定するだけでは「テスト」と「テストする」を区別できないので、私は常にこれがかなり賢いとは思えませんでした。一方、これがどういうわけか問題になるケースは、実際には見つかりませんでした。(テストケースとソースクラスの)両方のパッケージに同じ命名規則を使用することは良い習慣ですか?そうでない場合、より良いアプローチは何でしょうか?
11 naming  packages 

5
集約間の参照の検証をどのように処理しますか?
集計間の参照で少し苦労しています。集合体Carが集合体への参照を持っていると仮定しましょうDriver。この参照は、を使用してモデル化されCar.driverIdます。 ここでの問題は、でのCar集計の作成を検証するためにどこまで行けばよいかCarFactoryです。渡さDriverIdれたものが既存のものを 参照していると信頼Driverすべきですか、それともその不変条件をチェックすべきですか? チェックのために、私は2つの可能性を見ます: 自動車工場の署名を変更して、完全なドライバーエンティティを受け入れることができます。その後、ファクトリーはそのエンティティーからIDを選択し、それを使用して車を構築します。ここでは、不変条件が暗黙的にチェックされます。 私はの参照かもしれないDriverRepositoryではCarFactory、明示的に呼び出しますdriverRepository.exists(driverId)。 しかし、今は不変チェックが多すぎないのではないかと思います。これらのアグリゲートが別の境界コンテキストに存在する可能性があることを想像できましたが、ドライバーBCのDriverRepositoryまたはDriverエンティティへの依存関係で車のBCを汚染します。 また、私がドメインの専門家と話をした場合、彼らはそのような参照の有効性に疑問を呈することは決してありません。ドメインモデルを無関係な問題で汚染していることを感じています。しかし、再び、ある時点でユーザー入力を検証する必要があります。

2
ファイルの最終行を読み取った後、ifstream.eof()がTRUEを返さないのはなぜですか?
初心者がifstreamの読み取りを開始するとき、彼/彼女の本能は、通常次のようなループを使用してファイルを読み取ることです。 while (!ifstream.eof() { ... } ただし、このコードを使用すると、ファイルの最終行を2回読み取るまで停止しないことに気付きました。C ++プログラマーは、これが実際にファイルを読み取る方法ではないことに注意します。その代わり、彼らは通常、ファイルを読む必要のある人は誰でも代わりに次のようなループを使うことを勧めています: while (ifstream >> someVar) { ... } 最初のコードが常に正しく機能しないのはなぜですか?
11 c++ 

2
Unityでのバージョン管理のベストプラクティスは?
Unityでバージョン管理を使用する方法、特にコードだけではないシーンやプレハブなどのオブジェクトを使用する方法に少し混乱しています。 最近、同僚と同じシーンのさまざまな部分で作業していたときに問題が発生しました。その結果、衝突、分岐、および大量のマージが発生しました。 結局、私の改訂はとにかく彼の変更によって上書きされました。 現時点で私が見る唯一の方法は、同じオブジェクトを順番に操作することですが、特に現在行っているすべての作業がシーン内で行われるため、あまり便利ではないようです。 このような状況では、人々は通常何をしますか? (私たちはMercurial、BitBucket、およびSourceTreeを使用しています。)

4
楽観的ロックが機能しない場合はどうすればよいですか?
私は次のシナリオを持っています: ユーザーがETagに対してGETリクエストを/projects/1行い、ETagを受け取ります。 ユーザーは、ステップ1のETag を使用してPUTリクエストを/projects/1行います。 ユーザーは/projects/1、ステップ1のETag を使用して別のPUTリクエストを行います。 ETagが古くなっているため、通常、2番目のPUTリクエストは412応答を受け取ります。最初のPUTリクエストがリソースを変更したため、ETagは一致しなくなりました。 しかし、2つのPUT要求が同時に(またはちょうど1つずつ)送信された場合はどうなりますか?最初のPUT要求には、PUT#2が到着する前にリソースを処理および更新する時間がないため、PUT#2がPUT#1を上書きします。楽観的ロックの要点は、それが起こらないようにすることです...

6
プルリクエストはジュニアをトレーニングする場所です
マスターへのプルリクエストのすべてのコードは、本番環境で使用できるようにする必要があるという概念があります。これは理にかなっており、私の意見では公正な声明です。 ここでの考え方は、PRを作成したら、これをマスターにしたと述べているが、一部のレビュアーがあなたと単に「同意」して、見逃したことを見つけて欲しいということです。 私たちは人間なので、間違いを犯し、他のレビュアーがユニットテストでは見つけられなかった項目を見つけることを期待しています-スペルミス、誤ったjavadocなど。 しかし、プルリクエストは、開発者に何らかのレベルの支援/トレーニングを提供する必要がある場所ですか、そうであれば、どのレベルまでですか? 新しい変更をプッシュするたびに、レビュー担当者は変更を再レビューする必要があります。これは、開発時間からかかり、変更の再レビューを引き起こします。 それでは、プルリクエストではどのくらいのトレーニングが予想され、許可されるべきですか?私の一部は、それがジュニアからシニアまで変化すると感じます。しかし、それはジュニアにとってさえ、膨大な量の問題を見つけるための場所ではないはずだとも感じています。 開発者に「私のプルリクエストは本番環境で使用できるようにする」という目標を達成させるために苦労している人はいますか?

5
RealNumberおよびComplexNumber継承を実装する方法は?
うまくいけば、あまりにも学術的ではありません... SWライブラリに実数と複素数が必要だとしましょう。 is-a(またはhere)関係に基づいて、実数は複素数であり、複素数の虚数部のbは単に0です。 一方、私の実装は、その子は親を拡張するため、親のRealNumberには実数部があり、子ComplexNumberには架空のアートが追加されます。 また、相続は悪だという意見もあります。 昨日のように、私が大学でOOPを学んでいたとき、私の教授は、これらの2つの絶対値が異なる方法で計算されるため、これは継承の良い例ではないことを思い出します(ただし、そのためにメソッドのオーバーロード/ポリモーフィズムがありますよね?)。 。 私の経験では、継承を使用してDRYを解決することがよくあります。その結果、階層に人工的な抽象クラスが含まれることがよくあります(実際のオブジェクトを表さないため、名前を見つけるのに問題があることがよくあります)。

2
データベースサービス関数を呼び出すアプリケーションサービス層。悪いアーキテクチャ?
シナリオ: スタック:Java、Spring、Hibernate。 モデル:クライアントサーバーアプリケーション。 パターン:Model-View-Controller(MVC)。 サービス層クラスには3つの動作があります。 一部のサービスには、メソッド内にビジネスルールがあり、永続性をアプリケーションに委任します。お気に入り: EntityManager.save(entity); 一部のサービスは、単純にデータベース関数(パラメーターを渡す)を呼び出します。 CallableStatement cls = con.prepareCall( "{call databaseFunction(args)}"); 一部のサービスには、両方の動作を持つメソッドがあります。 私の質問: アプリケーションサービスに直接データベース機能を呼び出しても問題はありませんか?これは悪い習慣ではありませんか?このようなプロジェクトに適用できるアーキテクチャモデルは何でしょうか? 同じサービスで動作が混在することに問題はありますか?トランザクションや一貫性など? メンテナンスの場合、このカプセル化により、開発者はデータベースの機能も変更する必要があることがわかりにくくなりますか?これを回避するには? このシナリオは世界中の他のアプリケーションで発生しますか、それとも単なるアーキテクチャ上のエラーですか?

3
それを呼び出す関数をテストすることによって関数をテストするためのテスト方法はまだユニットテストですか?
関数Bをテストする場合、その関数Bを呼び出す関数Cをテストします。つまり、その関数Bを呼び出す関数Cをテストするためのテストプログラムを作成しても、テストメソッドはユニットテストなどと呼ばれますか? ターゲット関数を呼び出す関数を間接的にテストすることが望ましい場合、および関数を直接テストすることが望ましい場合はいつですか?

4
アイテムを並べ替えるときに並べ替えキーを生成する
エンドユーザーが目的の順序に整理できるアイテムがいくつかあります。アイテムのセットは順不同ですが、各アイテムには変更可能な並べ替えキーが含まれています。 最初のアイテム、最後のアイテム、または2つのアイテムの間に追加または移動されたアイテムの新しい並べ替えキーを生成できるアルゴリズムを探しています。移動するアイテムの並べ替えキーを変更するだけで済みます。 アルゴリズムの例としては、各ソートキーを浮動小数点数にして、2つのアイテムの間にアイテムを配置するときに、ソートキーをそれらの平均に設定します。アイテムを最初または最後に配置すると、最も外側の値+-1になります。 ここでの問題は、浮動小数点の精度が原因でソートが失敗する可能性があることです。同様に、2つの整数を使用して小数を表すと、数値が非常に大きくなり、通常の数値型で正確に表すことができなくなる場合があります(JSONとして転送する場合など)。BigIntsを使用したくありません。 これらの欠点の影響を受けない文字列を使用するなど、機能する適切なアルゴリズムはありますか? 膨大な数の移動をサポートするつもりはありませんが、上記のアルゴリズムは、約50回の移動後に倍精度浮動小数点数で失敗する可能性があります。
11 algorithms 

4
ブール式でnull条件演算子を使用する最適な方法
次のようなブール式を書いています。 team.Category == "A Team" && team?.Manager?.IsVietnamVet public class Manager { public bool IsVietnamVet { get; set; } } public class Team { public string Category { get; set; } public Manager Manager { get; set; } } ...そしてエラーが発生します: 演算子 '&&'は、タイプ 'bool'および 'bool?'のオペランドには適用できません。 それを処理するための最適/クリーンな方法は何ですか? team.Category == "A Team" && (team?.Manager?.IsVietnamVet …
11 c# 

5
ジェフ・ディーンの「すべてのプログラマーが知っておくべき待ち時間数」は、さまざまなハードウェア実装のコンテキストでどのようにして正確にできるでしょうか。
GoogleのJeff Deanによる、このレイテンシ数値のグラフを参照しています。 私が理解していないことは、これらの数値はハードウェアのセットによって変化しないのですか?これらは、RAM、CPU、マザーボード、ハードドライブなど、すべての異なるタイプでどのように正確ですか?
11 hardware 

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