ソフトウェア工学

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

4
イベント駆動型マイクロサービスアーキテクチャでの変更の処理
イベント駆動型マイクロサービスアーキテクチャの変更を処理するためのオプションを調査している調査プロジェクトを行っています。 したがって、4つの異なるサービスを利用できるアプリケーションがあるとします。これらの各サービスには、ローカルデータを格納するための独自のデータベースがあります。 このセットアップでは、4つのサービスがイベントバスを使用して相互に通信します。したがって、サービスで何かが発生すると、イベントが発行されます。そのイベントに関心のある他のすべてのサービスは、独自の方法で処理します。 その場合、アーキテクチャー内のさまざまなサービスは、これらのイベントの内容(属性など)について「契約」を持つ必要があります。したがって、サービスはこれらのイベントに「疎結合の依存関係」を持っています 私の質問は次のとおり です。これらのイベントの変更をどのように処理できますか? それでは、サービスAがアプリケーションに新しいユーザーを登録するとします。したがって、 "" UserRegistered "イベントを送信します。サービスBがそのイベントを取得して処理します。ただし、サービスチームCの一部の開発者は、登録済みユーザーの性別も必要であると判断しました。そのため、イベントが変更され、属性gender 「UserRegistered」イベントに追加されます。 サービスBが再デプロイせずに、その追加属性を使用して同じイベントを引き続きピックアップできることをどのように確認できますか? そして、この問題に取り組み、これらのイベントをバージョン管理する他の方法はありますか?

3
DI / IoCコンテナーとファクトリー:アプリケーションをどこで構成するのか、そしてその理由は?
ソフトウェアの構成にDIC / IoCレジストリを使用するタイミングと、ファクトリを使用するタイミング、およびどちらのアプローチの背後にある理由も理解しようとしています。 レジストリを使用して簡単に構成できるDIコンテナー(DIC)としてStructureMapを使用しています。DICでは、実質的にすべての登録済みオブジェクトは静的です。つまり、DICが構成され、DICでシングルトンとして構成されたら、実行時に実装/インスタンスを変更/交換する必要はありません。ただし、ソフトウェア(SW)はさまざまなデバイスで実行されるため、ハードウェアを適切に構成するには、ソフトウェアが実行されるデバイスに応じてデバイス固有のレジストリを選択する必要があります。 一部のオブジェクトの構築には構成ファイルの読み取りが必要なため、構成の読み取りとオブジェクトの作成を分離するために、ファクトリを使用してこれらのインスタンスをDICに返しています。対応するプラグインタイプのファクトリゲッターをDICに登録しました。 IMotor具象型Motor1とを備えたプラグイン型があるとしましょうMotor2。これはファクトリで処理する必要があります。デバイスの構成方法を決定する方法は2つあります。 私はSWが上に実行されていることをデバイスに関する情報を渡しMotorFactory、それが正しいモータを返す、のいずれかMotor1、またはMotor2。この場合、決定のロジックはファクトリー内にあります。 DICを実行しているデバイスに応じてDICを構成し、2つのファクトリMotor1Factoryを作成します。1 Motor2Factoryつは作成Motor1し、もう 1つは作成しますMotor2。この場合IMotor、Motor1Factoryまたはのいずれかを使用するデバイス固有のレジストリに、異なるレジストリエントリが含まれますMotor2Factory。 今私の質問です:これらの2つの方法のどちらが望ましいのですか?私には、コードベース全体でどのタイプをインスタンス化するかを決定するロジックを広げているため、最初のケースは単純ではなく複雑です。一方、2番目のケースでは、コード内のファクトリの数を効果的に増やしています。これは、(ほとんど)各具象型のファクトリが必要になるためです。抽象ファクトリーがミックスに追加されると、さらに混乱します。 繰り返しますが、どちらの方法を使用すればよいですか?さらに重要なのは、どちらの方法に進むかを決定するための優れた指標は何ですか?

3
Swiftがサブクラスの適切なフィールドを最初に初期化するのはなぜですか?
Swift言語では、インスタンスを初期化するには、そのクラスのすべてのフィールドに入力し、その後でスーパーコンストラクターを呼び出す必要があります。 class Base { var name: String init(name: String) { self.name = name } } class Derived: Base { var number: Int init(name: String, number: Int) { // won't compile if interchange lines self.number = number super.init(name) } } selfフィールドに値を割り当てる前にインスタンスを作成する必要があり、そのコードはチェーンが割り当て後にのみ発生するかのような印象を与えるため、私にとっては逆に思えます。それとは別に、スーパークラスにはサブクラスの導入された属性を読み取る法的な手段がないため、この場合は安全性は考慮されません。 また、JavaScriptのような他の多くの言語や、Swiftのいくらか霊的な祖先であるObjective Cでさえ、アクセスする前selfではなく、アクセスする前にチェーン呼び出しが必要です。 スーパーコンストラクタを呼び出す前にフィールドを定義する必要があるというこの選択の背後にある理由は何ですか?

2
Apollo-11:リンカーの代わりにインクルージョンを使用する
最近デジタル化されてリポジトリになり、元のApollo 11ガイダンスコンピューターのソースコードがGithubで表示できるようになりました。 ではMAIN.agc、レポ作者のコメント、彼らはその 巨大なモノリシックソースコードを、より小さく管理しやすいチャンク、つまり個別のソースファイルに分割します。 少し後で、著者は述べています 単純にソースファイルを個別にアセンブルしてからリンクして実行可能ファイルを形成するのではなく、何万行ものソース行がインクルードによって結合される理由を合理的に尋ねられる場合があります。答えは、元の開発チームにはリンカーがなかったということです。 リンカとは何か知っており、リンカの要点は理解していますが、「ASMに関する限り」「結合によって結合される」というフレーズは聞いたことがありません。 これは何を意味するのでしょうか?リンカはプログラミングにおいて非常に重要であることを考えると、「組み込み手段」によるリンカのこの置換が何であり、それがどのように機能するのか私は興味があります。

4
時期尚早に最適化していますか?
私は現在、C ++のコンポーネントベースのアーキテクチャの設計段階にいます。 現在の設計には、次のような機能の使用法が含まれています。 std::vectorstd::shared_ptrコンポーネントを保持するsのs std::dynamic_pointer_cast std::unordered_map<std::string,[yada]> コンポーネントは、グラフィックス、物理学、AI、オーディオなど、ゲームのようなソフトウェアに必要なさまざまなアイテムのデータとロジックを表します。 キャッシュミスがパフォーマンスに影響を与える可能性のある場所をすべて読んだので、いくつかのテストを実行しました。その結果、実際にアプリケーションの速度が低下する可能性があると思いました。 前述の言語機能をテストすることはできませんでしたが、多くの場合、これらの機能にはコストがかかる傾向があり、可能であれば回避する必要があると言われています。 アーキテクチャの設計段階にあり、これらは設計のコアに含まれるので、パフォーマンスがある場合、後で変更するのは非常に難しいので、今それらを回避する方法を見つける必要があります。問題? それとも私は時期尚早の最適化をしているのですか?

1
Reduxの原則をOO言語に適用することには意味がありますか?
Reduxは本質的に関数型プログラミングであり、それは非常に理にかなっています。別のプロジェクトで非JavaScript OOP言語に戻ると、単一の状態オブジェクト、その状態の一部に作用するレデューサー、状態を変更するセマンティックアクションのビジネスレイヤーなどの同じ原則を適用したいと思います。 私のプロジェクトはC ++で作成されており、アプリケーションの設計に機能的で、reuxスタイルのアプローチを適用することが理にかなっているかどうかを知りたいです。このアプリではパフォーマンスはそれほど重要ではありませんが、保守性は重要です。 このようにアプリを設計するときにどのような困難に直面しますか? これはGUIアプリではないことを付け加えておきます。さらに考えてみると、アプリケーションの状態の更新による直接的な視覚効果がないため、非GUIアプリケーションでのreduxの利点が減少している可能性があります。

2
関数型言語の2次元ボードゲームのデータ構造
関数型プログラミング言語ElixirでシンプルなMiniMax実装を作成しています。多くの完全な知識のあるゲーム(三目並べ、コネクトフォー、チェッカー、チェスなど)があるため、この実装は、これらのゲームのゲームAIを作成するためのフレームワークになる可能性があります。 しかし、私が直面している問題の1つは、関数型言語でゲームの状態を適切に保存する方法です。これらのゲームは、主に次の操作が頻繁に行われる2次元ゲームボードを扱います。 特定のボードの場所の内容を読む 特定のボードの場所の内容を更新する(新しい移動の可能性を返すとき) 現在の場所に接続されている1つまたは複数の場所のコンテンツを考慮する(つまり、次または前の水平、垂直、または対角の場所) 任意の方向に接続された複数の場所のコンテンツを検討します。 ファイル全体、ランク、対角線の内容を考慮します。 ボードを回転またはミラーリングする(既に計算されたものと同じ結果が得られる対称性をチェックするため)。 ほとんどの関数型言語は、多要素データ構造の基本的なビルディングブロックとしてリンクリストとタプルを使用します。しかし、これらは仕事のために非常にひどく作られたようです: リンクされたリストには、O(n)(線形)ルックアップ時間があります。また、ボードを1回スイープして「ボードをスキャンして更新」することはできないため、リストを使用することは非常に非現実的です。 タプルのルックアップ時間はO(1)(一定)です。ただし、ボードを固定サイズのタプルとして表すと、ランク、ファイル、対角線、または他の種類の連続する正方形を反復処理することが非常に難しくなります。また、ElixirとHaskell(どちらも知っている2つの関数型言語)には、タプルのn番目の要素を読み取るための構文がありません。これは、任意のサイズのボードで機能する動的ソリューションを作成することを不可能にします。 Elixirには組み込みのMapデータ構造(およびHaskellにはData.Map)があり、要素へのO(log n)(対数)アクセスを許可します。現在、私はマップを使用し、x, yキーとして位置を表すタプルを使用しています。 これは「うまくいく」が、このようにマップを乱用することは間違っていると感じますが、理由は正確にはわかりません。2次元ゲームボードを関数型プログラミング言語で格納するためのより良い方法を探しています。

2
すべてのブールロジックを「ブールナンド」だけを使用して構築する方法と同様に、「ビットワイズナンド」を使用してすべてのビットワイズ演算子を定義することは可能ですか?
Nand 他のすべてのブール論理ゲートを定義できるため、「ユニバーサル」論理ゲートと呼ばれます。 not(x) = nand(x,x) and(x, y) = not(nand(x, y)) or(x, y) = nand(not(x), not(y)) nor(x, y) = not(or(x, y)) xor(x, y) = nand(nand(a, nand(a, b)), nand(b, nand(a, b))) これはnand-logicと呼ばれ、トランジスタをnand-gateのように動作させることができるため、最近のコンピューターで一般的に使用されています。 私はビットごとの操作で同様のことを行うことが可能かどうか疑問に思っています。例えば缶ビット単位のNAND(bnand)を定義するために使用することはbnot、bor、band、bnor、bxor?汎用的なビット単位の操作はありますか?

6
静的型付けは、より大きなプロジェクトでどのように役立ちますか?
スクリプトプログラミング言語のサイトのメインページで好奇心をかきながら、次の文章に出会いました。 システムが大きくなりすぎて頭に残ることができない場合は、静的型を追加できます。 これにより、静的なコンパイル言語(Javaなど)と動的なインタープリタード言語(主に使用頻度が高いためPythonが主流ですが、ほとんどのスクリプト言語間で共有される「問題」)の間の多くの宗教戦争で、静的な不満の1つでした。動的に型付けされた言語に対する型付き言語のファンは、「いつか、関数の戻り値の型を忘れ、それを調べなければならず、静的に型付けされた言語ではすべてであるため、より大きなプロジェクトにうまくスケーリングできない」明示的に宣言されています。」 このような発言は理解できませんでした。正直に言うと、関数の戻り値の型を宣言したとしても、コードの多くの行を記述した後はそれを忘れることができ、その関数の検索関数を使用して宣言されている行に戻る必要があります。それをチェックするあなたのテキストエディタ。 さらにとして、関数がで宣言されているとしてtype funcname()...、知っwhitout typeあなただけ知っているので、あなたは関数が呼び出された各ラインを超える検索する必要がありますfuncnameしばらくPythonで、あなたのように、coudだけを検索def funcnameまたはfunction funcnameだけで、一度たまたま宣言。 さらに、REPLでは、関数の戻り値の型をさまざまな入力でテストするのは簡単ですが、静的に型付けされた言語では、コード行を追加し、宣言された型を知るためにすべてを再コンパイルする必要があります。 では、静的型付け言語の強みではない関数の戻り値の型を知る以外に、静的型付けは大規模なプロジェクトでどのように役立つのでしょうか。

3
REST用語では、リソースと表現の違いは何ですか?
RESTについての理解は、サービス操作を状態の表現としてモデリングし、HTTPを使用してある状態から別の状態に遷移することを可能にします。リソースをサービスサイドの状態の表現として常に理解してきました。最近まで、コミュニティから尊敬されている賢い開発者/アーキテクトであることがわかっているJimmy Bogardによるこの記事を読みました。その投稿から特定のステートメントを引用するには 表現は少し異なります- リソースの現在の状態を示します(要求されたとき)。 これは私を混乱させました。このトピックについて一般的に受け入れられている意見は何ですか?
9 rest  api  api-design 

6
エッジケースの承認基準
私はアジャイルチームのプロダクトオーナーです。私はPO受け入れテストを行うとき、通常いくつかのエッジケースを試すことを書き留めます。私が何かを発見するのは珍しいことではなく、それを開発者に渡します。開発者の話を拒否すると、開発者の1人から反発を受けます。彼は私がストーリーで説明するものだけをコード化する傾向があるため、エッジケースとプログラムが許容基準でどのように応答する必要があるかを指定しないので、彼は不公平だと言います。コーディング中にエッジケースにぶつかったときに私に尋ねるように彼に勧めましたが、彼はエッジケースをじっくり考えるのは自分の仕事ではないと考えており、次のスプリントのために新しいストーリーを作成する必要があります。 私の弁護では、彼がストーリーを実装するまで彼のストーリーのデザインがわからないので、すべての可能性を繰り返すことは困難です(構成はDBまたはプロパティファイルにありますか?)。簡単にするために、電卓アプリに除算を追加するストーリーがあるとします。理想的なSCRUMの世界では、「ゼロによるハンドル除算シナリオ」を受け入れ基準に追加するのは私に任されているのでしょうか、それともアプリが5/0に爆破しないように開発中にそれらのケースを処理する必要がありますか?明確に言うと、この場合、アプリが5/0で激しくクラッシュした場合は受け入れませんが、ログに記録したり、DIV0を出力したり、その他の方法でエラーを処理したりすれば合格します。クラッシュしない。

3
調査するとき、どのソフトウェア方法論に従うべきですか?
私は通常、実験のデータを分析し、実行する必要のある手順の一般的なスキーマがありますが、実験の詳細や背後にある質問に合わせて微調整する必要があるかもしれません。私は通常、唯一のコーディングです。 私はウィキペディアを見ましたが、どの方法論を使用できるのかわかりません。これまでフォローしたことがないため、データを調査してデータを調べたり、答えを求めたりするためです。(そして、私は自分のコードでテストしたり、特定の品質を期待したりすることがあまりないので) r関数tableがベクトルの順序に依存しており、それらを比較する要素の名前に依存していないことを発見した1〜2時間後に、この質問をするように促されました。それから私はいくつかのモックデータで使用した動作と機能をテストする必要がありましたが。しかし、他の分析の結果、情報が不足したためにテーブルを使用したため、テスト駆動型の開発方法論を理解できませんでした(正しく理解していれば)。ただし、プロジェクトに直面する方法が少し改善されたので、エラーをより早く検出することを除いて、より効率的になる可能性があると感じていますが、結果が疑わしい場合にどのようにして何を探すべきかを考えています。この例の間違い。 研究に最も適したソフトウェア方法論はどれですか。 私は基本的に、研究の特異性を維持するだけでなく、品質と時宜を得た進歩を確実にする方法を尋ねています。 私の仕事の例: 生物学者は質問を念頭に置き、実験を行うことで目的のデータ(つまり、2つの条件での遺伝子発現レベル)が得られることを知ってから、実験を設定し、10人/マウス/ラットからサンプルを収集します。 。次に、既存のライブラリとテストを使用して(または新しいテストを実装して)、これらの10サンプルのデータを分析する必要がありますが、生物学者が考えていた質問(つまり、ある遺伝子が他の条件よりも多く発現する)を考慮に入れます。構造は以前の実験(6つの条件と別の動物を含む)と同じですが、統計的検定、正規化、データ構造が変更される場合があります。そのため、私は通常、以前のバージョンをコピーして、現在のニーズに適合させます。

1
CでのC ++テンプレートタイプAPIの慣用的なラッピング
C関数でデータストア(Hazelcast)へのアクセスを提供するC ++ APIのラップに取り組んでいるため、データストアはCのみのコードからもアクセスできます。 Mapデータ構造用のHazelcast C ++ APIは次のようになります。 auto map = hazelcastClient->client->getMap<int, string>(mapName); map.put(key, value); とテンプレートのテンプレートタイプを使用keyしvalueます。Cには利用可能なテンプレートがないため、getMap<T, U>メソッドの特殊化ごとにラッパー関数を作成することを考えました。つまり、Cタイプごとに。私があることを承知しているが、signedおよびunsignedCタイプのバージョンは、私だけをサポートするAPIを制限して大丈夫だよint、double、float、char *のためにkeyとvalue。 そこで、すべての組み合わせを自動生成する小さなスクリプトを書きました。エクスポートされた関数は次のようになります。 int Hazelcast_Map_put_int_string( Hazelcast_Client_t *hazelcastClient, const char *mapName, int key, char *value, char** errptr ); int Hazelcast_Map_put_int_int( Hazelcast_Client_t *hazelcastClient, const char *mapName, int key, int value, char** errptr ); ... 機能の生成get、set、containsすべての可能な組み合わせとkeyし、value種類は非常に多くのコードの量を増加させ、そして、私はコードを生成することは良いアイデアだと思いますが、それはコード生成インフラのいくつかの種類を作成することによって、追加の複雑さを追加します。 私が想像できるもう1つのアイデアは、次のようなCの一般的な関数の1つです。 int …
9 c++  c  api-design 

1
GPLライセンスのプロジェクトでMITライセンスのコードを使用する場合はどうすればよいですか?
私は、GNU Affero GPLの下でライセンス供与を計画している個人プロジェクトに取り組んでいます。しかし、MITでライセンスされていて実際に利用したいコードをいくつか見つけましたが、ライセンスに関して何をすべきかわかりません。 コードの残りの部分は、GNU Afferoの下で私のものになります。それは、MITの下でライセンスされている、ソースファイルとヘッダーファイルです。 私は、プログラマーがこの MIT / GPLコードの共同作業についてQを読んだり、 GPLライブラリを使用したMITのソフトウェアやその他のSOについてこのQを読んだりしました。ライセンス。 私の知る限り、MITライセンスをライブラリに残し、ライセンスファイルに2つの異なるライセンスとそれらに適用されるコードについてのメモを含めるだけで十分ですか?

4
境界付きコンテキストの境界を明確に定義する方法
1か月ほどDDDを読んで調査した後、私は自分のプロジェクトを開始することを決め、これらの制限されたコンテキストでDDDを作成しました> クライアント 製品 注文 課金 各境界付きコンテキストには、プレゼンテーション層、ドメイン層、永続層としてREST APIがあります。 これまでのところ、コードはスムーズに実行されていますが、モノリシックな世界から来ているので、私はまだ次のことを理解しようとしています: 新しいクライアントを作成したい場合、新しい請求書を発行したい場合、たとえば、国のアクセスリストなど、新しい注文を作成したい場合。私は: a)各BCの国のリストを作成する b)国BC-> APIを作成し、それを使用して利用可能な国のリストを取得する c)サードパーティのAPIを使用し、各BCの腐敗防止層を介してデータをプルする 破損防止レイヤーまたはアダプターレイヤーを使用してサードパーティAPIと統合する場合、ドメインモデルにどのデータを含める必要がありますか?たとえば、zendesk APIをクライアントBCと統合したい場合。ドメインにticketIDのみが必要ですか、それともクライアントBCでアクセスして使用するすべてのデータをZendeskから抽出する必要がありますか? MVCアプリが実際にAPI(境界コンテキストのプレゼンテーションレイヤー)からデータを取得している場合、各BCの境界を明確に定義することは非常に困難です。それは、適切に設計されたBCが、追加のAPIを消費する必要なしに単一のMVCコントローラーを提供することを意味しますか?

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