ソフトウェア工学

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

4
ルックアップテーブル:ドメインモデルのリークですか?
あなたは会社を追跡するシステムを構築しています。これらの企業には連絡先があります。これらの連絡先は、請求/支払い、販売、注文、カスタマーサポートなど、特定の種類の質問にのみ回答する専門家であることがよくあります。 ドメイン駆動設計とオニオンアーキテクチャを使用して、これを次のタイプでモデル化しました。 会社 連絡先あり 連絡先 連絡先タイプがあります ContactType(列挙型) CompanyRepository(インターフェース) EFCompanyRepository(外部アセンブリで定義、EntityFrameworkを使用、CompanyRepositoryを実装) 私たちのチームは、このアプリケーションのデータベースをモデル化する方法について意見が分かれています。 サイドA:リーンDDDers: 連絡先に有効なContactTypeを定義するのはドメインの仕事です。不明なContactTypesが保存されていないことを検証するためにデータベースにテーブルを追加することは、リークのあるドメインの兆候です。ロジックが広すぎます。 静的テーブルをデータベースと対応するコードに追加することは無駄です。このアプリケーションでは、データベースが1つの問題を解決します。問題を永続化し、それを私に返します。追加のテーブルと対応するCRUDコードを書くのは無駄です。 永続化の戦略を変更することは可能な限り簡単でなければなりません。そのビジネスルールを変更する可能性が高くなります。SQL Serverのコストが高すぎると判断した場合、スキーマに入力したすべての検証を再構築する必要はありません。 サイドB:伝統主義者[それはおそらく公平な名前ではありません。DBCentrists?]: コードを読み取らなければ意味のないデータをデータベースに置くことは悪い考えです。レポートやその他の消費者は、値のリスト自体を繰り返す必要があります。 オンデマンドでdbタイプの辞書をロードするためのコードはそれほど多くありません。心配しないでください。 このソースがデータではなくコードである場合、変更時に単純なSQLスクリプトではなくビットを展開する必要があります。 どちらも正しいか間違っているかではありませんが、そのうちの1つはおそらく長期的にはより効率的であり、初期開発、バグなどの開発時間を数えます。このスタイルのコードを書く他のチームは何をしますか?

2
Javaで入力を取得するためにスキャナークラスのインスタンスが必要なのはなぜですか?
Javaはオブジェクト指向ですが、入力を得るためにスキャナークラスからオブジェクトを作成する必要があるのはなぜですか?next()たとえば、メソッドを静的にすることはできませんか? Cは、あなたがscanf()、gets()またはを使用するだけなので、かなりシンプルに見えますfgets()。Java開発者がScannerクラスを作成する理由は確かにありますが、通常の関数を使用するだけで作業を行うよりもどのように優れているのでしょうか。 同じ質問をしているように見えるかもしれないこのリンクを見つけましたが、答えはちょうど約です 「静的ではないため、オブジェクトを作成する必要があります」... 私の推測では、Javaはオブジェクト指向であるため、すべてのインプットメソッドをクラスに入れることにしました。それらは静的メソッドを実行しなかったので、さまざまなオブジェクトにあらゆる種類のさまざまなソース(キーボード入力、ファイル入力...)を含めることができますか? 誰かが質問を編集して、より明確に聞こえるようにしていただければ幸いです!

5
ビューは検証を実行すべきではありませんか?
「MVCでモデルが検証を処理する必要がありますか?」と読んでいたのは、検証ロジックがMVC Webサイトのどこにあるのか知りたいからです。上位回答の1行は次のようになります。「コントローラーは検証を処理し、モデルは検証を処理する必要があります。」 私はそれが好きでしたが、なぜビューでデータ検証を行わないのか、いくつかの理由で疑問に思いました。 ビューは通常、堅牢な検証サポート(JSライブラリ、HTML5タグ)を備えています ビューはローカルで検証できるため、ネットワークIOを削減できます UIはすでにデータタイプ(日付のカレンダー、数値のスピナー)を考慮して設計されているため、検証から1つの小さなステップになっています 複数の場所で検証することは、責任を分離するというMVCの概念に反するため、「両方で実行する」ことは不適切に思われます。コントローラでのみデータ検証を行うことは、本当に主要なアプローチですか?
10 architecture  mvc 

3
多対多の深い関係を管理するための設計パターンはありますか?
複数のアプリケーションで作業しているこのデータパターンを定義するのに問題があります。 それはで構成されています: 多くのオブジェクト自体で構成されるオブジェクトタイプ 2番目のオブジェクトタイプ。各インスタンスは最初のオブジェクトの「多く」を持っています また、最初のオブジェクトの各サブオブジェクトは、2番目のオブジェクトタイプへの関連付けごとに変更できます。 簡単な例は次のとおりです。 一連のレッスンで構成されるプログラミングコース レッスンはセットの割り当てで構成されています。 コースを学生に割り当てることができます。 ただし、コースが生徒に割り当てられると、各レッスンや課題は、削除や追加を行って、元のコースが認識できなくなる可能性があるまで、その生徒に合わせてカスタマイズできます。 私の解決策では、これにより次のような結果になります。 コースを生徒に割り当てると、コースはメモリにロードされます。次に、各サブオブジェクトについて、適切なメタデータを使用して生徒/サブオブジェクト関係オブジェクトが生成されます。基本的に、元のオブジェクトをテンプレートとして使用して、必要なカスタマイズ可能なオブジェクトを生成しています。 これにより、サブオブジェクトがより複雑になり、番号が付けられるため、大量のデータが生成されます。このデータパターンを操作するために必要なロジック/複雑さの量を減らすための最適化またはパターンがあるかどうかと思います。

2
ビューはモデルについてどの程度知っておくべきですか?
WPFのpythonラッパーとDAGサポートを使用して、pythonでアプリケーションを構築しています。私は現在、データとビューの間でやり取りする一貫した方法を決定する必要があるところにいます。 私が見る限り、現在2つの明白な解決策があります。 1つ目は、Androidアプリケーションの構造に似ています。ビューを設定/移入するコントローラーがあります。したがって、コントローラーはビューを所有し、表示されるプリミティブデータのみをプッシュします。ビューは単なるダム層であり、何が起こっているのか、そのデータがどこから来ているのかはわかりません。そして、ユーザーがビューを操作すると、コントローラーにコールバックが送信されます(登録されている場合)。 UserInfoController.py userInfoView = UserInfoView() userInfoView.onGenderChangedCallback = self.onGenderChangedCallback userInfoView.setUserGenderValue(user.getGender()) UserInfoView.py def setUserGenderValue(self, gender): self.userGender = gender def getView(self): return ui.Label(self.userGender, onEditCallback=self.onGenderChangedCallback) 2つ目は、モデルの(参照)をビューに渡し、ビューにデータを取得および更新させることです。ビューにはモデルが含まれているため、コントローラへの追加のコールバックなしでモデルを更新できます。 UserInfoViewModel.py self.gender = 'Male' UserInfoView.py def getView(self): return ui.Label(self.ViewModel().getGender(), onEdited=self.genderEdited) def genderEdited(self, newValue): self.ViewModel().setGender(newValue) だから私が求めているのは、非常に原始的なデータを渡してビューをできるだけ一般的なものにして、コールバックを操作してコントローラーでビジネス固有の処理を行うべきかどうかです。 または、モデル全体をビューに渡して、ビューでモデルを直接更新できるようにする必要があります。つまり、入力するコードが少なくなります。 PS。コードを判断しないでください-それは単に視覚化のためです。 編集: また追加する -このアプリケーションは、ダックタイピングをサポートするpythonで記述されます。つまり、2番目のアプローチでは、モデルが必要なインターフェースを満たす限り、ビューは再利用可能です。
10 model  view 

3
モデル駆動ソフトウェアエンジニアリング(MDSE)とは正確には何ですか?
今日、私はinfoqでMDSEという頭字語に出会いましたが、その情報は非常に不明確で、説明には流行語がたくさんありました。 MDSEは、要件、アーキテクチャー、および設計情報が(情報「エントロピー」の観点から)最大限に整理され、保持される抽象化のレベルでソフトウェアエンジニアが作業できるようにすることを目的としています。(これを「設計作業成果物」と呼びます)。さらに、MDSEは、主に「設計作業成果物」の用語を設計の検証および検証する手段をエンジニアに提供する必要があります そして、どうやら、誰もがそれをやっています:(再び記事から) MDSE時代の幕開けです。今後5〜10年で、MDSEへの大幅なシフトが見られます。この期間の終わりまでに、ソフトウェアの60〜80%がモデルベースの手法を使用して設計されると私は信じています。 MDSEとは何か、流行語のない具体的な説明をお願いします。90年代のRational Roseのように、UMLボックスを描画してコードを生成していますか? (その間、誰かがそれらの技法を使用して生成されたソフトウェアの例を持っている場合、私は本当に具体的な例を見たいです)。

4
構成を通じてインターフェースを実装するクラスのボイラープレートを削減する
:私はクラスの持っているA、小さなクラスの数の複合体であるB、CとD。 B、C、およびDインターフェースを実装IB、ICおよびIDそれぞれ。 以来Aのすべての機能をサポートB、CおよびD、A実装IB、ICおよびID同様に、しかし、多くのこの残念ながらリードの実装で再ルーティングA そのようです: interface IB { int Foo {get;} } public class B : IB { public int Foo {get {return 5;}} } interface IC { void Bar(); } public class C : IC { public void Bar() { } } interface ID { string Bash{get; set;} } public …

3
メンバー:一意のIDとドメインオブジェクトを使用する
ここで、メソッド/関数パラメーターとしてドメインオブジェクトまたは一意のIDを使用する必要があるかどうかに関するいくつかの有用な回答の後、IDとドメインオブジェクトをメソッドパラメーターとして使用します。これをカバーします)。一意のIDをメンバーとして使用するか、オブジェクトをメンバーとして使用することの長所と短所は何ですか。私はScala / C#/ Javaのような強く型付けされた言語を参照して尋ねています。持っておくべき(1) User( id: Int, CurrentlyReadingBooksId: List[Int]) Book( id: Int, LoanedToId: Int ) または(2)、(1)より優先:通過後:すべてのタイプを定義する必要がありますか? User( id: UserId, CurrentlyReadingBooksId: List[ BookId] ) Book( id: BookId, LoanedToId: UserId ) または(3) User( id: Int, CurrentlyReadingBooks: List[Book]) Book( id: Int, LoanedTo: User) オブジェクト(3)を持つメリットは考えられませんが、ID(2)および(1)を持つメリットの1つは、DBからUserオブジェクトを作成するときにBookオブジェクトを作成する必要がないことです。次に、Userオブジェクト自体に依存し、無限のチェーンを作成します。RDBMSとNo-SQLの両方でこの問題に対する一般的な解決策はありますか(それらが異なる場合)? これまでのいくつかの回答に基づいて、私の質問を言い換えると:(ラップされたタイプであるはずのIDを使用して)1)常にIDを使用しますか?2)常にオブジェクトを使用しますか?3)シリアライズとデシリアライズで再帰のリスクがある場合はIDを使用しますが、それ以外の場合はオブジェクトを使用しますか?4)他に何かありますか? 編集:オブジェクトを常にまたは一部のケースで使用する必要があると答える場合は、他の回答者が投稿した最大の懸念に必ず答えてください=> DBからデータを取得する方法

1
ソーシャルネットワーク通知システム
バックグラウンド 私はいくつかのソーシャルネットワーキング機能を含むクライアント向けのアプリに取り組んでいます。私はもともとモバイルフロントエンドを開発していましたが、バックエンドの開発も担当する状況でした。 一般的な背景として、私たちのシステムでは、ソーシャルネットワークから期待されるように、ユーザーが他のユーザーをフォローし、フォローしているユーザーに関する通知を受け取ることができます。注意すべき点は、ほんの数サブセット(せいぜい数百人)のユーザーのみがフォローできることであり、ほとんどのユーザーベースはこれらの個人の少なくとも1人をフォローしていると予想されます。 UI側には、番号が付いた通知ボタンがあり、ボタンをクリックすると通知画面に移動します。 問題 私は、通知を実装するための戦略と、データベースに1つ以上の通知テーブルを作成するために見つけたほとんどのリソースを調査してきました。(私が好む例はここで受け入れられた答えです:https : //stackoverflow.com/questions/9735578/building-a-notification-system)。 私を後押ししているのは、通知に関するほとんどのデータベース駆動型の戦略では、各フォロワーの通知ごとに行を挿入する必要があるということです。したがって、1,000人がSallyをフォローしている場合、対応するテーブルに1,000行を挿入します。それはスケーラブルですか?数万人または数十万人のユーザーがサリーをフォローしていて、彼女が1日に数十の投稿を作成している場合はどうなりますか? 私の元のアイデアはクエリですべてを処理することでした:通知ボタンの数は、最後に通知画面にアクセスしたときより最近投稿されたコンテンツの行数を要求することによって取得され、個々の通知はより詳細なクエリから生成されます通知画面にアクセスしたとき。このアプローチでは、書き込みや追加のストレージは必要ありませんが、柔軟性がなく、サーバーをかなり難しくします。 セットアップ (前の開発者によって確立された)バックエンドは、CodeIgniterとMySQLデータベースを使用します。現在、くだらないGoDaddy共有ホスティングアカウントで実行されていますが、本稼働に入る前にアップグレードされると思います(希望ですか?)。ホスティングパッケージは、ユーザーの増加に合わせてスケーリングされます。 現在、私たちのフロントエンドはモバイルアプリのみですが、後でウェブサイトも構築する予定です。現時点では、サーバーから通知に関するリアルタイムのプッシュ更新を取得することに関心はありません。 補遺 私はバックエンドに特化しておらず、私はその部門の頭の中にいます。クライアントはそれを知っており、私はこの種のプロジェクトの範囲を説明するために最善を尽くしましたが、現時点では他の誰もプロジェクトに取り組むことを信頼しないことを明確にしています。テスターの追加を開始する前に、あと1か月の作業が必要であり、あらゆる種類のパフォーマンスメトリックを取得できます。ユーザー数や今後5年間に使用するハードウェアを実際に見積もることはできませんが、クライアントは数十万人以上のユーザーを望んでいると思います。 これがここに投稿される問題の具体的な内容であることを願っています。必要に応じて調整できます。ご不明な点がある場合や、重要な詳細を省略している場合は、お問い合わせください。 tl; dr すべてのユーザーが同じ数百人の何人かしかフォローしていない場合、データベース主導の通知システムは長期的なスケーラビリティにマイナスの影響を及ぼしますか? フォロワーごとに通知ごとに個別の通知行を必要とせずに、通知をデータベース主導にする方法はありますか? 完全にクエリ駆動型の通知システムはスケーラブルですか、それともDBにデータを書き込まない以外に利点がありますか? 私はこれを早すぎると思いすぎていますか?クライアントが限られた予算であり、最終製品が人気があるかどうかまだわからないので、今のところ機能するものを構築するだけで問題が発生した場合に最適化を検討できますか?

1
ファーストクラスの継続は、最新のオブジェクト指向プログラミング言語で役立ちますか?
継続はCont、命令型コードの単純で規則的な表記を可能にするため、関数型プログラミング言語(Haskell のモナドなど)では非常に便利です。また、欠落している言語機能(例外、コルーチン、グリーンスレッドなど)の実装に使用できるため、一部の古い命令型言語でも役立ちます。しかし、これらの機能のために建てられたサポート付きのモダンなオブジェクト指向言語のためにも(かどうか、より現代的なスタイル区切られたファーストクラスの継続のためのサポートを追加するためにどのような引数があるだろうresetとshiftか、スキームのようなcall-with-current-continuation)? パフォーマンスと実装の複雑さ以外のサポートを追加することに反対する議論はありますか?

2
割り当てなしで状態を維持する
関数型プログラミングを学んでいて、割り当てを使用せずに特定のシナリオを実装する方法を理解できません。次の簡単な問題は、私の混乱をかなり要約しています。 特定のデータ構造の変更に関するイベントを受け取り、このデータ構造が特定の状態に達したときにイベントを発行するプログラムを記述します。 だから私は維持しているデータ構造のコピーを持っています datastructure_copy::DataStructure 変化したときに発生するイベントのストリームがあります。 datastructure_changes::Stream Change データ構造に変更を適用して新しいコピーを返す関数があります。 apply_change::Change -> DataStructure -> DataStructure そして、データの状態が目的の状態に達したかどうかをチェックする述語があります。 is_ready::DataStructure ->Boolean つまり、ストリームで機能する「reduce」のようなものが必要です。 これを実装する1つの方法は、変更が到着するたびに状態を再計算することですが、これは実際的ではないようです。私はStateモナドで少し遊んでみましたが、別の問題を解決することを意図しているように見えます。 それを行う別の方法はありますか? 私の質問は純粋に概念的なものであり、Haskellにはあまり詳しくありません。

2
HTTPリクエスト/レスポンスオブジェクトは不変である必要がありますか?
ほとんどのWebアプリケーションは要求/応答パラダイムに基づいていると言っても安全だと思います。PHPは、これらのオブジェクトを正式に抽象化したことがありません。1つのグループがこれを変更しようとしています:https : //github.com/php-fig/fig-standards/blob/master/proposed/http-message.md しかし、彼らは不変性の問題についてはある程度傍受された。一方では、要求/応答オブジェクトは通常、ライフサイクル中にほとんど変更を必要としません。一方、特に応答オブジェクトでは、多くの場合、HTTPヘッダーを追加する必要があります。 さらに、不変性がPHPの世界で実際に使用されたことはありません。 不変の要求/応答オブジェクトを使用すると、どのような利点がありますか jsonオブジェクトを返すとします。 $response = new JsonResponse($item); 素敵でシンプル。しかし、要求はクロスオリジンリソースシェアリング(CORS)要求であることがわかりました。応答を生成するコードは気にする必要はありませんが、下流のどこかに、必要なAccess-Controlヘッダーを追加するプロセスがあります。元の応答を維持し、追加のヘッダーを使用して新しい応答を作成する利点はありますか?それとも厳密にはプログラミングスタイルの問題です。 リクエストオブジェクトはもう少し興味深いです。同じように始まります: $request = new Request('incoming request information including uri and headers'); 初期情報を変更する必要はありません。ただし、リクエストが渡されると、処理情報を追加する必要が生じることがよくあります。たとえば、特定のリクエストに対して実行するアクションを決定するURLマッチャーがあるとします。 $request->setAttribute('action',function() {}); 実際にアクションを実行するのは、下流プロセスの責任です。不変の要求をラップする変更可能なRequestAttributesCollectionを使用することもできますが、実際には少し扱いに​​くい傾向があります。また、属性コレクションを除いて、不変のリクエストを持つこともできます。例外も扱いにくい傾向があります。この種の要件に対処した経験はありますか?

1
Pythonで例外をサブクラス化する必要があるのはいつですか?
私のコードでは、例外を発生させる場所が約7箇所あります。これらの例外はすべて同じように扱われます。エラーをログファイルに出力し、ソフトウェアの状態をデフォルトに戻して終了します。 コードのレビュー中に、私が高く評価している上級エンジニアは、これらの例外をすべてサブクラス化する必要があると述べました。彼の主張は、将来的には例外を別の方法で処理したいと思うかもしれず、それはより簡単になるでしょう。 私の主張は、現時点ではコードが雑然としているだけであり、例外を別の方法で処理するかどうかがわからないため、コードを簡潔にしておきます。 。 いずれの場合も議論はありますか。

3
他のオープンソースプログラムのクローズドソースモジュールでクラスターサイズを制限する
私は、高性能コンピューティングに大きく依存している学術研究機関で働いています。10年の間に、非常に評価され、非常に大きなクラスターで実行できる独自のFortranコードを開発しました。より大きな研究コミュニティがコードから利益を得るために、それをオープンソースにすることを検討しています。しかし、私たちの資金はコードで実行できる研究に大きく依存しているので、私たちは一種の足を踏みにじることになります。 アイデアの1つは、コードを実行できるCPUの数を制限することです。たとえば、使用する100,000ではなく最大1000 CPUです。このようにして、グローバルな研究コミュニティはコードから利益を得ることができますが、実行できる問題の規模には有利になります。 そのような機能は概念的に可能ですか?そして、そのような機能はどのように実装できますか?基本的に、完全なコードをオープンソース化したいが、並列化を(MPIを使用して)固定数のMPIスレッドに制限します。たとえば、(クローズドソース)モジュールを使用します。

4
Pythonジェネレータと関数が「def」キーワードを共有するのはなぜですか?
以下を検討してください。 def some_function(): return 1 def some_generator(): yield 1 上記のコードでsome_functionは、は関数some_generatorですが、はジェネレーターです。それらは非常に似ています。 コードを読み取るときに発生する問題は、「関数」のすべての行をスキャンして、yield実際に関数なのかジェネレータなのかを判断する前に、キーワードを探す必要があることです。 ジェネレーターに別のキーワードを使用する方が理にかなっているように思えます、例えば: gen some_generator(): yield 1 defジェネレータと関数の両方にキーワードを使用するメリットは何ですか?関数とジェネレータを分離するために新しいキーワードが導入されていないのはなぜですか?

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