ソフトウェア工学

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

2
DDD:不変オブジェクトもエンティティになることができますか?
私はエンティティと値オブジェクトの違いに関する無数の投稿を読んだことがあり、少なくとも概念的には2つがどのように異なるかを理解していると思いますが、これらの投稿の一部では、単に特定のドメインの概念をVOと見なしているようですは不変です(したがって、少なくともその特定のドメインモデル内では、その状態は決して変化しません)。 オブジェクトの状態が特定のドメインモデル内で決して変更されない場合、このオブジェクトがエンティティであってはならないことに同意しますか?どうして?

4
CQRS + ESのオブジェクトはどこで完全に初期化する必要がありますか:コンストラクター内、または最初のイベントを適用するとき?
OOPコミュニティでは、クラスコンストラクターがオブジェクトを部分的または完全に未初期化のままにしてはならないという合意が広まっているようです。 「初期化」とはどういう意味ですか?大まかに言えば、新しく作成されたオブジェクトを、そのクラスのすべての不変条件が保持される状態にするアトミックプロセス。これはオブジェクトに最初に発生するものであり(オブジェクトごとに1回だけ実行する必要があります)、初期化されていないオブジェクトを取得することは許可されません。(したがって、クラスコンストラクターでオブジェクトの初期化を正しく実行するための頻繁なアドバイスです。同じ理由で、Initializeメソッドはしばしばアトミック性を分解し、まだ使用されていないオブジェクトを取得して使用することを可能にするため、眉をひそめられます明確な状態にあります。) 問題: CQRSとイベントソーシング(CQRS + ES)を組み合わせると、オブジェクトのすべての状態変化が順序付けられた一連のイベント(イベントストリーム)でキャッチされ、オブジェクトが実際に完全に初期化された状態にいつ到達するのか疑問に思います。クラスコンストラクターの最後、または最初のイベントがオブジェクトに適用された後? 注:「集約ルート」という用語の使用は控えています。必要に応じて、「オブジェクト」を読むたびに置き換えてください。 議論の例:各オブジェクトが何らかの不透明なId値(GUIDと考える)によって一意に識別されると仮定します。そのオブジェクトの状態変化を表すイベントストリームは、同じId値によってイベントストアで識別できます(正しいイベントの順序については心配しないでください)。 interface IEventStore { IEnumerable<IEvent> GetEventsOfObject(Id objectId); } さらに、2つのオブジェクトタイプCustomerとがあると仮定しますShoppingCart。焦点を当てましょうShoppingCart:作成されたとき、ショッピングカートは空であり、正確に1人の顧客に関連付けられている必要があります。最後のビットはクラス不変です:にShoppingCart関連付けられていないオブジェクトはCustomer無効な状態です。 従来のOOPでは、コンストラクターでこれをモデル化できます。 partial class ShoppingCart { public Id Id { get; private set; } public Customer Customer { get; private set; } public ShoppingCart(Id id, Customer customer) { this.Id = id; this.Customer = customer; } …

2
C標準がconst-nessを再帰的に考慮する理由は何ですか?
C99標準は6.5.16:2で次のように述べています。 代入演算子は、左オペランドとして変更可能な左辺値を持つものとします。 6.3.2.1:1では: 変更可能な左辺値は、配列型がなく、不完全型がなく、const修飾型がなく、構造体または共用体である場合、メンバー(再帰的に、任意のメンバーを含む)がない左辺値ですまたは含まれるすべての集合体または共用体の要素)、const修飾型。 ではconst struct、constフィールドのないものを考えてみましょう。 typedef struct S_s { const int _a; } S_t; 標準では、次のコードは未定義の動作(UB)です。 S_t s1; S_t s2 = { ._a = 2 }; s1 = s2; これに関する意味上の問題structは、エンティティの宣言されたタイプ(S_t s1)から判断すると、囲んでいるエンティティ()は書き込み可能(読み取り専用ではない)と見なされるべきですが、標準の文言(2つの条項)によって書き込み可能と見なされるべきではありません。上部)constフィールドのため_a。規格では、割り当てを実際にUBであるとコードを読んでいるプログラマーに不明確にしていますstruct S_s ... S_t。これは、型の定義がないことを伝えることができないためです。 さらに、フィールドへの読み取り専用アクセスは、とにかく構文的にのみ適用されます。constnon-の一部のフィールドをconst struct実際に読み取り専用ストレージに配置する方法はありません。しかし、このような標準の表現はconst、これらのフィールドのアクセサープロシージャのフィールドの修飾子を故意にキャストするコードを非合法化します(Cの構造体のフィールドをconst修飾することは良い考えですか?): (*) #include <stdlib.h> #include <stdio.h> typedef struct S_s { const int _a; } S_t; …
9 design  c 

4
.NETプログラミングとPOCOクラス
変更が必要なアプリケーションについて熟考しているときに、今夜は考えていました。エンティティフレームワークエンティティはPOCO(プレーンな古いCLRオブジェクト)であり、ASP.NET MVCで使用されるモデルも通常POCOです。これは基本的にプロパティだけを意味し、メソッドは意味しません。 現在、OOプログラミングでは、通常、オブジェクトにその機能とメソッドを含む機能をカプセル化できます。これにより、ポリモーフィズムが発生します。使用されるPOCOクラスの台頭により、汎用リポジトリーなどの設計パターンがより一般的になっています。以前はオブジェクトに独自のCRUD操作があったはずでしたが、現在はリポジトリにあります。 これはオブジェクトからの進化であり、オブジェクトからCRUD操作を削除してそれらを分離できるようにしたのですか、それとも過去にCRUD操作がオブジェクトレベルにあるはずがなく、私が間違っていたのでしょうか?一体、おそらく両方とも完全に合法であり、常にそうでした。それは私が考えさせられた観察に過ぎないので、私は他の意見を求めるだろうと考えました。


2
スタック+ヒープ+静的メモリモデルに代わるものはありますか?
私が見たすべてのプログラムは、データメモリを1つ以上の呼び出しスタック(通常は固定サイズですが、そうでない場合もあります)、ヒープ、および静的メモリに編成します。最近、スレッドローカルの静的ストレージもこれに追加されました。 コールスタックなしなど、根本的に異なる方法でデータメモリレイアウトを整理する試みはありますか?または、同じことを達成する別の方法でメモリを整理しますか?

3
DDDによるトランザクションの整合性の確保
私はDDDから始めて、国境を越えた一貫性を確保するために集約ルートが使用されることを理解しています。1つのアプリケーションサービスで複数の集計を変更しないでください。 ただし、次のような場合の対処方法を教えてください。 Productsという集約ルートがあります。 グループと呼ばれる集約ルートもあります。 どちらにもIDがあり、個別に編集できます。 複数の製品が同じグループを指すことができます。 製品のグループを変更できるアプリケーションサービスがあります。 ProductService.ChangeProductGroup(string productId, string groupId) チェックグループが存在する リポジトリから製品を取得する グループを設定する 製品をリポジトリに書き戻す グループを削除できるアプリケーションサービスもあります。 GroupService.DeleteGroup(string groupId) 1. groupIdが提供されたgroupIdに設定されているリポジトリから製品を取得し、カウントが0または中止であることを確認します2.グループリポジトリからグループを削除します3.変更を保存します 私の質問は、次のシナリオです。 ProductService.ChangeProductGroupで、グループが存在することを確認し(存在する場合)、この確認の直後に、別のユーザーが(他のGroupService.DeleteGroupを介して)productGroupを削除します。この場合、削除されたばかりの製品への参照を設定しますか? これは、別のドメイン設計を使用する必要がある(必要に応じて追加の要素を追加する)か、トランザクションを使用する必要があるという点で、私の設計の欠陥ですか?

4
複数の異なるライブラリを使用する場合のコーディングスタイル
私は、いくつかのCライブラリを含むいくつかのライブラリを使用するいくつかのC ++コードに取り組んでいますが、それらはすべて異なるコーディングスタイルを持っています。使用可能な段階に達すると、オープンソースになります。コードをチェックアウトして1つのバグを修正したり、1つの機能を追加したりする短期間の寄稿者の混乱を最小限に抑えるのはどれですか。 使用されるライブラリの一般的なコーディングスタイルと一致しない場合がある場合でも、アプリケーション全体で1つの一貫したコーディングスタイルを使用します。 ライブラリが特定のモジュールで頻繁に使用される場合、そのモジュールのそのライブラリの一般的なコーディングスタイル(ライブラリの独自のコードやドキュメントで使用されているコーディングスタイル)に準拠します。 私の考えでは、後者を使用すると、その特定のライブラリーの専門家が1回限りの貢献をしやすくなり、開発中にチュートリアル/サンプルコードを組み込むのが容易になります。ただし、アプリケーション全体でコーディングスタイルに一貫性がなくなります。各アプローチの長所と短所は何ですか?

2
Scalaでの自己型と特性継承の違いは何ですか?
グーグルドすると、このトピックに対する多くの回答が出てきます。しかし、これらの2つの機能の違いをうまく説明しているようには思えません。もう一度試してみたいのですが、具体的には... 継承ではなく自己型でできること、およびその逆は何ですか? 私には、2つの間に定量化可能な物理的な違いがあるはずです。そうでなければ、それらは名目上異なるだけです。 特性AがBまたは自己型Bを拡張する場合、どちらもBであることは要件であることを示していませんか?違いはどこですか?

4
ビッグデータが機能する必要があるのはなぜですか?
最近、インターンシップのためにビッグデータに関連する新しいプロジェクトに取り組み始めました。私のマネージャーは関数型プログラミングの学習を始めることを推奨しました(彼らはScalaを強く推奨しました)。私はF#を使ってささやかな経験をしましたが、このプログラミングパラダイムを使用することの重要性を理解できませんでした。 ディーンはこのトピックについて興味深い話をし、ここで「ビッグデータ」を使用する理由についての彼の考えを共有しました:http : //www.youtube.com/watch?v=DFAdLCqDbLQ しかし、ビッグデータは意味がないので、あまり便利ではありませんでしたHadoopのみ。 BigDataは非常にあいまいな概念なので。しばらく忘れます。私は、データを処理するときにさまざまな側面を比較するための1つの簡単な例を考え出して、機能的な方法が高価であるかどうかを確認しました。関数型プログラミングが小さなデータに対して高価でメモリを消費する場合、なぜビッグデータに関数型プログラミングが必要なのですか? 派手なツールから遠く離れて、私は3つのアプローチを使用して1つの特定の人気のある問題の解決策を構築しようとしました:命令的な方法と機能的な方法(再帰、コレクションの使用)。時間と複雑さを比較して、3つのアプローチを比較しました。 Scalaを使用してこれらの関数を記述しました。3つのパラダイムを使用してアルゴリズムを記述するのに最適なツールだからです。 def main(args: Array[String]) { val start = System.currentTimeMillis() // Fibonacci_P val s = Fibonacci_P(400000000) val end = System.currentTimeMillis() println("Functional way: \n the Fibonacci sequence whose values do not exceed four million : %d \n Time : %d ".format(s, end - start)) val …

3
サイド影響のあるPUTを使用しています(REST)
ユーザーがフォームを更新するたびに元に戻す履歴を作成したい。更新なので、PUTリクエストを使用したいと思います。ただし、PUTには副作用が必要ないことを読みました。 ここでPUTを使用することは許容されますか?より良い代替案はありますか? PUT /person/F02E395A235 { time: 1234567, fields: { name: 'John', age: '41' } } サーバー内 doPut('person/:personId', // create a new person snapshot ) 編集: 履歴はユーザーに表示され、複数回呼び出すと複数のバージョンになります。 解決策は、バージョンを作成する前にバージョンが一意であるかどうかを確認することでした。

4
REST APIがファサードデザインパターンに従っていない理由
REST [api]構造とOOモデルを比較すると、次のような類似点があります。 どちらも: データ指向ですか REST =リソース OO =オブジェクト データを取り巻く操作 REST =リソースをVERBS(Get、Postなど)で囲みます OO =カプセル化によってオブジェクトの周りの操作を促進する ただし、適切なOOプラクティスは、たとえばファサードパターンを適用しようとするときにREST APIに常に依存しているわけではありません。RESTでは、すべてのリクエストを処理する1つのコントローラーがなく、内部オブジェクトの複雑さを隠しません。 それどころか、RESTは、少なくとも2つの形式で、リソースとその他のすべての関係のリソース公開を促進します。 リソース階層関係を介して(id 43の連絡先はアドレス453で構成されます): /api/contacts/43/addresses/453 REST json応答のリンクを介して: >> GET /api/contacts/43 << HTTP Response { id: 43, ... addresses: [{ id: 453, ... }], links: [{ favoriteAddress: { id: 453 } }] } OOに戻ると、ファサードの設計パターンLow Couplingは、objectAとその「objectBクライアント」の間、およびHigh CohesionこのobjectAとその内部オブジェクト構成(objectC、objectD)を尊重します。とをObjectAのインターフェースは、これは、許可に制限の影響に現像剤をObjectBのObjectAに(内部変化ObjectCに及びobjectD長いほど)、ObjectAにする API(操作)が依然として尊重されます。 …
9 http  rest  definition 

1
リレーショナル代数/計算の証明を使用してSQLをテスト/検証できますか?
SQLステートメント、関数、およびストアドプロシージャの正当性をテスト/検証するために、証明の形式でリレーショナル代数および/またはリレーショナル計算を使用することは可能ですか、それとも可能ですか? 少なくともそれは可能であるように思えますが、証拠とコードの間の1:1マッピングを不正確にする欠落している詳細があるかどうかはわかりません。 このような方法を試した人はいますか?うまくいきましたか?どのような体験をしましたか?

3
オンラインでサポートを受けた場合、これを自分のプロジェクトとして正当に主張できますか?[閉まっている]
休業。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善してみませんか?この投稿を編集して、事実と引用で回答できるように質問を更新してください。 4年前休業。 基本的に、Pythonでのネットワークプログラミングは初めてなので、オンラインでチュートリアルを調べてみました。チュートリアルで説明した内容(ソケットの作成、ポートへの接続など)を使用して、2つのコンピューターが互いにメッセージを送信できるプログラムを作成するようにコードを変更しました。 私が仕事に応募して面接担当者にこれを見せたとしたら、そのコードは技術的に私のものでしょうか?コードをそれほど変更しなかったと言っても過言ではありません。しかし、たとえば、2人のユーザーが異なるPCから互いにプレイする三目並べゲームのようなものに変更した場合、コードは私のものになりますか?私は盗作者のようになりたくないので、なぜ私は尋ねるのですか?

1
「悪いリンゴ」アルゴリズム、またはプロセスが共有サンドボックスをクラッシュさせる
次の問題を処理するためのアルゴリズムを探しています。これは(今のところ)「悪いリンゴ」アルゴリズムと呼んでいます。 問題 M個のサンドボックスでN個のプロセスを実行しています。N>> Mです。 各プロセスに独自のサンドボックスを与えることは実際的ではありません。 これらのプロセスの少なくとも1つが正しく動作せず、サンドボックス全体を停止させているため、同じサンドボックス内の他のすべてのプロセスが強制終了されています。 単一の不適切な動作のプロセスである場合は、単純な二分法を使用して、プロセスの半分を1つのサンドボックスに入れ、残りの半分を別のサンドボックスに入れて、不正なものが見つかるまで続けます。 質問 場合は、複数のプロセスがひどく行儀である-彼らはしているという可能性を含め、すべてのひどく行儀-この素朴なアルゴリズム「仕事」をしますか?いくつかの賢明な範囲内で動作することが保証されていますか? 簡略化 議論のために、悪いプロセスがサンドボックスを瞬時にダウンさせ、良いプロセスが決してダウンさせないと仮定しましょう。

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