ソフトウェア工学

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

1
制御の反転は依存関係の反転とどのように関連していますか
Web上の多くの記事では、制御の反転と依存関係の反転の原則という用語が混同され、同義語として使用されているように見えます(さらに混乱は、「DIコンテナー」と「IoCコンテナー」と呼ばれるツールによって強制されます)。ウィキペディアの記事は、IoCがDIと同じではないことを説明しようとする素晴らしい仕事をしています。 制御の反転(IoC)は、コンピュータープログラムのカスタム記述部分が汎用の再利用可能なライブラリから制御のフローを受け取る設計を表します したがって、DIPは、モジュールを具体的な実装ではなく抽象化に依存させることです。 IoCは、プログラムフローを別のモジュールに制御することを目的としています。このモジュールで実行できることの1つは、実行時に依存関係を解決することです。 この違いは公平に思えますが、依存関係の解決以外のIoC原則の他のアプリケーションについて誰も言及していません。ウィキペディアの定義は非常に広範であり、その構成といくつかの内部ロジックに基づいてカスタムコードを呼び出すことができるモジュールを使用すると、さらに多くのことができるようです。 それで、私がまだまだ理解できないいくつかの質問があります: IoCとDIPの実際の関係は何ですか?IoCは常にDIPを実装する手段として機能しますか? 依存関係を解決するためのツールがDIコンテナーとIoCコンテナーの両方と呼ばれるのはなぜですか?これは、DIとIoCが同じものであることを意味します。 注:この質問はDIとIoCの違いは何ですか。後者は依存関係のインバージョンではなく、依存関係の注入について質問するためです。

3
「アプリケーションモデル」とは何ですか?
現在、私は.NET Coreを研究しています。.NETCoreを最初に紹介した初期のドキュメントでは、さまざまな分野について話していることがわかります。これはこの写真のように見えます: すべての業種で、ランタイム、フレームワークが表示されますが、この「アプリモデル」も存在します。 また、.NET Core CLIに関するビデオを見ると、「DNXには独自のアプリケーションモデルがあり」、「。NET Core CLIは、クロスプラットフォームの.NETライブラリとコンソールアプリケーション開発のための単一の.NETアプリケーションモデルを作成する」とも言われました。 私の質問は次のとおりです。この「アプリケーションモデル」とは何ですか。実際にはどのようなアプリケーションモデルがあり、具体的には何が作られていますか?

1
依存性注入にPythonのメソッド解決順序を使用する-これは悪いことですか?
私はレイモンドヘッティンガーのPyconの講演「スーパー考慮スーパー」を見て、クラスの「親」クラスを決定論的な方法で線形化するPythonのMRO(メソッド解決順序)について少し学びました。これを使用して、以下のコードのように、依存性注入を行うことができます。だから今は当然、super何にでも使いたい! 次の例では、Userクラスは、LoggingServiceとの両方から継承することで、依存関係を宣言していUserServiceます。これは特に特別なことではありません。興味深いのは、メソッド解決順序を使用して、単体テスト中に依存関係を模擬できることです。以下のコードは、モックしたいメソッドのMockUserService継承UserServiceと実装を提供するを作成します。以下の例では、の実装を提供していますvalidate_credentials。へのMockUserService呼び出しを処理validate_credentialsするにUserServiceは、MROの前に配置する必要があります。これは、User呼び出されるラッパークラスを作成し、MockUserそれをUserand から継承させることで行われMockUserServiceます。 これを実行するMockUser.authenticateと、次に、への呼び出しがメソッド解決順序のsuper().validate_credentials() MockUserService前UserServiceにあり、validate_credentialsこの実装の具体的な実装が提供されるため、これが使用されます。いいですね- UserService単体テストでうまく模倣しました。UserServiceコストのかかるネットワークやデータベースの呼び出しが発生する可能性があることを考慮してください。これにより、レイテンシ係数が削除されました。また、UserServiceライブ/製品データに触れるリスクもありません。 class LoggingService(object): """ Just a contrived logging class for demonstration purposes """ def log_error(self, error): pass class UserService(object): """ Provide a method to authenticate the user by performing some expensive DB or network operation. """ def validate_credentials(self, username, password): print('> UserService::validate_credentials') return username == …

2
不変データを持つ言語で二重にリンクされたデータ構造または循環データ構造に操作を実装するための回避策
Haskellでグラフを作成してローカル操作を行う方法を学びたいのですが、問題はHaskellに固有のものではなく、グラフの代わりに二重リンクリストを検討することもできます。 質問: 主に不変のデータ構造(Haskell、Clojureなど)をサポートおよび推奨する言語で、二重リンクリスト(または他の二重リンクまたは循環データ構造)とその操作を実装する慣用的または推奨される方法は何ですか? ?特に、言語で正式に禁止されているインプレース更新の使用方法は? 二重にリンクされたリストでローカル操作を実行した場合(アイテムが挿入された場合など)、言語の遅延により、リスト全体をすぐにコピーする必要がない場合があることは容易に想像できます。ただし、リストは二重にリンクされているため、1か所で変更された場合、リストの新しいバージョンで古いノードを使用することはできず、何らかの方法でマーク、コピー、ガベージコレクションを行う必要があります。 。リストの更新されたコピーのみを使用する場合、これらは明らかに冗長な操作ですが、リストのサイズに比例した「オーバーヘッド」が追加されます。 これは、そのようなタスクでは不変データが単に不適切であり、可変データを「ネイティブ」でサポートしていない関数型宣言言語は、命令型言語ほど優れていないことを意味しますか?または、トリッキーな回避策はありますか? PS私はインターネットでこの主題に関するいくつかの記事やプレゼンテーションを見つけましたが、それらをフォローするのに苦労しましたが、この質問への答えは1段落以上、そしておそらく図を取るべきではないと思います...つまり、もしあればこの問題に対する「機能的な」解決策はありません。答えは「Cを使用する」でしょう。ある場合、それはどれほど複雑になる可能性がありますか? 関連する質問 「関数型プログラミングのデータ構造」。非効率的な代替手段の代わりにインプレース更新を使用することについての私の特定の質問はそこでは議論されていません。 「永続的データ構造の内部変異」。ここでは、不特定の言語での低レベルの実装に重点が置かれているようですが、私の質問は、言語(関数型またはその他)の正しい選択と、関数型言語で可能な慣用的な解決策についてです。 関連する引用 純粋に関数型のプログラミング言語では、多くのアルゴリズムを非常に簡潔に表現できますが、その場で更新可能な状態が重要な役割を果たすと思われるアルゴリズムがいくつかあります。これらのアルゴリズムの場合、更新可能な状態がない純粋に関数型の言語は本質的に非効率的であるように見えます([Ponder、McGeer and Ng、1988])。 -John LaunchburyおよびSimon Peyton Jones、レイジー機能状態スレッド(1994)、John LaunchburyおよびSimon Peyton Jones、Haskell州(1995)。これらの論文STでは、Haskellのモナディック型コンストラクタを紹介しています。

2
ハイブリッドIonicアプリと通常のモバイルWebサイト間でのangularJSコード共有
さて、私たちの「イノベーションラボ」では、ネイティブアクセス用にCordovaの上に構築されたハイブリッドアプリフレームワークであるIonicと、「Webコード」用のangularJSを使用するよう求めています。 たとえば、レスポンシブデザインにAngular +ブートストラップを使用する、純粋なモバイルWebプロジェクトもあります。 重要なのは、今後のプロジェクトによっては、モバイルWebサイトとネイティブアプリ(イオンハイブリッド)の両方が必要になるということです。ほとんどの機能と画面は同じで、バックエンドとほとんどのUIを共有していますが、それでもいくつかの違いがあります。 だから私の質問です。イオンプロジェクトと2つの異なる展開アプローチを使用した通常の角度のあるWebサイトの両方になるようにプロジェクトを構築する方法。ほとんどのコードが再利用されていますが、モバイルWebサイトの一部のビューとハイブリッドアプリの一部のビュー(より多くのネイティブコンポーネントと規則を使用)、ルーティングの違いもある可能性があります。 それは良い考えですか? そして、共有コードで、あなたがどちらの場合であるかを知る簡単な方法はありますか?一部のIF、一部のディレクティブはコンテキスト外では非アクティブなど 私が気付かないかもしれないある種のミッシングリンクがあるように感じます。 前もって感謝します。

2
オブジェクト指向の遅延バインディング
ではオブジェクト指向のアラン・ケイズ定義が部分的に私は理解していないことを、この定義は次のとおりです。 私にとってOOPとは、メッセージング、ローカルでの保持と状態プロセスの保護と非表示、およびすべてのものの極端なLateBindingのみを意味します。 しかし、「LateBinding」とはどういう意味ですか?これをC#などの言語に適用するにはどうすればよいですか?そして、なぜこれがそれほど重要なのでしょうか?

9
スタックポインターが何であるかは理解していますが、何に使用されますか?
スタックポインターはスタックの先頭を指し、スタックの先頭には、 "LIFO"ベースと呼ばれるデータが格納されています。他の誰かの類推を盗むために、それはあなたが一番上に皿を置いて取る皿の積み重ねのようなものです。スタックポインターOTOHは、スタックの一番上の「皿」を指します。少なくとも、x86についてはそうです。 しかし、なぜコンピュータ/プログラムはスタックポインタが指しているものを「気にする」のでしょうか。言い換えれば、スタックポインターを持っていること、およびそれが機能する場所を知っていることの目的は何ですか? Cプログラマが理解できる説明をいただければ幸いです。
11 stack  x86 

1
C ++の静的グローバルと匿名名前空間
後者を導入するときに、C ++が静的グローバル(内部リンケージ)と名前のない名前空間のシンボル(外部リンケージですが、外部から参照する方法がない)を区別したのはなぜですか? これらの理由のいずれかがまだ有効ですか、それとも新しい理由がありますか? それらがまだ異なる場所が残っていますか?しかし、匿名グローバル(または名前空間スコープ)ユニオンはである必要staticがあるという任意のルール、およびそれらは何ですか? ボーナスポイントに関して、それらが異なる理由が残っていない場合、それらを同等にするリクエストはありますか? C ++が名前空間(C ++ 98)、特に名前のない名前空間を導入したとき、静的グローバルは陳腐化し、熱意の中で新しいものよりも劣っていたが、C ++ 11で元に戻された: staticキーワードの廃止…もういや? C ++ 11より前は、内部リンケージのあるシンボルをテンプレート引数として使用できませんでした。C++ 03が外部リンケージを持つためにテンプレートパラメーターを必要とするのはなぜですか。

1
2人のチームのプルリクエストの紹介-自分のリクエストをマージしますか?
私はジュニアチームメンバー(生協)にgitを紹介しています。 追加、コミット、プッシュ、プルの基本的な操作に慣れています。 次に、プルリクエストとブランチにそれらを紹介したいと思います。 ブランチでプルリクエストを実行し始めた場合、進行中の作業にも同じことをする必要がありますか? プルリクエストをマージするのは私です。ブランチで作業するのが最も理にかなっているかどうかはわかりませんでした(通常、私は知っている良い習慣ですが、2人の開発者が1人のジュニアといるこの特定の状況に興味があります)そしてもしそうなら、私は自分のブランチをマスターにマージするだけだということを意味します。とにかく自分の仕事/ブランチのプルリクエストを行うこともできますか?通常、これらの変更には基本的なgithub機能分岐ワークフローを使用します:https : //www.atlassian.com/git/tutorials/comparing-workflows/feature-branch-workflow 私が唯一の開発者である場合、自分のリポジトリでプルリクエストを使用する目的はありますか?便利ですが、それほど具体的ではありません。 プロジェクトに2人での作業の流れはいただきました!また、より一般的なようです そして 公式リポジトリまたは私のフォークのブランチからプルリクエストを開く必要がありますか?フォークについてのようです。

1
「この一連の材料でどのレシピを作成できるか」に答えるためのアルゴリズム/データ構造
正式には、s(U、Q)= { V | V ∈ UとV ⊆ Q } U、Q、およびVがすべてのセットを表し、Uは、より具体的には、セットの集合を表します。例として、Uはクックブックのさまざまなレシピに必要な材料のセット(セット)であり、Qは材料のセットを表し、Vはそれらの材料で作成できるレシピを表します。クエリs(U、Q)「これらの成分で何が作れるのか」という質問に対応します 私が探しているインデックスというデータ表現であるU、それはの効率的なクエリをサポートするような方法で、Sを(U、Qは)ここで、QとのすべてのメンバーUは、一般的に、すべてのメンバーの組合に比べて小さくなりますU。さらに、Uを効率的に更新できるようにしたい(たとえば、レシピの追加または削除)。 私はこの問題をよく理解する必要があると思わずにはいられませんが、名前やリファレンスを見つけることができませんでした。これを効率的に解決するための戦略、または私がそれについてもっと読むことができる場所を誰かが知っていますか? 解決策について考える限り、私が持っていたのは、集合Uの決定木を構築することでした。ツリーの各ノードで、「成分リストにxが含まれていますか?」という質問 回答によって排除されるUのメンバーの数を最大化するためにxを選択して尋ねられます。Uが更新され、この決定木は、正しい結果を見つけるために必要な質問の数を最小限にするために再バランスする必要があります。もう1つの考えは、n次元のブール「オクトリー」(nは一意の成分の数)のようなものでUを表すことです。 「これらの成分でどんなレシピが作れるの?」クックブック内の(必要な成分のセット)レシピのデカルト積を、ある成分のパワーセットで取得し、両方の要素が等しいペアの結果として順序付けられたペアをフィルタリングすることで応答できますが、これは効率的な解決策、そして私が求めているのは、この種の操作を最適化する方法です。効率的になるようにSQLでこれをどのように構成し、これを効率的にするためにSQLで何ができるのでしょうか。 私はレシピと食材のセットのクックブックのイラストを使用していますが、「レシピ」の数と「食材」の数は非常に多くなると予想します(それぞれ数十万まで)。ただし、食材の数は特定のレシピでは、特定の材料セットの材料の数は比較的少なくなります(通常、「レシピ」の場合は約10-50、一般的な「材料セット」の場合は約100)。さらに、最も一般的な操作はクエリs(U、Q)であるため、最も最適なはずです。これはまた、すべてのレシピをチェックしたり、すべての材料を操作したりする必要があるブルートフォースアルゴリズムは、それだけでは望ましくないほど遅くなることを意味します。巧妙なキャッシングで、

2
(基本的な)SQLクエリは、意味的に高次関数と同等ですか?
SQLは基本的にマップ+フォールド+フィルターのドメイン固有のインスタンスですか? 次のSQLのようです: SELECT name FROM fruits WHERE calories < 100 これは、次のマップ+フィルター+折りたたみ操作の構文糖です。 var fruits = [{id : 1, name: 'orange', calories : 100}, {id : 2, name : 'banana', calories : 150}, {id : 3, name: 'apple', calories : '50'}]; fruits.map(function(fruit) { return { name : fruit.name, calories : fruit.calories }) …

2
クラスに共通のデータベース接続を配置する場所
データベースにオブジェクトを保存したり、データベースからオブジェクトを取得したりするクラス(リポジトリ)がいくつかあります。それらすべてが1つのデータベースへの接続を確立する必要があります。 各クラスでConnectionStringとを再定義しないようにSqlConnection、オープン接続をそれらに渡すことを考えました。次に、その接続を定義/オープンしてクラスに渡すのに最適な場所/時間はいつ/どこですか? この共通のリソースにアクセスするためのより良いアプローチ/パターンはありますか?
11 c#  sql  class-design 

6
リンクされた値が常に合計100%であるXパーセントスライダーを表示するUIのアルゴリズム
私が構築しているシステムには、0〜100のスケールを持つ一連のUIスライダー(数値は異なります)が含まれています。スライダーとは、ボリュームコントロールのように、要素をつかんで上下にドラッグするUIを意味します。それらは常に合計100になるようにアルゴリズムで接続されています。そのため、1つのスライダーが上に移動すると、他のスライダーはすべて下に移動し、最終的にゼロになります。1つが下に移動すると、他は上に移動します。常に合計は100でなければなりません。したがって、ここのスライダーにはさまざまな値がありますが、合計は100%です。 ----O------ 40 O---------- 0 --O-------- 20 --O-------- 20 --O-------- 20 最初のスライダーが40から70に上に移動した場合、他のスライダーは値を下に移動する必要があります(スライダーをドラッグするときに)。3つのスライダーは20から10に変更され、1つは低くできないためゼロのままでした。 -------O--- 70 O---------- 0 -O--------- 10 -O--------- 10 -O--------- 10 もちろん、スライダーが0または100に達すると、それ以上移動できなくなります。これは、私の頭が実際に痛むところです。したがって、スライダーが高くなると、他のスライダーは低くなりますが、スライダーのいずれかがゼロに達すると、まだゼロに達していない残りのスライダーだけが低く移動できます。 この質問は実装ではなくアルゴリズムに固有なので、ここで私はこれを尋ねています。FWIWプラットフォームはAndroid Javaですが、特に関係はありません。 最初の刺し傷で行ったアプローチは、移動したスライダーの変化率を計算することでした。次に、その変更を分割し、それを(他の方向に)他のスライダーの値に適用しました。ただし、問題は、パーセンテージと乗算を使用することにより、いずれかのスライダーがゼロになった場合、ゼロから再び増加させることはできないということです。その結果、個々のスライダーがゼロで動かなくなります。丸めの問題を回避するために0〜1,000,000の範囲のスライダーを使用しましたが、これは役立つようですが、すべてのシナリオを適切に処理するアルゴリズムをまだ作成していません。
11 algorithms  gui  ui 

5
偽の値とnull、未定義、または空の文字列
私は長年jQueryを使用してきました。しかし、最近、私はJavaScript言語に深く関わっています。最近、私は「真実」と偽の値について聞いたことがあります。しかし、私はそれらを完全に理解していません。現在、次のようなコードがあります。 var fields = options.fields || ['id', 'query']; フィールドがnullであるか、未定義であるか、または長さが0であるかを識別する必要があります。これを行うには長い道のりがあります。 if ((fields === null) || (fields === undefined) || (fields.length === 0)) { ... } 私の質問は、以下は同じです: if (!fields) { ... }
11 javascript 

4
サーバーでXMLを解析するか、プロキシを提供して、ブラウザで解析する必要がありますか?
サードパーティのAPIとのインターフェースが必要です。このAPIを使用して、エンドユーザーのブラウザー内からGET要求を作成し、XML応答を受信します。このデータは、ユーザーがデータを検索したり、決定に使用したりできるブラウザーベースのアプリケーションで使用されます。主な問題は、ほとんどのブラウザーがクロスドメインXMLの使用を制限しているため、単純に取得できないことです。 APIからのXML。 ただし、全体的なデータは基本的に2つのセットに分かれています。 最初のデータセットは公開されており、頻繁に更新する必要があるだけなので、サーバー側のすべてのユーザーがキャッシュできるため、トラフィックが大幅に軽減されます。 2番目のデータセットはプライベートであり、各ユーザーに個別です。このデータは、APIでもより頻繁に更新されます。これにより、キャッシュの効果が大幅に低下します。 スケーラビリティの理由から、サーバーの負荷をできるだけ小さくしたいと思います。 私の前に2つのオプションが表示されます。 XMLリクエストをサードパーティのサーバーにルーティングし、クライアントとサードパーティのAPIの間で直接やり取りするために使用できるプロキシを提供します。 サーバーにXMLからJSONへの変換を実行させ、不要な情報を削除します。これは基本的に、サーバー用の新しいAPIを作成することを意味します。これは、サードパーティAPIからのリクエストに変換されます ユーザーにデータを提供するための最良の方法は何ですか?(2つのオプションのいずれかである必要はありません)
11 javascript  api  xml  websites  json 

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