ソフトウェア工学

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

2
CQRSは過剰設計ではありませんか?
古き良き時代のリポジトリを今でも覚えています。しかし、リポジトリは時間とともにいものになりました。その後、CQRSが主流になりました。彼らは素晴らしく、新鮮な空気の息吹でした。しかし、最近、コントローラーのアクションメソッド(特にアクション自体が何らかのコマンド/クエリハンドラーであるWeb Api)でロジックを正しく維持しないように何度も自問しています。 以前は、そのための明確な答えがありました。すべてのそれらのモックできないシングルトンと全体的ないASP.NETインフラストラクチャでControllerをテストするのは難しいので、テストのためにそれをしました。しかし、時代は変わっており、ASP.NETインフラストラクチャクラスは、今日では(特にASP.NET Coreで)はるかに単体テストに適しています。 典型的なWebApi呼び出しは次のとおりです。コマンドが追加され、SignalRクライアントに通知されます。 public void AddClient(string clientName) { using (var dataContext = new DataContext()) { var client = new Client() { Name = clientName }; dataContext.Clients.Add(client); dataContext.SaveChanges(); GlobalHost.ConnectionManager.GetHubContext<ClientsHub>().ClientWasAdded(client); } } 簡単に単体テスト/モックできます。さらに、OWINのおかげで、ローカルWebApiおよびSignalRサーバーをセットアップし、統合テストを実行できます(ちなみにかなり高速です)。 最近、面倒なコマンド/クエリハンドラを作成するモチベーションが低下し、Web Apiアクションにコードを保持する傾向がありました。ロジックが繰り返されるか、それが本当に複雑で、それを分離したい場合にのみ、例外を作成します。しかし、ここで正しいことをしているかどうかはわかりません。 典型的な最新のASP.NETアプリケーションでロジックを管理するための最も合理的なアプローチは何ですか?コードをコマンドおよびクエリハンドラーに移動するのが妥当なのはいつですか?より良いパターンはありますか? 更新。DDD-liteアプローチに関するこの記事を見つけました。したがって、コードの複雑な部分をコマンド/クエリハンドラに移動するという私のアプローチは、CQRS-liteと呼ばれるようです。

2
DB移行およびAzure展開スロット
新しいWebアプリケーションをAzure Web App Service(以前のAzure Webサイト)にプッシュする予定です。展開スロットを利用して、運用環境にプッシュする前に展開をテストできるようにします。DBスキーマの変更が必要ない限り、これで十分です。しかし、スキーマの変更がある場合、同じdbバージョンで動作する2つのソフトウェアバージョンを持つことはできません。EF Migrationsを使用しているため、ステージングスロットへのプッシュにより、即座にDBが最新バージョンに更新されます。 だから私の質問は、データベースの移行が必要なときに展開スロットを使用するかどうかです。 大規模なSaaSプロバイダーではどのように行われますか。彼らは新しいバージョンで即座にDB移行を実行していますか?それは確かにいくつかのダウンタイムを引き起こすでしょう。 この問題のかなり複雑な解決策しか考えられませんが、簡単なものはありますか?

5
オープンソースプロジェクトが製品で使用できるほど成熟しているかどうかを知る方法は?
職場の製品に組み込みたいオープンソースプロジェクトがいくつかあります。私たちには、帯域幅も、専門知識もありません。Googleで検索してこれらを見つけました。私は、プロジェクトを利用する「主要なプレーヤー」を知りませんが、私が見ているものにかなり勇気づけられています。 今、私はjoe-blowのオープンソースプロジェクトを使用することでさらされているリスクの量について少し心配しています。そこから95%の距離が必要な場合、残りの5%は簡単に追加または修正できます。おそらく、それは重要なことです。 オープンソースプロジェクトが製品で使用できるほど成熟しているかどうかをどのように判断しますか? これは趣味のプロジェクトではないため、安定性、保守性などが最重要です。

3
MVVMの明確化
最初のWPFアプリケーションを作成しようとしており、MVVMパターンに精通しています。私たちは多くのWinformアプリケーションを構築しており、非常に成功したアーキテクチャを持っています。そのアーキテクチャを翻訳したり、アーキテクチャの特定の部分がMVVMモデルに適合する場所を決定したりするのに少し苦労しています。 歴史的には、BusinessLogic dllと通信するGui(メインexe)があります。BusinessLogicはWebサービスを介してDAL dllと通信し、DALはDBと対話します。DAL、BusinessLogic、およびGUIはすべて同じBusinessObjects dllを参照します。 MVVMへの移行の一部はかなり単純です。Guiにはビューが含まれ、BusinessOjbectsにはモデルが含まれ、DALはDBと対話します(ただし、それらを実装するテクノロジーは変更される可能性があります)。 わからないのは、BusinessLogicコンポーネントです。歴史的には、これはビューのコントロールを呼び出すためにGUIに呼び出す関数を提供していました(つまり、Customerオブジェクトのリストまたは典型的なCRUD関数を返すGetCustomerList)。 主な問題は、MVVMパターンがViewModelを格納するために追加のコンポーネントを必要とするのか、単に考え方を変えてBusinessLogicコンポーネントとして使用したものをViewModelに移行するだけなのか、ということです。 BusinessLogicコンポーネントはViewModelを表しますか?

7
C#コードでHTMLを作成する最良の方法は何ですか?[閉まっている]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?質問を更新して、1つの問題のみに焦点を当てるこの投稿を編集する。 5年前に閉鎖されました。 私は、マークアップは、コードビハインドではなく、マークアップのままにしておくべきだと考えています。 コードビハインドでHTMLを構築することは許容できると思う状況になりました。ベストプラクティスが何であるか、または何をすべきかについて、コンセンサスを持ちたいと思います。 コードビハインドでhtmlをビルドすることが受け入れられるのはいつですか?このhtmlを作成する最良の方法は何ですか?(例:文字列、StringBuilder、HTMLWriterなど)
15 c#  asp.net  html 

5
DDD、Saga、およびイベントソーシング:補償アクションは、イベントストアで単に削除できますか?
上記の質問はおそらくいくつかの「何??」を発生させることを理解していますが、説明しよう: 私は、いくつかの関連する概念、基本的にはSaga-pattern(http://www.rgoarchitects.com/Files/SOAPatterns/Saga.pdf)とEvent-sourcing(A DDD-concept)に頭を包み込もうとしています。:http : //en.wikipedia.org/wiki/Domain-driven_design) まとめた良い投稿:https : //blog.jonathanoliver.com/cqrs-sagas-with-event-sourcing-part-ii-of-ii/ 私はすぐに質問に近づいていますが、最初にそれについて理解していることを要約しようとする必要があると思います(これは間違っている可能性がありますので、その場合は修正してください)次から始まる質問をする: Sagaパターンは、アクション(エンドユーザー、自動化など、本質的にデータを変更するもの)を指定したブローカーの一種で、そのアクションをビジネスアクティビティに分割し、これらの各アクティビティをメッセージとしてメッセージバスに送信します。次に、それをそれぞれの集約ルートに送信して処理します。 これらの集約ルートは完全に自律的に動作できます(懸念事項の分離、優れたスケーラビリティなど)。 Sagaインスタンス自体には、ビジネスロジックが含まれていません。ビジネスロジックは、アクティビティを送信する集約ルートに含まれています。佐賀に含まれる唯一の「ロジック」は「プロセス」ロジック(多くの場合Statemachineとして実装されます)で、受信したアクション(およびフォローアップイベント)に基づいて何を行うか(つまり、どのアクティビティを送信するか)を決定します Saga-patternsは、一種の分散トランザクションパターンを実装します。つまり、集約ルートの1つ(相互の存在を認識せずに自律的に動作する)の1つが失敗した場合、アクション全体をロールバックする必要があります。 これは、佐賀へのアクティビティレポートの完了時に、すべての集約ルートを持つことで実装されます。(成功とエラーの場合) すべての集約ルートが成功を返す場合、佐賀が次に何をすべきかを決定する(または完了したと判断する)場合、内部ステートマシン 失敗した場合、佐賀は、最後のアクションに参加したすべての集約ルートに対して、いわゆる補償アクション、つまり、各集約ルートが行った最後のアクションを取り消すアクションを発行します。 アクションが「プラス1票」の場合、これは単に「マイナス1票」を実行することですが、ブログポストを以前のバージョンに復元するなど、より複雑になる可能性があります。 イベントソーシング(2つを組み合わせたブログ投稿を参照)は、集約された各ルートが行う各アクティビティの結果を一元化されたイベントストアに保存することを外部化することを目的としています(このコンテキストでは変更は「イベント」と呼ばれます) このイベントストアは「真実の単一バージョン」であり、保存されたイベントを繰り返すだけで(本質的にイベントログのように)すべてのエンティティの状態を再生するために使用できます。 2つを組み合わせること(つまり、集約ルートがイベントソーシングを使用して変更を保存し、佐賀に報告する前に変更を保存する)により、多くの素晴らしい可能性が可能になります。 これを一度に把握するのは大変なので、肩から離す必要があると感じました。このコンテキスト/マインドセットが与えられます(もう一度、間違っている場合は修正してください) 質問:集約ルートが補正アクションを受信し、その集約ルートがイベントソーシングを使用した状態変更を外部委託している場合、すべての状況での補正アクションは、そのイベントストアの最後のイベントの削除だけではありません集約ルートを指定しますか?(persist-implementationが削除を許可すると仮定) それは私にとって非常に理にかなっています(そしてこの組み合わせのもう一つの大きな利点です)が、私が言ったように、これらの概念の誤った/不完全な理解に基づいてこれらの仮定をしているかもしれません。 これが長すぎないことを願っています。 ありがとう。

7
稼働中のシステムを交換する場合、アジャイルはどのように機能しますか?
理想的なアジャイルの世界では、目的のエンドシステムの小さいながらも有用なサブセットをすばやく構築し、ユーザーに提供します。彼らは興奮している、なぜならそれは便利だからだ。彼らはそれを使い始め、フィードバックを与える。次に、何を追加するのかを考え出し、それを構築し、時間がなくなるまで繰り返します。 私は最近、いくつかの種類の作業システムの交換を伴うプロジェクトをいくつか行ってきました。上記のモデルはまったく機能しませんでした。既存のシステムのほぼすべての機能を含むシステムを構築するまで、ユーザーはまったく興味を持ちませんでした。彼らはそれを使用しません。 「最小の有用なサブセット」が「すべて」の場合、どのようにアジャイルを適用しますか?

2
誰かがCSDP認定を行っていますか?[閉まっている]
現在のところ、この質問はQ&A形式には適していません。回答は事実、参考文献、または専門知識によってサポートされると予想されますが、この質問は議論、議論、世論調査、または広範な議論を求める可能性があります。この質問を改善し、場合によっては再開できると思われる場合は、ヘルプセンターをご覧ください。 7年前に閉鎖されました。 ソフトウェアエンジニアとしての知識と市場価値を高める可能性のある認定を探していました。IEEEの認定ソフトウェア開発プロフェッショナル(CSDP)が私の注目を集めました。ネット上でユーザーエクスペリエンスを探したところ、実質的なものは見つかりませんでした。あまり人気がないようです。そして、私の組織内の誰もそれをやった友人のサークルを聞いたことはありません。 コミュニティメンバーから、この認定資格を取得した人や、同じ認定資格を取得した経験があるかどうかを知りたいと思います。知識の面で認定は有用でしたか。それはあなたの履歴書に重さを加えましたか?
15 engineering  csdp 

7
プライベートメソッドのユニットテストの必要性を回避する方法
私はあなたがプライベートメソッドをテストすることになっていないことを知っています、そしてそれがあなたが必要であるように見えるなら、そこに出てくるのを待っているクラスがあるかもしれません。 しかし、パブリックインターフェイスをテストできるようにするためだけに数十億のクラスを持ちたくはありません。パブリックメソッドをテストするだけで多くの依存関係をモックする必要があり、ユニットテストは多くのクラスで行われます。巨大で追跡が難しい。 パブリックメソッドをテストする場合はプライベートメソッドをモックし、プライベートメソッドをテストする場合は外部依存関係をモックすることをお勧めします。 私は夢中ですか?

2
プルリクエストを潰すとgitのマージアルゴリズムが壊れますか?
現在、gitコードの管理にVSTSを使用している会社で働いています。マイクロソフトのブランチの「推奨」方法は、「スカッシュマージ」です。つまり、そのブランチのすべてのコミットが、すべての変更が組み込まれた1つの新しいコミットになります。 問題は、あるバックログアイテムのあるブランチでいくつかの変更を行った後、すぐに別のバックログアイテムの別のブランチで変更を行いたい場合、それらの変更は最初のブランチの変更セットに依存しますか? そのバックログアイテムのブランチを作成し、最初のブランチをベースにすることができます。ここまでは順調ですね。ただし、2番目のブランチのプルリクエストを作成するときが来ると、最初のブランチは既にmasterにマージされており、スカッシュマージとして行われているため、gitは多くの競合にフラグを立てます。これは、gitが2番目のブランチの基になった元のコミットを表示せず、1つの大きなスカッシュマージを表示するだけであるため、マスターに2番目のブランチをマージするために、スカッシュマージのトップであり、多くの競合が発生します。 だから私の質問は、これを回避する方法はありますか(1つの機能ブランチを別の機能ブランチのベースにすることがないため、ワークフローが制限されます)、またはスカッシュマージはgitのマージアルゴリズムを破壊するだけですか?
15 git 

3
モノリスのスケーリングとマイクロサービスのスケーリング
マイクロサービスを使用するための一般的な議論の1つは、スケーラビリティの向上です。しかし、私はこの議論が本当に有効かどうか疑問に思います。 10個のマイクロサービスで構成されるアプリケーションがあり、そのうちの9個がそれぞれ2つのインスタンス(冗長性のため)を持ち、そのうちの1つが負荷を処理する4つのインスタンス(スケーラビリティー)を持つとします。この場合、マイクロサービスの賛成論は、このmiroserviceを他のサービスとは無関係にスケーリングできるということです。 ただし、10個のマイクロサービスすべてが単一のモノリスのモジュールであり、このモノリスのいくつかのインスタンス(たとえば上記の合計のような22個)がデプロイされたとしましょう。システムは、1つの重要な部分の負荷を処理できる必要があります。そうするのに十分なインスタンスがあるためです。インスタンスに不要なプログラムロジックが含まれている場合、唯一の欠点は、バイナリと必要なRAMの量がわずかに大きくなることです。しかし、この場合も、ほとんどの場合、差はあまり大きくないはずです-少なくともスタックの残りの部分と比較してはなりません(Spring Bootを考えてください)。スケーリングされたモノリスの利点は、分散システムの(ほとんど)誤りを伴わないシンプルなシステムになります。 何か不足していますか?

2
役割ベースのアクセス制御を設計する方法は?
役割ベースのアクセス制御モデルに従って、システムでユーザーができることまたはできないことを制限しようとしています。 これまでのところ、次のエンティティがあります。 users-システムを使用する人。ここにユーザー名とパスワードがあります。 roles-ユーザーが持つことができる役割のコレクション。マネージャー、管理者などのリソースのような もの-ユーザーが操作できるもの。契約、ユーザー、契約草案などの 操作のように -ユーザーがリソースでできること。作成、読み取り、更新、削除など。 さて、このような関係があるダイアグラムでは、ここで疑問が浮上します。 操作(0 .. *)は リソース(0 .. *)に対して実行され、permissionsという名前のテーブルを生成し、操作とリソースを保存します。 許可テーブルは次のようになります(1行): ID: 1、操作: create、リソース: contract。 どの意味許可する作成の契約を。 一部のリソースにはすべての種類の操作が含まれていない可能性があると感じているため、このようにしました。たとえば、契約を登録する場合、ユーザーはファイルをアップロードできますが、この操作はプロバイダーの登録には使用できません。 そのため、管理者がロールにアクセス許可を付与するときに、システムに登録されたすべての単一操作のリソースのリストはありません。 各リソースには、自分で実行できる独自の操作のコレクションがあると思います。 何かが理解できない場合は明確にすることができます。 これは、rbacを実装する正しい方法ですか? 編集 つまり、操作とリソースを持つアクセス許可テーブルを使用することで、リソースを操作に関連付けるために2つの余分なテーブルがあります。また、私はちょうど行っている可能性のリソースが持っている権限の許可テーブルが権限を格納します。 しかし、その場合、管理者がリソースを割り当てたときに、一部のリソースには存在しないアクセス許可が表示されていた可能性があります。 だから私は、データベース設計の観点から、1つの列操作と別のリソースを持つこのテーブル権限が正しいかどうか知りたいですか?この状態が続くと問題が発生しますか?

4
型マッピングと拡張メソッドに関するベストプラクティス
型のマッピングとC#での拡張メソッドの使用に関するベストプラクティスについて質問したいです。このトピックは過去数年にわたって何度も議論されてきましたが、私は多くの投稿を読みましたが、まだ疑問があります。 私が遭遇した問題は、私が所有するクラスを「変換」機能で拡張することでした。あるロジックで使用されるオブジェクトを表すクラス「Person」があるとしましょう。また、外部APIからの応答を表すクラス「Customer」もあります(実際には、複数のAPIがあるため、各APIの応答を共通のタイプ:Personにマッピングする必要があります)。両方のクラスのソースコードにアクセスでき、理論的には独自のメソッドを実装できます。データベースに保存できるように、CustomerをPersonに変換する必要があります。プロジェクトは自動マッパーを使用しません。 私は4つの可能な解決策を考えています: Consumerクラスの.ToPerson()メソッド。シンプルですが、私には単一責任パターンを壊しているように見えます。特に、Consumerクラスは他のクラス(別の外部APIに必要なもの)にもマップされるため、複数のマッピングメソッドを含める必要があります。 Consumerを引数として取るPersonクラスのコンストラクターをマッピングします。また、簡単で、単一責任パターンを壊すようにも見えます。複数のマッピングコンストラクターが必要です(別のAPIからのクラスがあり、Consumerと同じデータをわずかに異なる形式で提供するため) 拡張メソッドを持つコンバータークラス。この方法で、Consumerクラスの.ToPerson()メソッドを記述でき、独自のNewConsumerクラスで別のAPIが導入された場合、別の拡張メソッドを記述して、すべてを同じファイルに保存できます。拡張メソッドは一般的に悪であり、絶対に必要な場合にのみ使用すべきだという意見を聞いたことがあります。それ以外の場合、私はこのソリューションが好きです Converter / Mapperクラス。変換を処理する別のクラスを作成し、ソースクラスインスタンスを引数として受け取り、宛先クラスインスタンスを返すメソッドを実装します。 要約すると、私の問題は質問の数に減らすことができます(すべて、上記で説明した内容に関連して)。 変換メソッドを(POCO?)オブジェクト(Consumerクラスの.ToPerson()メソッドなど)内に配置することは、単一の責任パターンを壊すことを考慮していますか? (DTOのよ​​うな)クラスでの変換コンストラクターの使用は、単一の責任パターンの破壊と見なされますか?特に、そのようなクラスを複数のソースタイプから変換できる場合、複数の変換コンストラクタが必要になりますか? 元のクラスのソースコードにアクセスしながら拡張メソッドを使用するのは悪い習慣と見なされていますか?このような動作は、ロジックを分離するための実行可能なパターンとして使用できますか、それともアンチパターンですか?

5
プライベートメソッドの単体テストが悪い習慣と見なされるのはなぜですか?
環境: 現在、Pythonで小さなプロジェクトに取り組んでいます。私は一般的に文書化されているいくつかのパブリックメソッドで私のクラスを構造化が、主に高レベルの概念を扱う(クラスのユーザーが知っていて、使用すべきか)、そしてたくさんの隠された(アンダースコアで始まる)を担当している方法を複雑または低レベルの処理。 コードに信頼を置き、その後の変更によって以前の動作が損なわれないようにするためには、テストが不可欠であることを知っています。 問題: 信頼できるベースでより高いレベルのパブリックメソッドを構築するために、私は一般的にプライベートメソッドをテストします。コードの変更によってリグレッションが発生したかどうか、どこで発生したかを確認する方が簡単です。これは、これらの内部テストがマイナーリビジョンで壊れる可能性があり、修正/交換する必要があることを意味します しかし、私は、プライベートメソッドのユニットテストが、少なくとも異議のある概念であるか、またはより頻繁に悪い習慣と見なされていることも知っています。その理由:公の行動のみをテストする必要があります(参照) 質問: 私は次のベストプラクティスに注意を払い、理解したいと思います。 プライベート/隠しメソッドでユニットテストを使用するのはなぜ悪いのですか(リスクは何ですか)? パブリックメソッドが低レベルおよび/または複雑な処理を使用できる場合のベストプラクティスは何ですか? 精度: それは質問する方法ではありません。Pythonにはプライバシーの真の概念がなく、隠されたメソッドは単にリストされていませんが、名前がわかっている場合に使用できます 私はプログラミングのルールとパターンを教えたことはありません。私の最後のクラスは80年代からです...私は主に試行錯誤とインターネットでの参照によって言語を学びました(何年もの間、Stack Exchangeが私のお気に入りです)

3
リソースが見つからない場合、204または404応答を返す必要がありますか?
トーナメントとスケジュールのためのシンプルなRESTfulサービスを開発しています。JSONボディを含むPOSTリクエストを通じてトーナメントが作成されると、トーナメントはに挿入さBiMapれ、DAO実装で次のように宣言されます。 private BiMap<String, Tournament> tournaments = Maps.synchronizedBiMap(HashBiMap.create()); トーナメントが作成されると、それに関連付けられた文字列IDが返されるので、ユーザーはそのトーナメントを将来参照することができます。彼/彼女は次のリクエストを実行して新しいトーナメントから情報を得ることができます: GET http://localhost:8080/eventscheduler/c15268ce-474a-49bd-a623-b0b865386f39 しかし、そのようなIDのトーナメントが見つからない場合はどうなりますか?これまでのところ、204応答を返しています。まあ、ジャージーはnull、そのメソッドの1つから戻るときに私のためにそれをやっています。これは、上記のルートに対応するメソッドです。 @Path("/{id}") @GET @Produces(MediaType.APPLICATION_JSON) public Tournament getTournament(@PathParam("id") String id) { Optional<Tournament> optTournament = tournamentDao.getTournament(id); if (optTournament.isPresent()) return optTournament.get(); return null; } 私の質問は次のとおりです。リソースが見つからなかったので、204: No Content応答を返すことは問題あり404ませんか、それとも代わりに応答でなければなりませんか? それを404に変更する必要がある場合、明らかな質問:メソッドのシグネチャを変更する必要がありますか?これで(タイプTournament)のトーナメントが返されない可能性があるため、メソッドは異なるように見えるはずです。Response代わりに、型を戻り値の型として使用する必要がありますか?
15 java  rest  web-services  http 

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